« 日記 |Main| 日記 »

« カテゴリの説明がないときはラベルを表示するMovableTypeプラグイン | MTHack | MTでクリックしたエントリを編集するBookmarklet »

MovableTypeで箇条書きを楽に入力するプラグイン

詳しい記法などはPythonで箇条書きをHTMLに変換をご覧ください。コンテナタグで実装してみたところエントリーの本文の中で使うことができなさそうでしたので、グローバルフィルタを使って実装しました。

package MT::Plugin::MyPlugins;
use strict;
use MT::Template::Context;

MT::Template::Context->add_global_filter(MyTag=>\&myTag);

sub closeTags{
    my($ref_indent_stack, $indent) = @_;
    my(@indent_stack) = @$ref_indent_stack;
    my($result) = "";
    while ($indent < $indent_stack[-1]){
        $result .= "</li></ul>";
        pop(@indent_stack);
    }
    return $result, \@indent_stack;
}

sub itemize{
    my($contents) = @_;
    my @indent_stack = (-1);
    my $result = "";
    foreach my $line (split(/\n/, $contents)){
        $line =~ /^(\s*)(-?)(.*)/;
        if($3 eq ""){
            next;
        }
        if($2 eq ""){
            $result .= $3;
            next;
        }
        my $indent = length($1);
        if($indent > $indent_stack[-1]){
            $result .= "<ul><li>" . $3;
            push(@indent_stack, $indent);
        }else{
            my($closing, $ref_indent_stack) = &closeTags(\@indent_stack, $indent);
            @indent_stack = @$ref_indent_stack;
            $result .= $closing;
            $result .= "</li><li>" . $3;
        }
    }
    my($closing) = &closeTags(\@indent_stack, -1);
    $result .= $closing;
    return $result;
}

sub myTag {
    my($text, $arg, $ctx) = @_;
    $text=~s#<itemize>((?:[^<]|<(?!itemize>))*)</itemize>#&itemize($1)#ieg;
    
    $text;
}

1;

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/96

この一覧は、次のエントリーを参照しています: MovableTypeで箇条書きを楽に入力するプラグイン:

» 「MovableTypeで箇条書きを楽に入力するプラグイン」の改良 from 西尾泰和のブログ
MovableTypeで箇条書きを楽に入力するプラグインで箇条書きの中にpre... [詳しくはこちら]

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.