Movable Type用ShortCodeプラグイン・その8(ショートコードの入れ子)

ShortCodeプラグインでは、ショートコードの中にショートコードを入れ子に書くこともできます。
ただし、一部注意が必要です。

1.入れ子の例

冒頭で述べたように、ショートコードの中にショートコードを入れることができます。

例えば、以下のように書くと、「hoge」という変数が定義されているときだけ、ブログのアドレスを出力することができます。

[if name="hoge"]
[template]
<$mt:BlogURL$>
[/template]
[/if]

2.入れ子の許可/不許可

ショートコードによって、入れ子を許可した方が自然なものもあれば、逆に許可しない方が自然なものもあります。
そこで、ショートコードによって、入れ子の許可/不許可のデフォルト値は異なります。
現状のプラグインで標準装備しているショートコードでは、入れ子の許可/不許可は以下のようになっています。

ショートコード入れ子の許可・不許可
template不許可
templatew不許可
block許可
table許可
if許可
unless許可
noconv不許可

template/templatewショートコードは、ブロック内にテンプレートタグを自由に書くことができ、極めて自由度が高いので、通常は入れ子を使う必要性はないと思います。
そのため、入れ子を不許可にしています。

また、noconvショートコードは、ブロック内のショートコードをすべて無効にしますので、当然ながら入れ子はあり得ません。
そのため、入れ子を不許可にしています。

3.同じショートコードの入れ子

同じショートコードを入れ子にする場合(例えば、ifショートコードの中にさらにifショートコードを書く場合)、入れ子の外と中のショートコードを区別するために、ショートコード名の後に「.識別子」を付ける必要があります。
識別子は半角英数字で自由に決めることができます。

例えば、ifショートコードを使って、「foo」と「bar」の2つの変数がともに真のときに、ショートコード内のブロックを出力したいとします。
外側/内側のifショートコードの識別子を、それぞれ「.1」「.2」にするとすれば、以下のような書き方をします。

[if.1 name="foo"]
[if.2 name="bar"]
変数fooと変数barがともに真のときに出力する内容
[/if.2]
[/if.1]

4.tableショートコードの入れ子

tableショートコードの中に、tableショートコードを入れ子に書くことも可能です。
ただし、その場合は入れ子の内側のtableショートコードに「no_cr="1"」のオプションを指定する必要があります。

例えば、以下のような表をtableショートコードで出力したいとします。
中央のセルが、入れ子になった表になっています。

123
4
ab
cd
6
789

上記の表は、以下のショートコードで出力することができます。

[table.1]
1,2,3
4,[table.2 no_cr="1"]
a,b
c,d
[/table.2],6
7,8,9
[/table.1]