Trac的内联模板扩展宏

时间:2014-08-27 14:48:15

标签: macros trac

用于Trac wiki的IncludMacro允许在调用[[Include(PageName)]]的页面中包含另一个wiki页面(或其他内容)。

我正在寻找一个模板扩展宏/机制,这将允许我拥有一个包含的模板页面(例如,这只是一个简单的例子):

= $(Title) =
This is a page with a title $(Title).

It is being maintained by $(Maintainer).

可以通过以下命令将其扩展到维基页面中:

[[ExpandTemplate(CommonPageHeader,Title=Page Title,Maintainer=First Last)]]

会导致" $(标题)"的所有实例被替换为" Page Title",与$(Maintainer)相同。

--- 2014-09-02编辑---

我希望在Trac 1.0中部署它。

http://trac-hacks.org/wiki/SearchForUltimateWikiTemplateMacro

可以找到我最终要做的更多细节(以及我的研究记录)。

3 个答案:

答案 0 :(得分:1)

对我而言,Trac的神奇之处在于你可以用比你描述它更少的代码行来实现这样的东西:

import string
from trac.wiki import *
from trac.wiki.macros import WikiMacroBase


class ExpandTemplateMacro(WikiMacroBase):
    def expand_macro(self, formatter, name, content, args):
        args, kw = parse_args(content)
        return format_to_html(self.env, formatter.context, string.Template(WikiPage(self.env, args[0]).text).safe_substitute(kw))

我认为这个单文件插件可以完成您在问题中描述的内容。这是一个更完整的版本(我自己使用的一个轻微变体):

import string
from trac.core import TracError
from trac.wiki.macros import WikiMacroBase
from trac.wiki.formatter import format_to_html
from trac.wiki.api import parse_args
from trac.wiki.model import WikiPage

def resolve_wiki_page_name(wiki, pagename, referrer_resource):
    referrer = ''
    if referrer_resource and referrer_resource.realm == 'wiki':
        referrer = referrer_resource.id
    if pagename.startswith('/'):
        pagename = pagename.lstrip('/')
    elif pagename.startswith('./') or pagename.startswith('../') \
                                   or pagename in ('.', '..'):
        pagename = wiki._resolve_relative_name(pagename, referrer)
    else:
        pagename = wiki._resolve_scoped_name(pagename, referrer)
    return pagename

class ExpandTemplateMacro(WikiMacroBase):
    """Expands another wiki page with template parameters.

    The first argument is the page name of another wiki page.

    Example:
    {{{
        [[ExpandTemplate(CommonPageHeader,Title=Page Title,Maintainer=First Last)]]
    }}}
    where the CommonPageHeader template wiki page contains:
    {{{
        = $Title =
        This is a page with a title $Title.

        It is being maintained by $Maintainer.
    }}}
    """

    def expand_macro(self, formatter, name, content, args):
        args, kw = parse_args(content)
        wiki = formatter.wiki
        pagename = resolve_wiki_page_name(wiki, args[0], formatter.resource) if args else ''
        if not (pagename and wiki.has_page(pagename) and
                'WIKI_VIEW' in formatter.perm('wiki', pagename)):
            raise TracError('wiki page not found')
        page = WikiPage(self.env, pagename)
        expanded = string.Template(page.text).safe_substitute(kw) 
        return format_to_html(self.env, formatter.context, expanded)

(另一个模糊的插件是http://trac-hacks.org/wiki/BoilerplatePlugin。这不是你想要的,但可能仍然很有趣......)

答案 1 :(得分:0)

我建议您查看PageVariableMacroParametrizedTemplatesPlugin。两者都不提供完整的解决方案,但实现了所请求功能的一部分。

答案 2 :(得分:0)

ParameterizedIncludeMacro在过去一天左右发布到trac-hacks.org。