wiki:WikiMacros

Trac マクロ

Trac マクロとは、 Python で書かれた 'カスタム関数' によって Trac の Wiki エンジンを拡張するプラグインです。 WikiFormatting エンジンが利用可能なあらゆるコンテキストにおいて、マクロを使用することによって、動的な HTML データが挿入されます。

もう 1 種類のマクロは WikiProcessors です。これは通常、 Wiki 以外のマークアップ形式と表示を取り扱うために使用し、多くは、 (ソースコードハイライトのような) より大きいブロックに使用します。

マクロの利用

マクロ呼び出しは、二つの 角括弧 (square brackets) で括られた箇所です。 Python 関数のように、マクロは引数を取ることができ、括弧 (parenthesis) の中に、カンマで区切ったリストで表記します。

詳細なヘルプを見るには

マクロの一覧と完全なヘルプは、 下記のマクロ一覧 にある MacroList マクロを使用してみることができます。

簡単なマクロ一覧は [[MacroList(*)]] や [[?]] で見ることができます。

特定のマクロの詳細なヘルプを参照したい場合は、 MacroList マクロに引数渡すことによって参照することができます。例) [[MacroList(MacroList)]] 。もしくは、便宜上、 [[MacroList?]] のようにマクロ名にクエスチョンマーク (?) をつけることでヘルプをみることができます。

利用例

'Trac' で始まる Wiki ページの最近の変更履歴 3 件分を表示するマクロです:

Wiki マークアップ 表示
[[RecentChanges(Trac,3)]]

[[RecentChanges?(Trac,3)]]

[[RecentChanges]]

最近更新されたすべてのページを最後に変更した日付でグループ化し、リストします。

このマクロは、 2 つの引数をとります。最初の引数はプレフィックスの文字列です: プレフィックスが指定された場合、結果のリストにはそのプレフィックスで始まるページのみが 含まれます。この引数が省略された場合は、すべてのページがリストされます。

2番目の引数は結果リストに表示するページの数を制限するために使用します。 例えば 5 に制限すると指定した場合、最近更新されたページのうち、新しいもの 5 件がリストに含まれます。

[[?]]

[[InterTrac]]

Provide a list of known InterTrac prefixes.

[[TitleIndex]]

すべての Wiki ページをアルファベットのリスト形式で出力に挿入します。 引数として、接頭辞となる文字列を許容します: 指定された場合、 …

[[RecentChanges]]

最近更新されたすべてのページを最後に変更した日付でグループ化し、リストします。 このマクロは、 2 …

[[PageOutline]]

現在の Wiki ページの構造的なアウトラインを表示します。 アウトラインのそれぞれの項目は一致する表題へのリンクとなります。 このマクロは 3 …

[[Image]]

画像を Wiki 形式のテキストに組み込みます。 1 番目の引数は、ファイル名を指定します。ファイルの指定は添付ファイルなど …

[[MacroList]]

インストールされている、すべての Wiki マクロをリストします。 もし利用可能ならばドキュメントも含みます。 …

[[TracIni]]

Trac の設定ファイルのドキュメントを生成します。 通常、このマクロは Wiki ページ TracIni の中で使用されます。 …

[[KnownMimeTypes]]

WikiProcessors で処理できる既知の mime-type を表示します。 引数が与えられた場合は、 mime-type …

[[TracGuideToc]]

Trac ガイドの目次を表示する。 このマクロは Help/Guide の目次 (ToC) を簡単かつ荒っぽく作成します。 この目次には …

[[TracAdminHelp]]

trac-admin コマンドのヘルプを表示します。 例: […]

[[TicketQuery]]

指定された条件にマッチするチケットを一覧表示します。 このマクロの引数はカンマ区切りのリストにした、 "key=value" 形式の …

[[RepositoryIndex]]

リポジトリ一覧を表示します。 format 引数を与えることができます (デフォルトは compact です) …

[[InterWiki]]

Provide a description list for the known InterWiki prefixes.

マクロ一覧

Note: 以下に示すリストはマクロドキュメントを含むものだけです。 -OO による最適化や、 mod_python での PythonOptimize オプションが設定されていると表示されません。

[[InterTrac]]

Provide a list of known InterTrac prefixes.

[[TitleIndex]]

すべての Wiki ページをアルファベットのリスト形式で出力に挿入します。

引数として、接頭辞となる文字列を許容します: 指定された場合、 生成されるリストにはページ名が接頭辞で始まるものだけが含まれます。 すべてのページがリストされます。 接頭辞が与えられた上で、第二引数に 'hideprefix' が与えられた場合、 出力からは接頭辞が除外されます。

この他、 format および depth などを名前付き引数として指定できます:

  • format=compact: ページ名をカンマ区切りのリストとして表示します。
  • format=group: 共通の接頭辞を持つページでリストを生成します。 また min=n の引数を使用することができ、 n にはリストを生成するページの最小数を指定します。
  • format=hierarchy: ページ名をパスとした階層構造で表示します。 このフォーマットでも min=n の引数を使用することができ、 n には階層を生成するページの最小数を指定します。
  • depth=n: リストするページの階層数を指定します。 0を指定した場合、トップレベルのページのみ表示され、 1を指定した場合、1代目の子ページが表示されます。 何も指定しない場合か、-1を指定した場合、 全てのページが階層構造により表示されます。

[[RecentChanges]]

最近更新されたすべてのページを最後に変更した日付でグループ化し、リストします。

このマクロは、 2 つの引数をとります。最初の引数はプレフィックスの文字列です: プレフィックスが指定された場合、結果のリストにはそのプレフィックスで始まるページのみが 含まれます。この引数が省略された場合は、すべてのページがリストされます。

2番目の引数は結果リストに表示するページの数を制限するために使用します。 例えば 5 に制限すると指定した場合、最近更新されたページのうち、新しいもの 5 件がリストに含まれます。

[[PageOutline]]

現在の Wiki ページの構造的なアウトラインを表示します。 アウトラインのそれぞれの項目は一致する表題へのリンクとなります。

このマクロは 3 つの任意のパラメータをとります:

  • 1 番目の引数はアウトラインに含まれる表題の範囲 (レベル) を設定することができ、 数または数の範囲をとります。 例えば、 "1" と指定した場合、アウトラインにはトップレベルの表題のみが表示されます。 "2-3" と指定した場合、アウトラインには、レベル 2 とレベル 3 のすべての表題が ネストしたリストとして表示されます。 デフォルトでは、すべてのレベルの表題が表示されます。
  • 2 番目の引数は、タイトルを特定するのに使われます。 (デフォルトはタイトルなし)
  • 3 番目の引数はアウトラインのスタイルを指定します。 inline または pullout を指定することができます (後者がデフォルトです) 。 inline スタイルでは、アウトラインをコンテンツの一部として整形しますが、 pullout スタイルでは、アウトラインをフローティングボックスに整形し、 コンテンツの右側に配置します。

[[Image]]

画像を Wiki 形式のテキストに組み込みます。

1 番目の引数は、ファイル名を指定します。ファイルの指定は添付ファイルなど 3つの指定方法があります:

  • module:id:file: module に wiki または ticket が指定すると、 その Wiki ページまたはチケットの添付ファイルで file とファイル名が ついているものを参照します。
  • id:file: 上記と同様ですが、 id はチケットの短い記述方法か、 Wiki ページ名を指定します。
  • file: 'file' というローカルの添付ファイルを指します。これはファイルが 添付されている Wiki ページまたはチケットの中でのみ使用できます。

またファイルはリポジトリのファイルも指定できます。 source:file シンタックスを使用します。 (source:file@rev も可能です)

直接 URL を記述することもできます; /file と記述すると、プロジェクトの ディレクトリからの相対パスになり、 //file と記述すると、サーバルートからの パスになります。また、 http://server/file ではファイルの絶対パスになります。

残りの引数は任意で、 <img> 要素を組み立てる際の属性を設定します:

  • 数字と単位は画像のサイズと解釈されます。 (ex. 120, 25%)
  • right, left, center, top, bottom, middle は画像の配置として 解釈されます。 (right, left, centeralign=... でも指定でき、 top, bottom, middlevalign=... でも指定できます)
  • link=some TracLinks... を指定すると、画像のソースへのリンクが、 TracLinks に置き換えられます。値なしで引数が指定された場合、 リンクは単に削除されます。
  • nolink は画像のソースへのリンクを作成しません。 (非推奨, link= を使用してください)
  • key=value スタイルは画像の HTML 属性または CSS スタイルの

指示として解釈されます。有効なキーは以下の通りです:

  • align, valign, border, width, height, alt, title, longdesc, class, margin, margin-(left,right,top,bottom), id, usemap
  • border, margin, margin-* は数値での指定のみ可能です。
  • margincenter によって自動計算されたマージンを上書きします。

例:

    [[Image(photo.jpg)]]                           # シンプルな指定方法
    [[Image(photo.jpg, 120px)]]                    # 画像の幅サイズ指定
    [[Image(photo.jpg, right)]]                    # キーワードによる配置指定
    [[Image(photo.jpg, nolink)]]                   # ソースへのリンクなし
    [[Image(photo.jpg, align=right)]]              # 属性による配置指定

他の wiki ページ、チケット、モジュールの画像を使用することができます。

    [[Image(OtherPage:foo.bmp)]]    # 現在のモジュールが Wiki の場合
    [[Image(base/sub:bar.bmp)]]     # 下位の Wiki ページから
    [[Image(#3:baz.bmp)]]           # #3というチケットを指している場合
    [[Image(ticket:36:boo.jpg)]]
    [[Image(source:/images/bee.jpg)]] # リポジトリから直接指定する!
    [[Image(htdocs:foo/bar.png)]]   # プロジェクトの htdocs ディレクトリにあるファイル

このマクロは Shun-ichi Goto <gotoh@…> さんが作成した Image.py が 元になっています

[[MacroList]]

インストールされている、すべての Wiki マクロをリストします。 もし利用可能ならばドキュメントも含みます。

非必須オプションとして、特定のマクロの名前を引数として渡すことが出来ます。 この場合、指定されたマクロのドキュメントだけを表示します。

Note: このマクロは mod_python の PythonOptimize オプションが有効になっている 場合は、マクロのドキュメントを表示することが出来ません!

[[TracIni]]

Trac の設定ファイルのドキュメントを生成します。

通常、このマクロは Wiki ページ TracIni の中で使用されます。 省略可能な引数にはコンフィグのセクションのフィルタ、 コンフィグのオプション名のフィルタを指定できます: フィルタで指定された文字列 で始まるコンフィグのセクションとオプション名のみが出力されます。

[[KnownMimeTypes]]

WikiProcessors で処理できる既知の mime-type を表示します。

引数が与えられた場合は、 mime-type へのフィルタとして作用します。

[[TracGuideToc]]

Trac ガイドの目次を表示する。

このマクロは Help/Guide の目次 (ToC) を簡単かつ荒っぽく作成します。 この目次には Trac* と WikiFormatting のページが含まれていますが、 カスタマイズはできません。目次をカスタマイズしたい場合は、 TocMacro を探してください。

[[TracAdminHelp]]

trac-admin コマンドのヘルプを表示します。

例:

[[TracAdminHelp]]               # 全てのコマンド
[[TracAdminHelp(wiki)]]         # 全ての wiki コマンド
[[TracAdminHelp(wiki export)]]  # "wiki export" コマンド
[[TracAdminHelp(upgrade)]]      # upgrade コマンド

[[TicketQuery]]

指定された条件にマッチするチケットを一覧表示します。

このマクロの引数はカンマ区切りのリストにした、 "key=value" 形式の キー付きパラメータを使用します。

key がフィールド名であった場合、 value は TracQuery#QueryLanguage で 定義されているような、フィルタを指定するシンタックスでなければなりません。 ? の文字で始まる query: リンク向けの簡素化した URL シンタックス とは 異なります 。フィールドの値としてカンマ (,) そのものを含む場合は バックスラッシュ (,) でエスケープする必要があります。

引数 or で区切られたフィルタのグループは、 OR 条件で結合されます。

このほか、フィルタとしていくつか名前付きパラメータを使用できます。 これらは検索結果をどのように表示するかを制御できます。すべて非必須です。

format はチケットのリストがどのように表示されるかを決定します:

  • list -- デフォルトの表示形式です。チケット ID と概要 (Summary) を 一覧表示します。 1 行ごとに 1 つのチケットを表示します。
  • compact -- チケット ID の一覧をカンマ区切りで 表示します。
  • count -- 条件に当てはまるチケットの件数のみが表示されます。
  • table -- カスタムクエリービューと似た形式で表示されます (ただし コントロールは表示されません)。

max は表示されるチケット数の上限値を指定します (デフォルトは 0 です。これは無制限を意味します)。

order はチケットを整列する列を指定します (デフォルトは id となっています)。

desc はチケットの整列を逆順に行うか指定します。 (デフォルトは false です)。

group はチケットをグループ化を指定します (デフォルトは何も設定されていません)。

groupdesc はグループの表示を逆順とするかを指定します (デフォルトは false となっています)。

verbose を true に設定すると、リストされたチケットの 各行にチケットの説明を表示します。これは table format 専用です。 このパラメータは廃止予定です。代わりに rows を使用してください。

rows パラメータは1行使って表示するフィールドを指定します。 rows=description|summary のように使用します。

Trac 0.10 との互換性のため、マクロは最終引数にキーなし引数が与えられた場合 format として解釈します。 また、フィールドセパレータに使用する "&" は (order を除いて) 現時点では動作しますが、この機能は廃止予定です。

[[RepositoryIndex]]

リポジトリ一覧を表示します。

format 引数を与えることができます (デフォルトは compact です)

  • compact はリポジトリのプレフィックスの名前をカンマ区切りの リストで表示します
  • list はリポジトリのプレフィックスの名前を、通常の記述の リストで表示します
  • table はリポジトリブラウザのトップページと同様の形式で 表形式で表示します

glob 引数が与えられた場合、リポジトリ名に対する glob 形式の フィルタとして作用します (デフォルトは '*' です)

(0.12 以降)

[[InterWiki]]

Provide a description list for the known InterWiki prefixes.

世界のマクロを共有

 Trac Hacks というサイトは、コミュニティに寄稿されたマクロと プラグイン を収集し提供しています。新しいマクロを探している、共有したいマクロを作成した、などの場合は遠慮なく Trac Hacks のサイトを訪問してください。

カスタムマクロを開発する

マクロは、 Trac 本体と同様  Python で書かれています。そして TracPlugins の一種として開発します

マクロの開発についての詳しい情報は  リソースの開発 を参照してください。

Trac 0.11 でマクロを作成する簡単な例を 2 つ紹介します。

古いマクロと新しいマクロの違いを示す例は  Timestamp.py を参照してください。また、古いマクロから新しいマクロに移行するための情報は  macros/README を参照してください。

引数なしのマクロ

下記のソースコードをテストするためには、このソースコードを timestamp_sample.py として保存し、 TracEnvironmentplugins/ に配置しなければなりません。

from datetime import datetime
# Note: since Trac 0.11, datetime objects are used internally

from genshi.builder import tag

from trac.util.datefmt import format_datetime, utc
from trac.wiki.macros import WikiMacroBase

class TimeStampMacro(WikiMacroBase):
    """Inserts the current time (in seconds) into the wiki page."""

    revision = "$Rev$"
    url = "$URL$"

    def expand_macro(self, formatter, name, text):
        t = datetime.now(utc)
        return tag.b(format_datetime(t, '%c'))

引数付きのマクロ

下記のソースコードをテストするためには、このソースコードを helloworld_sample.py として保存し、 TracEnvironmentplugins/ に配置しなければなりません。

from genshi.core import Markup

from trac.wiki.macros import WikiMacroBase

class HelloWorldMacro(WikiMacroBase):
    """Simple HelloWorld macro.

    Note that the name of the class is meaningful:
     - it must end with "Macro"
     - what comes before "Macro" ends up being the macro name

    The documentation of the class (i.e. what you're reading)
    will become the documentation of the macro, as shown by
    the !MacroList macro (usually used in the WikiMacros page).
    """

    revision = "$Rev$"
    url = "$URL$"

    def expand_macro(self, formatter, name, text, args):
        """Return some output that will be displayed in the Wiki content.

        `name` is the actual name of the macro (no surprise, here it'll be
        `'HelloWorld'`),
        `text` is the text enclosed in parenthesis at the call of the macro.
          Note that if there are ''no'' parenthesis (like in, e.g.
          [[HelloWorld]]), then `text` is `None`.
        `args` are the arguments passed when HelloWorld is called using a
        `#!HelloWorld` code block.
        """
        return 'Hello World, text = %s, args = %s' % \
            (Markup.escape(text), Markup.escape(repr(args)))

Note: expand_macro は 第4パラメータに、 args を任意に取ることもできます。 このマクロが WikiProcessor として呼ばれたとき、 key=value 形式の プロセッサパラメータ を渡すことも可能です。もし、このパラメータを指定したとき、これらの値は、ディクショナリの中に保存され、 追加の args パラメータによって渡されます。一方で、マクロとして呼び出されたときは、 args パラメータは、 None として扱われます (0.12 以降) 。

例として、このように記述した場合:

{{{#!HelloWorld style="polite"
<Hello World!>
}}}

{{{#!HelloWorld
<Hello World!>
}}}

[[HelloWorld(<Hello World!>)]]

結果はこのようになります:

Hello World, text = <Hello World!> , args = {'style': u'polite'}
Hello World, text = <Hello World!> , args = {}
Hello World, text = <Hello World!> , args = None

Note: expand_macro が返す値は、 HTML がエスケープされて いない ことに注意して下さい。期待する戻り値によっては、あなた自身でエスケープする必要があります (return Markup.escape(result) を使用できます)。また、戻り値として HTML が返ってくると分かっているならば、結果を (return Markup(result)) という風に Genshi が提供している Markup (from genshi.core import Markup) オブジェクトでラップすることもできます。

また、text を Wiki としてマークアップする場合、 Wiki Formatter (from trac.wiki import Formatter) オブジェクトも再帰的に使用することができます。以下がサンプルです:

    text = "whatever wiki markup you want, even containing other macros"
    # Convert Wiki markup to HTML, new style
    out = StringIO()
    Formatter(self.env, formatter.context).format(text, out)
    return Markup(out.getvalue())