ホーム >> 左脳Script >> Movable Type >> Plugin開発 >> コード表示用 Plugin

コード表示用 Plugin


マークアップコードは、そのまま<pre><code>で括っても、正しく表示されません。それを、ソースをそのままに mtプラグイン によって構築時に整形するプラグインを更に(主に自分が)使いやすく改良してみました。

easyTag for "easy maintenance of mark up code" 0.02+20090611

mtpretag20090611.PNG
Download → PreTag20090611.zip

ファイルは「PreTag.pl」1つです。解凍し、plugin ディレクトリに配置してください。


用法

基本的な用法は大きく変化はありません。

また、基本的に「記事の内部」で mtタグ の使用を要求する事が前提なので、EvalTemplate のような、記事の内部で mtタグ が使用できるようになるプラグインとの併用が条件となります。

  • <mt:PreTag>
    ブロックタグです。このタグに挟まれた記述は、コードとしてそのまま表示される事になります。

    前回のバージョンでは、内部に mtタグ が在ると正しく表示出来ませんでした(mtタグが展開されてしまっていた)が、今回のバージョンでは展開されずそのまま生のテキストとして表示出来る様になりました。

    指定できるパラメータは1つのみ。
    • tab
      内部に適応するタブスペース幅を指定できます。デフォルトは4文字です。

  • <mt:PreTagAttr>
    ブロックタグです。このタグには、<mt:PreTag>で表示されるコード中の、単語を装飾する為の指定(後述。<$mt:PreTagWord$>)が出来る様になります。

    この装飾の指定は、<mt:PreTagAttr>タグ内でのみ有効です。
    <mt:PreTag>を、<mt:PreTagAttr>に内包することにより、単語の装飾指定をコード表示に反映させる事が出来ます。

    <$mt:PreTagWord$>以外の記述は、普通に展開されます。
    同じ装飾指定を使いまわす場合は、その記述を全て<mt:PreTagAttr>に内包する必要があります。

  • <$mt:PreTagWord$>
    ファンクションタグです。上記<mt:PreTagAttr>内でのみ有効です。

    指定するパラメータは以下。実際には、単語を<span>で括りclassstyle で装飾する記述に展開されます。
    • word
      単語を指定してください。正規表現による指定が可能です。複数の単語に同じ装飾をする際に便利です。

    • class
      css のクラス名を指定できます。

    • style
      cssスタイルの直接表記です。


実際

記述サンプル。

<mt:PreTagAttr>
<$mt:PreTagWord word="sub|return|while|if|else|{|}" style="color:#0000FF" $>
<$mt:PreTagWord word="my|defined|print|push" style="color:#C000C0" $>
<$mt:PreTagWord word="\x24[a-zA-Z_]\w*" style="font-weight: bold;" $>
サンプル1
<mtpretag>
$f  =   "</==>";

$tst    =   "icyodnfisnincs=\$AAf0d_j=lincsslkddinincncss";

@list   =   &rec($tst);

foreach my $key(@list)
{
    print   @$key[0]."[".@$key[1]."]\n";
}

sub rec
{
    my  @res    =   ();
    my  @p  =   $_[0]=~(/(.*?)($word)(.*$)/);
    if( 0==@p   )
    {
        push(@res,[0,$_[0]]);
    }
    else
    {
        push(@res,[0,$p[0]]);
        push(@res,[1,$p[1]]);
        push(@res,&rec($p[2]));
    }
    return  @res;
}
</mtpretag>
サンプル2
<mtpretag>
$ctx{'array'}   =   {};

tst("key","value");
tst("key1","value1");
tst("key2","value1");

my  %at =   %{$ctx{'array'}};
while(my($ky,$vl)=each %at)
{
    print   "$ky : $vl\n";
}

sub tst
{
    my  ($k,$v) =   @_;

    my  %at =   %{$ctx{'array'}};
    $at{$k} =   $v;
    $ctx{'array'}   =   \%at;
}
</mtpretag>
</mt:PreTagAttr>
上記の記述で、以下のような表現が可能です。
サンプル1

$f  =   "</==>";

$tst    =   "icyodnfisnincs=\$AAf0d_j=lincsslkddinincncss";

@list   =   &rec($tst);

foreach my $key(@list)
{
    print   @$key[0]."[".@$key[1]."]\n";
}

sub rec
{
    my  @res    =   ();
    my  @p  =   $_[0]=~(/(.*?)($word)(.*$)/);
    if( 0==@p   )
    {
        push(@res,[0,$_[0]]);
    }
    else
    {
        push(@res,[0,$p[0]]);
        push(@res,[1,$p[1]]);
        push(@res,&rec($p[2]));
    }
    return  @res;
}
サンプル2

$ctx{'array'}   =   {};

tst("key","value");
tst("key1","value1");
tst("key2","value1");

my  %at =   %{$ctx{'array'}};
while(my($ky,$vl)=each %at)
{
    print   "$ky : $vl\n";
}

sub tst
{
    my  ($k,$v) =   @_;

    my  %at =   %{$ctx{'array'}};
    $at{$k} =   $v;
    $ctx{'array'}   =   \%at;
}
同じ装飾指定で、2つの<mt:PreTag>を展開しています。

必ずしも<mt:PreTag><mt:PreTagAttr>で括らなければならない訳ではありません。<mt:PreTag>単独の場合、単語の装飾が出来ないだけで、コードの表示は可能です。


まとめ

元よりあった「タブスペースの変換」を合わせ、単語の装飾機能で、ソレらしくなってきました。

各言語毎に、デフォルトの装飾を纏めようかとも思いましたが、<$mt:PreTagWord$>を並べたモジュールテンプレートを作れば対応できるので、後回しにしました。

引用符で括った文字列等の判別が面倒だったので、今のところ未対応です。

まだまだ改善の余地は有りますが、宜しくお願いします。



トラックバック(1)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/159

マークアップ記述を含む、全てのコードを表示できるようにする事を目標に、mtpretag は、進化を続けている、かもしれません。今回は、">前回より、単語の... 続きを読む

コメントする

ホーム >> 左脳Script >> Movable Type >> Plugin開発 >> コード表示用 Plugin

アーカイブ

このブログ記事について

このページは、n-yagiが2009年6月11日 21:35に書いたブログ記事です。

ひとつ前のブログ記事は「mtタグ の任意展開、展開抑制 の方法」です。

次のブログ記事は「タグと内容を抜き出す正規表現」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。