Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

divタグの利用

TracでWikiを書いているときに、例えばこんな注意書きを入れたい場合とかありますよね。
div-msg

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

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プロセッサを使う訳です。

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

・・・めんどくさい

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

DivHelperPlugin

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 というマクロが使えるようになります。これを使うと、上のがこう書けるようになります。

[[cdev(msg-devil, '''試験に出るよ!!!''')]]

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

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

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

[[div_devil('''試験に出るよ!!!''')]]

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

応用

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

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

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

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

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

[[span_red(赤色の文字だよ)]]

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away