SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Wikiのように独自タグでHTML整形を行う

MSXMLのXSLTを利用した独自記号による文章整形

  • X ポスト
  • このエントリーをはてなブックマークに追加

「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を用いて記述します。

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>に指定した場合は、変換先に反映されます。

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>

次のページ
「wiki.xsl」スクリプトの動作

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

ひだちのいろ(ヒダチノイロ)

大学生。IT関係の仕事につくのが夢です。かやねずみの巣

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/865 2008/08/26 13:36

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング