「wiki.xsl」で変換される文章の書き方
変換対象となる文章は、XHTMLをもとに作成します。
まず、ロゴや著作権表示など文章の外側に当たる部分や複雑なレイアウトを要する部分を、XHTMLで記述します。これを土台として、以下の変更を加えます。
- 一行目に「XLSTスタイルシートの指定」を書く。
<?xml-stylesheet type="text/xsl" href="wiki.xsl"?>
<head>
内に整形のルールを指定する<rule>
を書く。<rule regexp="...">...</rule>
- Wiki整形したい文章を
<wiki>
で囲む。<wiki> ... </wiki>
- 拡張子を「.xml」に変更する
<?xml-stylesheet type="text/xsl" href="wiki.xsl"?> <html> <head> <title>wikiテスト</title> <rule regexp="^■(.*)"><h1>$1</h1></rule> ... </head> <body> <wiki> ■概要 この中身に対し、Wiki的整形が行われます。 ■項目1 テストです。 ■項目2 てすとですよー。 </wiki> ... </body> </html>
整形結果を見ると<wiki>
内の「■~」の行が<h1>
で囲まれているのが分かります。スタイルシートで<h1>
の「見栄え」を指定すれば、きちんと反映されます。
文字列の置き換えによる整形パターンの指定
「wiki.xsl」は使用する記号と整形方法を<rule>
で自由に指定できるようになっています。これによって、文章の作成者は自分の好みの整形方法を使用することができます。
<html> <head> <rule regexp="^■(.*)"><h1>$1</h1></rule> </head> <body> <wiki> ■単純な置き換え整形の例 行頭が「■」で始まる行をタイトルに置き換えます。 </wiki> </body> </html>
大抵の整形は、記号を含んだ文字列をタグに置き換えることで実現できます。
regexp
属性に対象の文字列を正規表現で指定し、置き換える文字列を<rule>
の中に書きます。正規表現中で()
で囲んだ部分は、置き換える文字列中で$x
を用いて参照できます。また、置き換える文字列には、タグを直接書くことができます。
上記の例では「行頭が■で始まる文字列を<h1>タグ付きで出力する」という整形ルールを指定しています。
詳しい正規表現の仕様については、MSDNの「正規表現の概説」を参照ください。
より複雑な整形パターンの指定
単純な文字列の置き換えで解決できない整形パターンは、整形方法を直接JScriptを用いて記述します。
<html> <head> <rule regexp="(^\|.*\|\n)+" script="yes"> <![CDATA[ var out="<table>"; var trList = arguments[0].split("\n"); for(var i in trList) { out+="<tr>"; var s = trList[i].substring(1, trList[i].length-1); var tdList = s.split("|"); for(var i2 in tdList) { if(tdList[i2].charAt(0) == "*") { out+="<th>"+tdList[i2].substr(1)+"</th>"; } else { out+="<td>"+tdList[i2]+"</td>"; } } out+="</tr>"; } out+="</table>"; return out; ]]> </rule> </head> <body> <wiki> |*名前|*値段| |マグロ|200円| |イカ|180円| |タイ|220円| </wiki> </body> </html>
<rule>
のscript
属性にyes
を指定すると、<rule>
の中にJScriptを記述することができます。正規表現で指定されたパターンが見つかると、<rule>
内のJScriptが実行されます。スクリプト中ではarguments[x]
を使って正規表現にマッチした文字列や、サブパターンにアクセスできます。また、this.xxx
でグローバルオブジェクトにアクセスすることもできます。スクリプトの最後にreturn
で正規表現にマッチした部分と置き換える文字列を返します。
上記の例では表の整形を行っています。
改行文字、空白文字、タグ文字の取り扱い
XHTMLの<wiki>
内の文字列は、<rule>
で指定した内容に従い整形されます。
デフォルトの動作では、<wiki>
内の改行や空白はそのまま有効になります。また、<wiki>
内のCDATAセクションで「<」や「>」の文字を使った場合、<
や>
に変換されるようになっています。これらの動作は、<wiki>
に以下の属性を指定することで変更できます。
no-escape | 「yes」を指定するとエスケープを行わなくなる。 |
ignore-whitespace | 「yes」を指定すると空白を無視する。 |
ignore-breakline | 「yes」を指定すると改行を無視する。 |
<html> <head> <rule regexp="\[br\]"><br/></rule> <body> <wiki ignore-breakline="yes"> 自動的に改行されません。 ここも1行目です。[br] ここは2行目です。 </wiki> </body> </html>
その他のWikiタグの属性
上記以外の属性を<wiki>
に指定した場合は、変換先に反映されます。
<html> <body> <wiki style="margin:5px 2em; background-color:#dddddd;"> style属性が反映される。 </wiki> </body> </html>
グループ
一つの文章内で、いくつかの整形ルールを切り替えて使うことができます。例えば、文章記述用の整形ルールと数式記述用の整形ルールで、同じ記号を異なる意味で使用することができます。
<html> <head> <rule regexp="@([^@]+)@" group="red"> <span style="font-weight:bold; color:#ff0000">$1</span> </rule> <rule regexp="@([^@]+)@" group="blue"> <span style="font-weight:bold; color:#0000ff">$1</span> </rule> </head> <body> <wiki group="red"> @redグループ@ </wiki> <wiki group="blue"> @blueグループ@ </wiki> </body> </html>
上記のように<rule>
にgroup
属性を指定すると、ルールはそのグループに属します。グループに属したルールを使うには<wiki>
にgroup
属性を指定します。グループを指定せずに<rule>
を記述した場合そのルールはどのグループにも属さず、すべての<wiki>
内で有効になります。
整形の順序
整形のルールは<rule>
を書いた順序で適用されていきます。整形ルールによっては、順序が非常に重要になることがあります。例えば、見出しのリストを目次として出力する記号を作った場合、見出しの整形をすべて終えてから、目次の出力を行わなければなりません。
次の例では、<wiki>
内の[index]
と書かれた部分に見出しの箇条書きリストを出力しています。
<html> <head> <!-- 目次項目 --> <rule regexp="^◎(.*)" script="yes"> <![CDATA[ if(!global.index) global.index = new Array(); global.index.push(arguments[1]); return "<h2>"+arguments[1]+"</h2>"; ]]> </rule> <!-- 目次出力 --> <rule regexp="\[index\](\n|$)" script="yes" priority="-1"> <![CDATA[ if(global.index) { var s="<ul>"; for(var i=0; i<global.index.length; i++) { s += "<li>"+global.index[i]+"</li>"; } s+="</ul>"; return s; } // インデックスが存在しなかった return ""; ]]> </rule> </head> <body> <wiki> 目次項目の整形が行われてから目次の整形が行われます。 ルールを指定する順序が逆だと、うまく動作しません。 ◎目次 [index] ◎項目1 テストです ◎項目2 テストですよー </wiki> </body> </html>