[PEAR] オリジナルのWikiエンジンを作れるText_Wiki | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

Wikiは決まった作法で文章を書くとHTMLに変換してくれ、HTML言語を知らなくてもWeb上に装飾した文章で表現することができます。

最近は、Wikiエンジンを搭載したツールも多かったりしますが、そういったものを使ったときには使い方が固定されるところもあるので、自分の考えていた用途で使えないという場合もあります。

例えば、Wikipediaで使われているMediaWikiを使うと、Wikipedia同等のものを導入することができますが、あそこまで大規模な文章管理の仕組みは必要なかったり、ユーザー管理が弱かったりもしますので社内で使いづらい、なんて場合もあります。


PEARのText_WikiはそのWikiエンジンの部分だけを提供してくれますので、オリジナルのシステムに導入することができ、色んな用途で使うことも可能になります。



Text_Wikiを導入する


これは、一般的なPEARパッケージのインストールと同様なのであまり詳しく書きません。

ネットワークやチャンネルの設定が終っていれば、


$ pear install Text_Wiki

でいけるかもしれません。



Text_Wikiを使ってみる


基本的な使い方であれば、下記のように書くことでWiki文法の文章をHTMLに変換してくれます。


<?php

require_once "Text/Wiki.php";

$wiki = new Text_Wiki();

// Wiki文法で書かれた文章をXhtmlに変換する
$wiki->setFormatConf('Xhtml', 'translate', HTML_SPECIALCHARS);

// Wiki文法で書いた文章
$text = "これは、**''Text_Wiki''**で書かれたものです。";

// 変換
echo $wiki->transform($text, 'xhtml');

?>

$ php wiki.php
<p>これは、<strong><i>Text_Wiki</i></strong>で書かれたものです。</p>


wiki.php内の$textに代入している文章の中にWiki文法が使われています。

「** XXXX **」のフォーマットで書くと強調表示(<strong>タグ)に、「'' XXXX ''」のフォーマットで書くと斜体(<i>タグ)に変換されます。

setFormatConf()では、Wiki文法をXhtmlに変換するように設定するものです。


Text_WikiのWiki文法は、WikkiTikkiTavicoWiki の文法を組み合わせているようです。

使えるWiki文法の詳細は、マニュアルページ に書かれています。



Wiki文法をカスタマイズする


オリジナルのWikiエンジンを作るということなので、その文法を改変するということもできます。

まずは、既定のルールを無効にしています。


先ほどの、wiki.phpのサンプル内で使われていた斜体にするWiki文法(''で囲む)を無効にしてみます。


// 斜体のWiki文法を削除
$wiki->deleterule('italic');

// Wiki文法で書いた文章
$text="これは、**''Text_Wiki''**で書かれたものです。";

$ php wiki.php
<p>これは、<strong>''Text_Wiki''</strong>で書かれたものです。</p>


斜体のWiki文法が無効になっていますね。

予め定義されているルールは、マニュアルのページのルールの一覧 に書かれています。

次に、Wiki文法をオリジナルの書き方に変更してみます。

デフォルトで、強調表示するWiki文法である「** XXXX **」という書き方を、「@@@ XXXX @@@」という表現に変えてみます。


まず、Text_Wikiの各種パーサがまとめられたディレクトリ内に、オリジナルのWiki文法用のものを定義します。


$ cd /path/to/pear/Text/Wiki/Parse/Default

$ ls
Anchor.php      Delimiter.php  Image.php      Prefilter.php    Tighten.php
Blockquote.php  Embed.php      Include.php    Raw.php          Toc.php
Bold.php        Emphasis.php   Interwiki.php  Revise.php       Tt.php
Break.php       Freelink.php   Italic.php     Smiley.php       Underline.php
Center.php      Function.php   List.php       Strong.php       Url.php
Code.php        Heading.php    Newline.php    Subscript.php    Wikilink.php
Colortext.php   Horiz.php      Paragraph.php  Superscript.php
Deflist.php     Html.php       Phplookup.php  Table.php

この中には、Wiki文法1つにつき、1ファイルが置かれています。

テンプレとして使えるので、ここではまず元々あるStrong.phpをコピーしてCustomstrong.phpファイルを作ります。


次に、ファイルを開いてClass名を命名規則に沿って「Text_Wiki_Parse_Customstrong」に変更した後、Wiki文法のフォーマットを作ります。


var $regex =  "/@@@(.*?)@@@/";

次に、HTML構文に変換する役割を持つファイルを作ります。

これは、先ほどのディレクトリとは異なる場所に定義されています。

$ cd /path/to/pear/Text/Wiki/Render/Xhtml

この中には、先ほどのParseディレクトリ内のファイルと1対1の関係でファイルが置かれています。

なので、同様にStrong.phpファイルをコピーしてCustomstrong.phpとし、Class名を「Text_Wiki_Render_Xhtml_Customstrong」としておきましょう。


これで準備が整ったので、先ほどのwiki.phpを使って動作確認をしてみましょう。

新しいルールを適用するに当たって、insertRule()という関数を使って、先ほどのルールを使用できるようにしています。


$wiki->insertRule('Customstrong');

// Wiki文法で書いた文章
$text="これは、@@@Text_Wiki@@@で書かれたものです。";

$ php wiki.php
<p>これは、<strong>Text_Wiki</strong>で書かれたものです。</p>


ちなみに、このままだと元々の強調表現である「** XXXX **」という文法も使えるため、下記のように書いてルールを置き換えてしまうこともできます。


$wiki->changeRule('Strong', 'Customstrong');

// Wiki文法で書いた文章
$text="これは、@@@Text_Wiki@@@で**書かれた**ものです。";

$ php wiki.php
<p>これは、<strong>Text_Wiki</strong>で**書かれた**ものです。</p>


その他にもHTMLタグに変換した際にCSSを適用させることもできます。


$conf = array(
    'css_table' => 'my_table_class',
    'css_tr' => 'my_tr_class',
    'css_td' => 'my_td_class'
);

$wiki->setRenderConf('Xhtml', 'Table', $conf);

$text="|| テーブル ||";

$ php wiki.php
<table class="my_table_class">
    <tr class="my_tr_class">
        <td class="my_td_class">テーブル</td>
    </tr>
</table>


Text_Wikiを使って色々な形式にカスタマイズし、オリジナルのWikiエンジンを作り出したり、既存のWikiエンジンの文法を取り入れることも可能です。

既存のWikiエンジンの文法を取り入れたい場合、カスタマイズするよりText_Wikiをベースに作られたText_Wiki_Mediawiki (MediaWikiの文法を取り入れたもの)もあるようなので、そっちを使ってみるのも良いかもしれません。