예제 #1
0
 def _macro_formatter(self, match, fullmatch):
     name = fullmatch.group('macroname')
     if name in self.allowed_macros:
         # leapfrog the OneLinerFormatter
         return Formatter._macro_formatter(self, match, fullmatch)
     else:
         # use the OneLinerFormatter
         return OneLinerFormatter._macro_formatter(self, match, fullmatch)
    def expand_macro(self, formatter, name, args):
        """
        Return output that will be displayed in the Wiki content.

        @param name: the actual name of the macro
        @param args: the text enclosed in parenthesis at the call of the macro.
          Note that if there are ''no'' parenthesis (like in, e.g.
          [[ProjectVersion]]), then `args` is `None`.
        """
        text = self._expandText(args)

        out = StringIO()
        OneLinerFormatter(self.env, formatter.context).format(text, out)

        return Markup(out.getvalue())
예제 #3
0
 def formatter(self, env):
     return OneLinerFormatter(env)
예제 #4
0
파일: web_ui.py 프로젝트: starworldx/trac
    def _render_view(self, req, page):
        version = page.resource.version

        # Add registered converters
        if page.exists:
            for conversion in Mimeview(self.env) \
                              .get_supported_conversions('text/x-trac-wiki'):
                conversion_href = req.href.wiki(page.name, version=version,
                                                format=conversion.key)
                add_link(req, 'alternate', conversion_href, conversion.name,
                         conversion.in_mimetype)

        data = self._page_data(req, page)
        if page.name == self.START_PAGE:
            data['title'] = ''

        ws = WikiSystem(self.env)
        context = web_context(req, page.resource)
        higher, related = [], []
        if not page.exists:
            if 'WIKI_CREATE' not in req.perm(page.resource):
                raise ResourceNotFound(_("Page %(name)s not found",
                                         name=page.name))
            formatter = OneLinerFormatter(self.env, context)
            if '/' in page.name:
                parts = page.name.split('/')
                for i in xrange(len(parts) - 2, -1, -1):
                    name = '/'.join(parts[:i] + [parts[-1]])
                    if not ws.has_page(name):
                        higher.append(ws._format_link(formatter, 'wiki',
                                                      '/' + name, name, False))
            else:
                name = page.name
            name = name.lower()
            related = [each for each in ws.pages
                       if name in each.lower()
                          and 'WIKI_VIEW' in req.perm(self.realm, each)]
            related.sort()
            related = [ws._format_link(formatter, 'wiki', '/' + each, each,
                                       False)
                       for each in related]

        latest_page = WikiPage(self.env, page.name)

        prev_version = next_version = None
        if version:
            version = as_int(version, None)
            if version is not None:
                for hist in latest_page.get_history():
                    v = hist[0]
                    if v != version:
                        if v < version:
                            if not prev_version:
                                prev_version = v
                                break
                        else:
                            next_version = v

        prefix = self.PAGE_TEMPLATES_PREFIX
        templates = [template[len(prefix):]
                     for template in ws.get_pages(prefix)
                     if 'WIKI_VIEW' in req.perm(self.realm, template)]

        # -- prev/up/next links
        if prev_version:
            add_link(req, 'prev',
                     req.href.wiki(page.name, version=prev_version),
                     _("Version %(num)s", num=prev_version))

        parent = None
        if version:
            add_link(req, 'up', req.href.wiki(page.name, version=None),
                     _("View latest version"))
        elif '/' in page.name:
            parent = page.name[:page.name.rindex('/')]
            add_link(req, 'up', req.href.wiki(parent, version=None),
                     _("View parent page"))

        if next_version:
            add_link(req, 'next',
                     req.href.wiki(page.name, version=next_version),
                     _('Version %(num)s', num=next_version))

        # Add ctxtnav entries
        if version:
            prevnext_nav(req, _("Previous Version"), _("Next Version"),
                         _("View Latest Version"))
        else:
            if parent:
                add_ctxtnav(req, _('Up'), req.href.wiki(parent))
            self._wiki_ctxtnav(req, page)

        # Plugin content validation
        fields = {'text': page.text}
        for manipulator in self.page_manipulators:
            manipulator.prepare_wiki_page(req, page, fields)
        text = fields.get('text', '')

        data.update({
            'context': context,
            'text': text,
            'latest_version': latest_page.version,
            'attachments': AttachmentModule(self.env).attachment_data(context),
            'start_page': self.START_PAGE,
            'default_template': self.DEFAULT_PAGE_TEMPLATE,
            'templates': templates,
            'version': version,
            'higher': higher, 'related': related,
            'resourcepath_template': 'wiki_page_path.html',
            'fullwidth': req.session.get('wiki_fullwidth'),
        })
        add_script(req, 'common/js/wiki.js')
        return 'wiki_view.html', data
예제 #5
0
 def _make_link(self, namespace, target, *args):
     if namespace == 'wiki':
         self.lastlink = target
     return OneLinerFormatter._make_link(
         self, namespace, target, *args)
예제 #6
0
 def format_toc(self, wikitext):
     self.lastlink = None
     out = StringIO()
     OneLinerFormatter.format(self, wikitext, out)
     return out.getvalue(), self.lastlink
예제 #7
0
 def __init__(self, env, ctx, allowed_macros=[]):
     OneLinerFormatter.__init__(self, env, ctx)
     self.lastlink = None
     self.allowed_macros = allowed_macros
예제 #8
0
 def formatter(self):
     return OneLinerFormatter(self.env)  # TODO: self.req
예제 #9
0
 def __init__(self, env, context):
     OneLinerFormatter.__init__(self, env, context)
     # use our own wiki parser
     self.wikiparser = WantedPagesWikiParser(self.env)