Movable Type用ShortCodeプラグイン・その7(対自動整形処理のデフォルト値と処理の変更)

昨日の記事で解説したように、ShortCodeプラグインでは、ショートコードのブロック内のbrタグを削除したり、ブロックの前後のpタグを削除したりする機能があります。
また、削除する/しないのデフォルトはショートコードごとに異なります。
さらに、削除する/しないをその都度指定することもできます。
今日はこのことについて解説します。

1.削除の処理の種類

ここまででは、単純に「brタグを削除」「pタグを削除」と述べました。
ただ、実際には以下のようにもっと細かな処理を行っています。

1-1.「brタグ+連続するスペースや改行」を単一の改行に変換

ショートコード内のブロックに、「brタグ+((スペースまたはタブの0回以上の連続)+改行)の0回以上の連続)」が出てくるごとに、それを単一の改行に変換することができます。
各ショートコードのこの機能のデフォルトの動作は、以下のようになっています。

ショートコードデフォルトの動作
templateしない
templatewする
blockする
tableする
ifしない
unlessしない
noconvする

1-2.各行末のbrタグを削除

ショートコード内のブロックで、各行末のbrタグを削除するだけの処理を行うこともできます。
この処理は、templateショートコードのみ、デフォルトで行うようになっています。

1-3.ブロックの前後のpタグを削除

自動整形によってブロックの前後がpタグで囲まれ、かつそのp要素の内部すべてをショートコードで置き換える場合に、そのpタグを削除することができます。
各ショートコードのこの機能のデフォルトの動作は、以下のようになっています。

ショートコードデフォルトの動作
templateする
templatewする
blockしない
tableする
ifしない
unlessしない
noconvしない

なお、段落がp要素で囲まれても、ショートコードを段落の一部として使う場合は、段落前後のpタグは削除されません。
例えば、以下のような書き方をした場合は、自動整形でこの段落がp要素で囲まれても、pタグはそのまま残ります。

このブログの名前は[template]<$mt:BlogName$>[/template]です。

1-4.空のp要素の削除

ショートコードによっては、処理結果が空文字列になることがあり得ます。
その場合、自動整形によってショートコードの前後がpタグで囲まれていると、空のp要素が出力されてしまいます。
この問題を避けるために、ショートコードの処理結果が空文字列になり、かつ自動整形によってショートコードの前後がpタグで囲まれている場合は、そのpタグも含めて、ショートコードの部分に何も出力しないようにしています。
この処理は、すべてのショートコードでデフォルトで行うようになっています。

1-5.先頭/最後のホワイトスペースの削除

ショートコードのブロック内の先頭と最後にホワイトスペース(空白/タブ/改行)があれば、それらを削除することができます。
この処理は、すべてのショートコードでデフォルトで行うようになっています。

1-6.ブロックの先頭/最後のbrタグの削除

ショートコードのブロックの先頭にbrタグだけの行がある場合や、ブロックの最後に余分なbrタグが連続している場合は、それらを削除することができます。

例えば、以下のようなショートコードを入力したとします。

[if name="hoge"]
この部分は変数hogeの値が真のときだけ出力されます。
[/if]

この場合、リッチテキストエディタや、「改行を変換」の自動整形によって、以下を処理することになります。

<p>[if name="hoge"]<br />
この部分は変数hogeの値が真のときだけ出力されます。<br />
[/if]</p>

そして、変数hogeの値が真になっていれば、以下のような結果が得られます。

<p><br />
この部分は変数hogeの値が真のときだけ出力されます。<br />
</p>

ただ、最初の<p>タグの後の<br />タグと、最後の</p>タグの前の<br />タグは、不要なタグです。
そこで、これらを削除することができます。

各ショートコードのこの機能のデフォルトの動作は、以下のようになっています。

ショートコードデフォルトの動作
templateしない
templatewしない
blockする
tableしない
ifする
unlessする
noconvする

2.個々のショートコードごとに対自動整形処理の方法を変える

ここまでで述べたように、ショートコードの処理の際にはpタグやbrタグの削除を行います。
その処理を行うかどうかを、個々のショートコードごとに明示することもできます。
それには、ショートコードを以下のように書きます。

[ショートコード名 -オプション -オプション ・・・ パラメータ="値" パラメータ="値" ・・・]

「オプション」には、以下の値を指定することができあます。
各オプションとも、する/しないのそれぞれで2種類ずつの書き方がありますが、どちらの書き方を使ってもかまいません。

削除処理の種類処理を行う処理を行わない
「brタグ+連続するスペースや改行」を単一の改行に変換-cb
-cut_br
-ncb
-no_cut_br
各行末のbrタグを削除-cbl
-cut_br_line
-ncbl
-no_cut_br_line
ブロックの前後のpタグを削除-cp
-cut_p
-ncp
-no_cut_p
空のp要素の削除-cpnc
-cut_p_no_content
-ncpnc
-no_cut_p_no_content
先頭/最後のホワイトスペースの削除-tr
-trim
-ntr
-no_trim
先頭のホワイトスペースの削除-lt
-ltrim
-nlt
-no_ltrim
最後のホワイトスペースの削除-rt
-rtrim
-nrt
-no_rtrim
ブロックの先頭/最後のbrタグの削除-tflb
-trim_first_last_br
-ntflb
-no_trim_first_last_br
ブロックの先頭のbrタグの削除-tfb
-trim_first_br
-ntfb
-no_trim_first_br
ブロックの最後のbrタグの削除-tlb
-trim_last_br
-ntlb
-no_trim_last_br

例えば、templateショートコードでは、デフォルトでは「各行末のbrタグを削除」と「ブロックの前後のpタグを削除」の機能がオンになります。
しかし、ブロック内の文章のところどころにテンプレートタグを使うような場合だと、自動整形を生かして、行末のbrタグを残し、また段落前後のp要素も残したい場合もあります。
ただ、「[template]」の直後のbrタグと、「[/template]」の直前のbrタグは、削除する方が良いです。

上に書いたような処理を行うには、templateショートコードを以下のように書きます。

[template -ncbl -ncp -tflb]
テンプレートタグ等
[/template]