CodeRepos の Trac みたいに browser ページに repository へのリンクをつける

CodeReposTrac みたいに browser ページのメニューに repository へのリンクをつけたくなったのでやってみる。

Trac 0.10 限定です。

template (clearsilver) で参照しているページが browser ページなのか判断するようにして、メニューにリンクを追加するのは javascript でやるようにしました。(CtxtnavAddPlugin というメニューにリンクを追加するための plugin があるがあえて使わない)

次のようなのを {TRACENV}/templates/site_footer.cs に書いておきます。svn_base の部分は個々の環境に合わせて変えてください。

<?cs if:browser.path || log.path || ticket.id ?>
<script type="text/javascript">//<![CDATA[
(function() {
    var svn_base = 'http://example.com/svn/';   // repository の URL

    function add_ctxtnav(label, url) {
        var d = document;
        var element = d.getElementById('ctxtnav');
        var ul = element.getElementsByTagName('ul');
        if (ul.length == 0) {
            ul = d.createElement('ul');
            element.appendChild(ul);
        }
        else {
            ul = ul[0];
        }
        var lists = ul.getElementsByTagName('li');
        var list;
        if (lists.length != 0) {
            list = lists[lists.length - 1];
            list.className = list.className.replace(/\blast\b/g, '');
        }
        list = d.createElement('li');
        list.className = lists.length == 0 ? 'first last' : 'last';
        var anchor = d.createElement('a');
        anchor.href = url;
        anchor.appendChild(d.createTextNode(label));
        list.appendChild(anchor);
        ul.appendChild(list);
    }
<?cs if:browser.path || log.path ?>
    add_ctxtnav('Repository Location', encodeURI(svn_base + "<?cs
        var:js_escape(project.shortname) ?><?cs var:js_escape(args.path) ?>"));
<?cs /if ?>
<?cs if:ticket.id ?>
    if (document.referrer.indexOf(location.protocol + '//' + location.host) == 0
        && /\/report\/\d+/.exec(document.referrer))
    {
        add_ctxtnav('Back to Report', document.referrer);
    }
<?cs /if ?>
})();
//]]></script>
<?cs /if ?>

これで browser ページとついでに log ページを見たときに Repository Location というリンクが表示されるようになります。

さらに report ページから ticket ページを見たときに、元の report ページに戻るためのリンクも追加。

Trac プロジェクトの各ディレクトリごとに templates/site_footer.cs を書くのはだるいので、デフォルトの template ディレクトリにだけ site_footer.cs を置くようにして各々の Trac プロジェクトにある templates/site_footer.cs は削除しています。

デフォルトの template ディレクトリは次のような感じで確認できます。

$ python -c 'from trac.config import default_dir; print default_dir("templates")'
/usr/share/trac/templates

0.11 の環境では、SvnUrlsPlugin - Trac Hacks - Plugins Macros etc. - Trac というのがあり、少し毛色が違いますが似たようなのがありますのでこちらをどうぞ (使ったことないのですが)。