Movable Type 備忘録
MTPrecodeプラグイン
- Prev Page: カテゴリごとにテンプレートを切り替える
- Next Page: MovableType版 Updated Today
こんにちわ^^
今日は目の調子がいいので、がんばってプラグイン作ってみました ( ̄∇ ̄)/
先日、こちらのdp.SyntaxHighlighterで、各種コードを整形してくれるJavaScriptを紹介しました。
でも、わたしのところでは他のJavaScriptと競合!? しちゃうようで、あんまりよろしくないなぁ・・・と思って、コードを解析したら何となく作れそうだったので、似たようなものをプラグインとして作ってみたんです (●´∀`●)
- - 2008.01.21 追記 -
行の先頭の空白文字(スペース、タブ)を実体参照文字に変換するよう対応しました。また、行末の空白文字を削除するよう対応しました。
- - 2007.04.17 追記 -
すいません、MTPrecodeプラグインはエントリ内で使用するプラグインです。
ですので、こちらのエントリでMovableTypeのタグを使用するで紹介している、EvalTemplateプラグインと併用する必要があります。EvalTemplateプラグインはエントリ内でもMovableType(ムーバブルタイプ)のテンプレート・タグを使用可能にしてくれるプラグインです。
- - 2007.04.17 Ver1.01 -
行番号を任意の番号から開始できるよう対応しました。
- - 2007.04.17 Ver.1.02 -
最初の1行目に改行が入ってしまう不具合を対応しました。
- - 2007.04.17 Ver.1.03 -
タイトルを付けられるように対応しました。それに伴って、多少 CSS の変更が入ります。
- - 2007.07.13 Ver.1.04 -
任意の行数を超える場合、縦スクロールバーを表示するように対応してみました。
多少 CSS を変更しました。あと、MovableType 4でも問題なく表示できることを確認しました。
まずはサンプルですね。
package MT::Plugin::Precode;use strict;use MT::Template::Context;use base qw(MT::Plugin);my $plugin = __PACKAGE__->new({name => 'Precode',version => '1.04',author_name => 'bzbell',description => 'Preformatted Code.',author_link => 'http://bizcaz.com/',doc_link => 'http://bizcaz.com/archives/2007/02/10-015235.php',});MT->add_plugin($plugin);MT::Template::Context->add_container_tag (Precode => \&precode_main);sub precode_main{my ($ctx, $args, $cond) = @_;my $builder = $ctx->stash('builder');my $tokens = $ctx->stash('tokens');my $start = 1;my $title = '';my $over = 30;my $html = '';if ($args->{'start'}) {$start = $args->{'start'};}if ($args->{'title'}) {$title = $args->{'title'};}if ($args->{'overline'}) {$over = $args->{'overline'};}my $out = $builder->build ($ctx, $tokens, $cond);$out = precode_sub($out, $start, $title, $over);$html .= $out;$html;}sub precode_sub{my ($str, $start, $title, $over) = @_;my @result = ();my @clname = ("\"precode-odd\"", "\"precode-eve\"");my $out = "<div class=\"precode-block\">\n";my $index = 0;if ('' ne $title) {$out .= "<p class=\"precode-title\">$title</p>\n";}@result = split(/\x0D\x0A|[\x0D\x0A]|\<br \/\>$/, $str);if ('' eq $result[0]) {shift(@result);}my $scroll = '';if ($over < @result) {$scroll = 'scroll';}if (1 < $start) {$out .= "<div class=\"precode-wrapper ".$scroll."\">\n<ol start=\"$start\">\n";} else {$out .= "<div class=\"precode-wrapper ".$scroll."\">\n<ol>\n";}foreach my $line (@result) {if ('' eq $line) {$line = ' ';}$out .= '<li class='.$clname[$index].'><code>'.$line."</code></li>\n";$index ^= 1;}$out .= "</ol>\n</div>\n</div>";return $out;}1;
上記はMTPrecodeプラグインのコードになります。
そのコードをMTPrecodeプラグインを使って整形したものです。
dp.SyntaxHighlighterと違って強調表示はされません。
でも、とりあえず目的の機能は満たしてると思います。
MTPrecodeプラグインの使い方
使い方はカンタンです。
整形したいテキストを<MTPrecode>コンテナタグで囲うだけです。
たとえば、以下のようなかんじで使います。
<MTPrecode><div><ul><li>xxxxx</li></ul></div></MTPrecode>
そうすると、以下のように整形されます。
<div class="precode-block"><p class="precode-title">タイトル</p><div class="precode-wrapper"><ol><li class="precode-odd"><span class="code"> <div></li><li class="precode-eve"><span class="code"> <ul></li><li class="precode-odd"><span class="code"> <li>xxxxx</li></li><li class="precode-eve"><span class="code"> </ul></li><li class="precode-odd"><span class="code"> </div></li></ol></div></div>
あとは、上記で出力されるClassルールをCSSで各自の好みで変更するだけです ( ̄∇ ̄)b
ちなみに、例で示したスタイルは以下の通りです。
div.precode-block {margin: 1em 0;border: 5px solid #31313b;background-color: #fefefe;}div.precode-block p.precode-title {margin: 0;padding: 0;padding-bottom: 5px;color: #d3d9f0;background-color: #31313b;}div.precode-block div.precode-wrapper {overflow: auto;}/** 縦スクロールバー表示用スタイル*/div.precode-block div.scroll {height: 43em; /* 1.4 × 任意の表示行数(デフォルト:30行) + 1em */}div.precode-block ol {margin: .5em 0 .5em 55px;padding: 0;color: #2b91af;background-color: #fefefe;}div.precode-block ol li {padding: 0 .5em;line-height: 1.4;border-left: 2px solid #303;}div.precode-block ol li code {font-family: monospace, 'Courier New', Courier, Fixed !important;white-space: pre;/** 横スクロールを表示せずに、折り返して表示させる場合*/white-space: -moz-pre-wrap; /* Mozilla */white-space: -pre-wrap; /* Opera 4-6 */white-space: -o-pre-wrap; /* Opera 7 */white-space: pre-wrap; /* CSS3 */word-wrap: break-word; /* IE 5.5+ */color: #303;}div.precode-block ol li.precode-odd {background-color:#e7e7e7;}div.precode-block ol li.precode-eve {}
オプション
<MTPrecode>コンテナタグに以下のオプションを対応しました。
start
指定した行番号から採番できます。デフォルトは1番から採番されます。<MTPrecode start="400"><div><ul><li>xxxxx</li></ul></div></MTPrecode>
青い字の部分で開始番号(=400)を指定しています。
結果、以下のように表示されます。<div><ul><li>xxxxx</li></ul></div>
- 補足 -
このオプションでは、<ol>タグにstartオプションをつけることで任意の番号を表示させてます。
でも、W3Cではstartオプションは推奨されていません。何でだろぅね (´・д・`)CSSだけでカウンタの設定は可能なんです...可能だけど、IEが未対応なんです。
title
任意のタイトル名を付加することができます。日本語も表示可です。
このオプションが指定されない限りタイトル表示はされません。<MTPrecode start="400" title="タイトル表示"><div><ul><li>xxxxx</li></ul></div></MTPrecode>
青い字の部分でタイトル表示の指定をしています。
結果、以下のように表示されます。タイトル表示
<MTPrecode start="400" title="タイトル表示"><div><ul><li>xxxxx</li></ul></div></MTPrecode>
overline
任意の行数以上になった場合、縦スクロールバーを表示することができます。デフォルトは 30行となっています。<MTPrecode overline="30"><div><ul><li>xxxxx</li></ul></div></MTPrecode>
青い字の部分で任意の行数を指定しています。
結果、以下のように表示されます。package MT::Plugin::Precode;use strict;use MT::Template::Context;use base qw(MT::Plugin);my $plugin = __PACKAGE__->new({name => 'Precode',version => '1.04',author_name => 'bzbell',description => 'Preformatted Code.',author_link => 'http://bizcaz.com/',doc_link => 'http://bizcaz.com/archives/2007/02/10-015235.php',});MT->add_plugin($plugin);MT::Template::Context->add_container_tag (Precode => \&precode_main);sub precode_main{my ($ctx, $args, $cond) = @_;my $builder = $ctx->stash('builder');my $tokens = $ctx->stash('tokens');my $start = 1;my $title = '';my $over = 30;my $html = '';if ($args->{'start'}) {$start = $args->{'start'};}if ($args->{'title'}) {$title = $args->{'title'};}if ($args->{'overline'}) {$over = $args->{'overline'};}my $out = $builder->build ($ctx, $tokens, $cond);$out = precode_sub($out, $start, $title, $over);$html .= $out;$html;}sub precode_sub{my ($str, $start, $title, $over) = @_;my @result = ();my @clname = ("\"precode-odd\"", "\"precode-eve\"");my $out = "<div class=\"precode-block\">\n";my $index = 0;if ('' ne $title) {$out .= "<p class=\"precode-title\">$title</p>\n";}@result = split(/\x0D\x0A|[\x0D\x0A]|\<br \/\>$/, $str);if ('' eq $result[0]) {shift(@result);}my $scroll = '';if ($over < @result) {$scroll = 'scroll';}if (1 < $start) {$out .= "<div class=\"precode-wrapper ".$scroll."\">\n<ol start=\"$start\">\n";} else {$out .= "<div class=\"precode-wrapper ".$scroll."\">\n<ol>\n";}foreach my $line (@result) {if ('' eq $line) {$line = ' ';}$out .= '<li class='.$clname[$index].'><code>'.$line."</code></li>\n";$index ^= 1;}$out .= "</ol>\n</div>\n</div>";return $out;}1;
任意の行数に合わせて CSS の方も変更します。
スタイルシート
/** 縦スクロールバー表示用スタイル*/div.precode-block div.scroll {height: 43em; /* 1.4 × 任意の表示行数(デフォルト:30行) + 1em */}
以上です。
MTPrecodeプラグイン
Trackback Pings(3)
- from
笑むなAikoの『お玉杓子は飲み物です』
1日悩んで、原因は「それ!?」ってコトってよく有りますよね?。 え 大ぼけはAikoだけ?。 ...
- from
blog.mystorage.jp
ソースコードをきれいに見せたかったので、方法を探してたらMTPrecodeなるM...
- from
まったり(。・・。)
記事投稿内容でソースコードを記入する時、今まではSyntaxHighlighter 2.1.364を利用していたのですが 機能が多すぎて使いきれてなかった...




勝手にこのようなプラグイン待ってました!JavaScriptのOFF時の事考えると最近は使うスクリプトも色々と選んでしまう今日この頃です。使わせて頂きます。ありがとう御座います!
>>1 kazuking さん
はじめまして^^
使っていただいてありがとうございます (m;_ _)mペコ
> …JavaScriptのOFF時の事考えると最近は使うスクリプトも色々と選んでしまう今日この頃です。
そうですね。
わたしはkazuking さんのようにJavaScript Offのことは考慮してませんが (; ̄∇ ̄A、本来なら考慮すべきですよね。
実際にわたしも各エントリで使ってますが、何か不都合などありましたらご連絡ください。
初めまして。ありがたく使わせていただいてます。
ところで、Windows XP、IE7で表示させた場合、
スペースが無視されてしまうようです。
oPERA9では問題ありませんでした。
何らかの回避方法をご存じでしたら、ご教授くださいませんか?
>>3 sagasan [livedoor.com] さん
こんばんわ^^
> ところで、Windows XP、IE7で表示させた場合、
> スペースが無視されてしまうようです。
> oPERA9では問題ありませんでした。
えっ
確認してみます。
>>3 sagasan [livedoor.com] さん
こんばんわ^^
> ところで、Windows XP、IE7で表示させた場合、
> スペースが無視されてしまうようです。
> oPERA9では問題ありませんでした。
上記の件ですが、改善したと思います
お手数ですが再度ダウンロードしてご確認していただけますか。
>>5 bzbell さん
改良ありがとうございました。
でも・・・
ちょっとだけ、問題が残っているようです。
複数スペースが単一スペースとして
認識されてしまっています。
IE7独自の問題なんでしょうか?
>>5 bzbell さん
自分なりに検証してみたので、ご報告致します。
問題はCSSにある模様
div.precode-block ol li code の
whitespace: pre;を最後に指定するようにすると
うまくいきました。
div.precode-block ol li code { font-family: monospace, 'Courier New', Courier, Fixed !important; /* * 横スクロールを表示せずに、折り返して表示させる場合 */ white-space: -moz-pre-wrap; /* Mozilla */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ white-space: pre-wrap; /* CSS3 */ word-wrap: break-word; /* IE 5.5+ */ white-space: pre; color: #303;}
preが上書きされて設定されてしまうのでしょうか?
>>6 sagasan [livedoor.com] さん
>>7 sagasan [livedoor.com] さん
> 複数スペースが単一スペースとして
> 認識されてしまっています。
えっ
それは未検証でした。
そうなんですか。IE7 はそのよな振る舞いをするんですね。
> preが上書きされて設定されてしまうのでしょうか?
はい。
そのようにスタイルを設定してます。
でも、IE7 で Mozilla や Opera の設定しても無視されると思ってたんですけど
そっかぁ、IE7 だと white-space に無効な設定したことで、white-space 自体が無効になっちゃうのかなぁ。
でも、white-space: pre を最後にもってきてしまうと、Opera などにも影響でませんか!?
今のバージョンは問題ないのかなぁ。
いずれにしても勉強になりました。
ありがとうございました
こんばんわ〜、今度はこれに挑戦してます。
1)MTPrecodeプラグインをダウンロードしてmt/pluginディレクトリーにアップ
2)エントリー中の、例で示したスタイルは以下の通りですの部分のコードをテンプレートのスタイルシートテーマに記述
3)コードを各部分を
<MTPrecode>
</MTPrecode>
で囲んでテストしてみましたが、これだけでは駄目なようです。あとどんな作業が要りますか?よろしくお願いします。
>>9 yutaka さん
記事内にも記載してますが MTPrecode プラグインは EvalTemplate プラグインと併用する必要があります。
そちらがインストールされてないのではないでしょうか
>>10 bzbell さん
>EvalTemplate プラグインと併用する必要があります。
済みません見逃してました
エントリーを読みながら控えたメモに
修正前
<div class="entry-body"><$MTEntryBody$></div>
修正後
<div class="entry-body"><$MTEntryBody eval="1"$></div>
この部分を控えておいたのですが、今エントリーを探しているのですが、どのエントリーだったのか?分からないのですが
上の部分ってこのカスタマイズの必要項目ですよね?
>>11 yutaka さん
こちらの記事になります。
http://bizcaz.com/archives/2006/05/14-142231.php
ちなみに、MT4.2 から上記記事で使用する EvalTemplate プラグインと同等の機能が追加されてます。
ですので、MT4.2 を使う場合には不要になりますので、覚えておいてくださいね
>>12 bzbell さん
>MT4.2 を使う場合には不要になりますので、覚えておいてください
了解です
#12:のコメントのエントリーで説明されている修正箇所なんですが、修正するテンプレート名が違うので探したのですが修正するコードがあるテンプレートは「ブログ記事の概要」「ブログ記事の詳細」この二つのテンプレートしか見つけられなく
「個別アーカイブ」「カテゴリアーカイブ」「日付アーカイブ」と書いてあるテンプレートはどのテンプレートでしょうか?エントリーを書いてみたのですが、取りあえず表示されているようですが
>>13 yutaka さん
はい。
「ブログ記事の概要」、「ブログ記事の詳細」でいいですよ
というのは、この記事は MT4 以前のバージョンの時のものなので、テンプレートの構造が異なります。
以前にも言ったかもしれませんが、カスタマイズ記事内容によっては必ずしも MT4 を元にした説明となってません。
そこら辺は臨機応変に対応していただく必要があります
こんにちわぁ
MTPrecode使わせていただいております
私的に以前から思っていた事なんですが。。
MTPrecodeを使って書かれているコードをコピペして張り付けると
行番号まで付いてきてしまう。。
内容のみをコピペできる方法あればと、、質問?にきました
>>15 Kei さん
こんにちわ^^
> MTPrecodeを使って書かれているコードをコピペして張り付けると
たぶん Firefox では ol タグの内容をコピーしても同様に行番号が付加されるんだと思います。
> 行番号まで付いてきてしまう。。
はい。それは以前から言われてたことなのですが、実はそれってブラウザによるんです
たとえば、Safari とか先日公開された Chrome、IE では行番号は付加されないのですが、Firefox では行番号が付加されちゃうんです
で、対策としては JavaScript を利用すれば可能です。
でも、JavaScript を使うなら最初っから dp.SyntaxHighlighter 使えばいいよね!? っという結論になりましたの
なるほどぉ
了解しました!