def format(self, formatter, **kw): """ Send the text. """ _ = self._ if not self.request.cfg.allow_xslt: # use plain text parser if XSLT is not allowed # can be activated in wikiconfig.py from MoinMoin.parser.text import Parser as TextParser self.request.write(formatter.sysmsg(1) + formatter.rawHTML(_('XSLT option disabled, please look at HelpOnConfiguration.', wiki=True)) + formatter.sysmsg(0)) TextParser(self.raw, self.request).format(formatter) return try: # try importing Ft from 4suite # if import fails or its version is not 1.x, error msg from Ft.Xml import __version__ as ft_version assert ft_version.startswith('1.') except (ImportError, AssertionError): self.request.write(self.request.formatter.sysmsg(1) + self.request.formatter.text(_('XSLT processing is not available, please install 4suite 1.x.')) + self.request.formatter.sysmsg(0)) else: from Ft.Lib import Uri from Ft.Xml import InputSource from Ft.Xml.Xslt.Processor import Processor from Ft import FtException msg = None try: # location of SchemeRegisteryResolver has changed since 1.0a4 if ft_version >= "1.0a4" or ft_version == "1.0" or ("1.0.1" <= ft_version <= "1.0.9"): # such version numbers suck! import Ft.Lib.Resolvers # Do not remove! it looks unused, but breaks when removed!!! class MoinResolver(Uri.SchemeRegistryResolver): """ supports resolving self.base_uri for actual pages in MoinMoin """ def __init__(self, handlers, base_scheme): Uri.SchemeRegistryResolver.__init__(self, handlers) self.supportedSchemes.append(base_scheme) # setting up vars for xslt Processor out_file = StringIO.StringIO() wiki_resolver = MoinResolver( handlers={self.base_scheme: self._resolve_page, }, base_scheme=self.base_scheme) input_factory = InputSource.InputSourceFactory(resolver=wiki_resolver) page_uri = self.base_uri + wikiutil.url_quote(formatter.page.page_name) # 4Suite needs an utf-8 encoded byte string instead of an unicode object raw = self.raw.strip().encode('utf-8') self.processor = Processor() self.append_stylesheet() # hook, for extending this parser self.processor.run( input_factory.fromString(raw, uri=page_uri), outputStream=out_file) # Convert utf-8 encoded byte string into unicode result = out_file.getvalue().decode('utf-8') result = self.parse_result(result) # hook, for extending this parser except FtException, msg: etype = "XSLT" except Uri.UriException, msg: etype = "XSLT"
def format(self, formatter): """ Send the text. """ _ = self._ if not self.request.cfg.allow_xslt: # use plain text parser if XSLT is not allowed # can be activated in wikiconfig.py from MoinMoin.parser.text import Parser as TextParser self.request.write( formatter.sysmsg(1) + formatter.rawHTML( _('XSLT option disabled, please look at HelpOnConfiguration.', wiki=True)) + formatter.sysmsg(0)) TextParser(self.raw, self.request).format(formatter) return try: # try importing Ft from 4suite # if import fails or its version is not 1.x, error msg from Ft.Xml import __version__ as ft_version assert ft_version.startswith('1.') except (ImportError, AssertionError): self.request.write( self.request.formatter.sysmsg(1) + self.request.formatter.text( _('XSLT processing is not available, please install 4suite 1.x.' )) + self.request.formatter.sysmsg(0)) else: from Ft.Lib import Uri from Ft.Xml import InputSource from Ft.Xml.Xslt.Processor import Processor from Ft import FtException msg = None try: # location of SchemeRegisteryResolver has changed since 1.0a4 if ft_version >= "1.0a4" or ft_version == "1.0" or ( "1.0.1" <= ft_version <= "1.0.9"): # such version numbers suck! import Ft.Lib.Resolvers # Do not remove! it looks unused, but breaks when removed!!! class MoinResolver(Uri.SchemeRegistryResolver): """ supports resolving self.base_uri for actual pages in MoinMoin """ def __init__(self, handlers, base_scheme): Uri.SchemeRegistryResolver.__init__(self, handlers) self.supportedSchemes.append(base_scheme) # setting up vars for xslt Processor out_file = StringIO.StringIO() wiki_resolver = MoinResolver(handlers={ self.base_scheme: self._resolve_page, }, base_scheme=self.base_scheme) input_factory = InputSource.InputSourceFactory( resolver=wiki_resolver) page_uri = self.base_uri + wikiutil.url_quote( formatter.page.page_name) # 4Suite needs an utf-8 encoded byte string instead of an unicode object raw = self.raw.strip().encode('utf-8') self.processor = Processor() self.append_stylesheet() # hook, for extending this parser self.processor.run(input_factory.fromString(raw, uri=page_uri), outputStream=out_file) # Convert utf-8 encoded byte string into unicode result = out_file.getvalue().decode('utf-8') result = self.parse_result( result) # hook, for extending this parser except FtException, msg: etype = "XSLT" except Uri.UriException, msg: etype = "XSLT"
def format(self, formatter): """ Send the text. """ _ = self._ if not self.request.cfg.allow_xslt: from MoinMoin.parser import plain self.request.write(formatter.sysmsg(1) + formatter.text(_('XSLT option disabled!'))+ formatter.sysmsg(0)) plain.Parser(self.raw, self.request).format(formatter) return arena = formatter.page key = 'xslt' cache = caching.CacheEntry(self.request, arena, key) if not cache.needsUpdate(formatter.page._text_filename()): self.request.write(cache.content()) self._add_refresh(formatter, cache, arena, key) return try: # assert we have 4Suite 1.x available from Ft.Xml import __version__ as ft_version assert ft_version.startswith('1.') except (ImportError, AssertionError): self.request.write(self.request.formatter.sysmsg(1) + self.request.formatter.text(_('XSLT processing is not available!')) + self.request.formatter.sysmsg(0)) else: import xml.sax from Ft.Lib import Uri from Ft.Xml import InputSource from Ft.Xml.Xslt.Processor import Processor processor = Processor() msg = None try: base_uri = u'wiki://Self/' # patch broken 4Suite 1.0a1 (announces as "1.0a") # 1.0a3 ("1.0a3") is broken, too # thus, I assume 1.0a2 is also broken and announces either as "1.0a" or "1.0a2", hopefully if ft_version not in ["1.0a", "1.0a2", "1.0a3", "1.0a4",]: # you can add more broken versions here MoinResolver = Uri.SchemeRegistryResolver else: if ft_version == "1.0a4": # 1.0a4 changes location of SchemeRegistryResolver from Ft.Lib import Resolvers SchemeRegistryResolverPATH = Resolvers.SchemeRegistryResolver else: SchemeRegistryResolverPATH = Uri.SchemeRegistryResolver class MoinResolver(SchemeRegistryResolverPATH): def normalize(self, uri, base): from Ft.Lib import Uri if ft_version == "1.0a4": GetSchemeFunc = Uri.GetScheme else: GetSchemeFunc = Uri._getScheme scheme = GetSchemeFunc(uri) if not scheme: if base: scheme = GetSchemeFunc(base) if not scheme: return Uri.BaseUriResolver.normalize(self, uri, base) else: uri = Uri.Absolutize(uri, base) if not uri: return base return uri wiki_resolver = MoinResolver() def _resolve_page(uri, base=None, Uri=Uri, base_uri=base_uri, resolver=wiki_resolver, request=self.request): """ Check whether uri is a valid pagename. """ if uri.startswith(base_uri): pagename = uri[len(base_uri):] page = Page.Page(request, pagename) if page.exists(): return StringIO.StringIO(page.get_raw_body()) else: raise Uri.UriException(Uri.UriException.RESOURCE_ERROR, uri, 'Page does not exist') return Uri.BaseUriResolver.resolve(resolver, uri, base) wiki_resolver.handlers = { 'wiki': _resolve_page, } out_file = StringIO.StringIO() input_factory = InputSource.InputSourceFactory(resolver=wiki_resolver) page_uri = u"%s%s" % (base_uri, formatter.page.page_name) processor.run(input_factory.fromString(self.raw, uri=page_uri), outputStream=out_file) result = out_file.getvalue() except xml.sax.SAXParseException, msg: etype = "SAX" except xml.sax.SAXException, msg: etype = "SAX"