Trac wikiでdivタグをもっとかんたんに

##divタグの利用
TracでWikiを書いているときに、例えばこんな注意書きを入れたい場合とかありますよね。
![div-msg](http://gyazo.com/3e646683eb521887f1f6521f3a324c1f.png)

こういうのをどう書くかというと、あらかじめスタイルシートを用意しておいて、

```css:style.css
div[class|="msg"] {
    background-repeat: no-repeat;
    background-position: 5px 10px;
    border-top: solid 1px; 
    border-left: solid 10px; 
    padding: 3px 45px;
}
div.msg-devil {
    background-image: url("face-devilish.png");
    border-color: red;
}
```

divプロセッサを使う訳です。

```trac-wiki
{{{
#!div class="msg-devil"
'''試験に出るよ！！！'''
}}}
```

**・・・めんどくさい**

こんなかさばるのじゃなくて、こんな感じ `[[div(devil, '''試験に出るよ！！！''')]]` で１行で書きたいんですよ。
なので、簡単なプラグインを作りました。

##DivHelperPlugin

```python:web_ui.py
# -*- coding:utf8 -*-
from trac.core import *
from trac.config import ConfigSection
from trac.wiki import IWikiMacroProvider
from trac.wiki.formatter import system_message
from trac.wiki.formatter import WikiProcessor
from trac.wiki.parser import parse_processor_args

class DivHelperPlugin(Component):
    "undocumented"
    implements (IWikiMacroProvider)

    _section = ConfigSection('divhelper', 'undocumented')
    _prefixes = {"div": "div-alias.", "span": "span-alias."}
    
    def get_macros(self):
        yield "cdiv"
        yield "cspan"
        for name, value in self._section.options():
            for pname, prefix in self._prefixes.items():
                if name.startswith(prefix):
                    yield pname + '_' + name[len(prefix):]

    def get_macro_description(self, name):
        return 'undocumented : %s' % name

    def expand_macro(self, formatter, name, content, args = None):
        if name in ("cdiv", "cspan"):
            try:
                clsname, content = content.split(",", 1)
                pname = name[1:]
                pargs = {"class": clsname}
                content = content.strip()
            except:
                return system_message("%s: invalid args (%s)" % (name, content))
        else:
            pname, alias = name.split("_", 1)
            key = self._prefixes[pname] + alias
            pargs = parse_processor_args(self._section.get(key))

        p = WikiProcessor(formatter, pname, pargs)
        return p.processor(content)
```

get_macro_descriptionあたりとか手抜きっぷりがヒドいですが・・・

###インストール
ソースはここにあるので、 `hg clone` して `python setup.py bdist_egg` するなり `python setup.py install` するなり。
https://bitbucket.org/iwata0303/tracdivhelper

あとは一般的なTracプラグインのインストール手順に従ってください。

Trac 1.0でしか動かしてません。0.12系なら動くと思うけど、どうだろう。

###使い方
インストールすると、 `cdev` というマクロが使えるようになります。これを使うと、上のがこう書けるようになります。

```trac-wiki
[[cdev(msg-devil, '''試験に出るよ！！！''')]]
```

また、あらかじめtrac.iniでこういうような設定を書いておけば、

```ini:trac.ini
[divhelper]
div-alias.devil = class="msg-devil"
```

もっと短く書けるようになります。

```trac-wiki
[[div_devil('''試験に出るよ！！！''')]]
```

※divタグの代わりにspanタグを使用するcspanというマクロもあります。iniファイルにエイリアスを書くときは `span-alias.xxx` になります。

####応用
例えば、文字色を赤色にしたいという場合、普通はColorMacroをインストールするか、spanマクロを使うかして、

```
[[Color(none, red, 赤色の文字だよ)]]
[[span(赤色の文字だよ, style=color:red)]]
```

とかするんですが、こういうのもこのプラグインで、

```ini:trac.ini
[divhelper]
span-alias.red = style="color:red"
```

もっとシンプルに書けるようになります。

```trac-wiki
[[span_red(赤色の文字だよ)]]
```

実質30行程度のプラグインでほとんど手間かかってない割に、これはなかなか便利ではないでしょうか :) (自画自賛)