2011年5月6日金曜日

PHP Text_Wiki_Mediawikiを使ってみた

PHPでMediawiki記法をHTMLに変換するのにText_Wiki_Mediawikiを使ってみた。
ちょっと使い方がわからなくWikilinkの変換で手間取ったのでメモを残しておく。

まずはインストール。
# pear install Text_Wiki_Mediawiki-0.2.0

サンプルと結果(No Good
<?php
require_once "Text/Wiki/Mediawiki.php";

$wiki=new Text_Wiki_Mediawiki();

$text = " 
*[[hoge]]
*[[hoge:fuga]]
*[[hoge:piyo|piyo]]
";

echo($wiki->transform($text,'Xhtml'));

実行結果:
<ul>
    <li>hoge<a class="" href="http://example.com/new.php?page=hoge">?</a></li>
    <li>hoge:fuga<a class="" href="http://example.com/new.php?page=hoge%3Afuga">?</a></li>
    <li>piyo<a class="" href="http://example.com/new.php?page=hoge%3Apiyo">?</a></li>
</ul>
urlがexample.comなのと、アンカーテキストが?なのを直したい。
ダラダラと調べてった経過も記すが、直した結果のサンプルはこっち


軽くググるが見つけられないので、ソースを読む。

全部は読めないので当たりをつけて読む。定義箇所は、Text/Wiki/Render/Xhtml/Wikilink.php かな。
class Text_Wiki_Render_Xhtml_Wikilink extends Text_Wiki_Render {

    var $conf = array(
        'pages' => array(), // set to null or false to turn off page checks
        'view_url' => 'http://example.com/index.php?page=%s',
        'new_url'  => 'http://example.com/new.php?page=%s',
        'new_text' => '?',
        'new_text_pos' => 'after', // 'before', 'after', or null/false
        'css' => null,
        'css_new' => null,
        'exists_callback' => null // call_user_func() callback
    );  
・・・
            $href = $this->getConf('new_url', null);
・・・
getConfはconfにあればそれを返す。なければ第2引数を返すだけのもの。なんで、confのnew_urlを置き換えれることができれば良い分けか。

もう少し見てみる。
    function Text_Wiki_Render(&$obj)
    {
        // keep a reference to the calling Text_Wiki object
        $this->wiki =& $obj;
・・・
        // is there a format and a rule?
        if ($this->format && $this->rule &&
            isset($this->wiki->renderConf[$this->format][$this->rule]) &&
            is_array($this->wiki->renderConf[$this->format][$this->rule])) {

            // this is a rule render object
            $this->conf = array_merge(
                $this->conf,
                $this->wiki->renderConf[$this->format][$this->rule]
            );
        }
    }
Text/Wiki/Render.phpにarray_mergeしてる場所発見!
wikiのrenderConfに追加できりゃ良さげってことで、今度はText/Wiki.phpを見る。
function setRenderConf($format, $rule, $arg1, $arg2 = null)
これでRenderConfは設定できそう。format、ruleがわからずもう少し調べるのは続いたが割愛。


サンプルと結果(Good
<?php
require_once "Text/Wiki/Mediawiki.php";

$wiki=new Text_Wiki_Mediawiki();

$wiki->setRenderConf('Xhtml', 'Wikilink', 'new_url', 'http://exapmle.co.jp/%s');
$wiki->setRenderConf('Xhtml', 'Wikilink', 'new_text', '');

$text = " 
*[[hoge]]
*[[hoge:fuga]]
*[[hoge:piyo|piyo]]
";

echo($wiki->transform($text,'Xhtml'));

実行結果:
<ul>
    <li><a class="" href="http://exapmle.co.jp/hoge">hoge</a></li>
    <li><a class="" href="http://exapmle.co.jp/hoge%3Afuga">hoge:fuga</a></li>
    <li><a class="" href="http://exapmle.co.jp/hoge%3Apiyo">piyo</a></li>
</ul>