脚注を自動的に処理してくれるプラグイン

  • 投稿日:
  • by
  • カテゴリ:

脚注を記述できる MovableType プラグイン:Footnote - Open MagicVox.net

私は結構脚注(※1)を使うんだけど、今まではずっと手動で記事末尾や段落の下に書き入れてた。

でも、それだと後で注釈が増えたときに番号を付け直さないと行けなかったり、本文と脚注が同じような見た目で分かりづらかったりして、いろいろと面倒。

そこで、いいプラグインがないか探してみたところ、上記の「Footnote」を発見。

早速これを導入してテンプレートを書き換え。

あとは、Movable Typeの編集画面でHTML編集モードに切り替え(※2)、<footnote>(~)<footnote>で囲めばOK。

専用タグは<fn>も使えるけど、なんとなく「function」を連想してしまうので、私は長い方を使うことにした。

また、footnoteタグ内直下の丸括弧は、上記の「Footnote」紹介記事にも書いてあるように、万一記事がプラグインで処理されなかったとき(RSSなど)の退行措置(※3)。

ところで、実はこの記事でも使ってるけど、本文側に脚注がある場合、記事ページでは問題ないけど、インデックスページで問題が出てしまう。

具体的には、「Footnote」プラグインは同一ページ内に脚注を置く場合にしか対応していないため、インデックスページの脚注が処理されても記事ページ末尾にある脚注にリンクできない。

そこで、プラグイン自体に少し手を入れて、第3引数に記事URLを指定できるように改造(※4)。

(以下、変更したgather_footnote部分のみ抜粋)

### Filter - gather_footnote
MT::Template::Context->add_global_filter (gather_footnote => sub {
    my ($text, $format, $ctx) = @_;

    my $footnotes = $ctx->stash ($MYNAME. q{::footnotes}) || [];
    if (ref $format ne 'ARRAY') {
        $format = [ '%s', $format, '' ];
    }else{
        $format = [ $format->[0], $format->[1], $format->[2] ];
    }
    if (lc($format->[1]) eq 'reset') {
        $footnotes = [];
        my $pagefile = $format->[2];
        $format = $ctx->stash ($MYNAME. qq{::format})
            or return "$MYNAME: No format";
        $format = [ $format->[0], $format->[1], $pagefile ];
    }

    $ctx->stash ($MYNAME. qq{::format}, $format);

    $text =~ s!<($tag)>\(?(.*?)\)?</\1>!sub {
        push @$footnotes, $_[0];
        my $index = scalar @$footnotes;
        my $idattr = "";
        if ($format->[2] eq ""){
          $idattr = " id=\"$refer\"";
        }
        sprintf $format->[0],
            sprintf qq{<a title="%s"$idattr href="$format->[2]#$anchor">$format->[1]</a>},
                MT::Util::encode_html (MT::Util::remove_html($_[0])), $index,$index, $index;
    }->($2)!ge;
    $ctx->stash ($MYNAME. qq{::footnotes}, $footnotes);
    $text;
});

これで、無事インデックスでも脚注が使えるようになった。

ところで、元のソースの37~44行目にある

    if (ref $format ne 'ARRAY') {
        $format = [ '%s', $format ];
        if (lc $format eq 'reset') {
            $footnotes = [];
            $format = $ctx->stash ($MYNAME. qq{::format})
                or return "$MYNAME: No format";
        }
    }

の部分だけど、これだともしかして「reset」パラメータが使えないんじゃ...?バグ?

  1. ※1:こんな感じで、*や※を使って本文外に注釈・補足を付けること。もとは印刷用語らしい
  2. ※2:MT6.2で「リッチテキスト」を使っている場合、エディタの右上のほうにある「</>」マークを押すと切り替えられる
  3. ※3:単純に無効なタグとして処理されても、括弧が残ることで読みやすい
  4. ※4:ついでにHTML5 obsoleteなAタグのname属性をid属性に変更