RDスタイルからWikiスタイルに変換 / タイ写真

投稿日: 2010年03月05月

RDスタイルからWikiスタイルに変換

過去の日記データはRDスタイルで書いていた。Wikiスタイルに統一するために変換スクリプトを書いた。

やっつけ仕事。もし使うなら自己責任で。

<?php

define('STATE_HEADER',       0);
define('STATE_BODY',         1);
define('STATE_BLOCKQUOTE',   2);

function inline($buf)
{
    $state = INLINE_STATE_NONE;

    $wiki = '';

    $len = strlen($buf);
    for($i = 0; $i < $len; $i++){

        // TODO: 毎回substrなので効率悪い

        if(preg_match('/^\(\(<(.+?)>\)\)/', substr($buf, $i) , $m)){
            // link
            $i += strlen($m[0]) - 1;
            $link = str_replace('|URL:', '|', $m[1]);
            $link = preg_replace('/^URL:/', '', $link);
            $link = preg_replace('/^"/', '', $link);
            $link = preg_replace('/"\|/', '|', $link);
            $wiki .= '[[' . $link . ']]';
        }else if(preg_match('/^\(\(%(.+?)%\)\)/', substr($buf, $i), $m)){
            // plugin
            $i += strlen($m[0]) - 1;
            $wiki .= '{{' . $m[1] . '}}';
        }else if(preg_match('/^\(\(\*(.+?)\*\)\)/', substr($buf, $i), $m)){
            // bold
            $i += strlen($m[0]) - 1;
            $wiki .= "''" . $m[1] . "''";
        }else{
            $wiki .= $buf[$i];
        }
    }

    return $wiki;
}

function block($buf)
{
    $wiki = '';

    if(preg_match('/^(=+)(.*)/is', $buf, $m)){
        // 見出し
        for($i = 0; $i < strlen($m[1]); $i++){
            $wiki .= '!';
        }

        $wiki .= inline($m[2]);
    }else if(preg_match('/^\*(.*)/s', $buf, $m)){
        // 箇条書き1
        $wiki = '*' . inline($m[1]);
    }else if(preg_match('/^  \*(.*)/s', $buf, $m)){
        // 箇条書き2
        $wiki = '**' . inline($m[1]);
    }else if(preg_match('/^    \*(.*)/s', $buf, $m)){
        // 箇条書き3
        $wiki = '***' . inline($m[1]);
    }else if(preg_match('/^\\([0-9]+\)(.*)/s', $buf, $m)){
        // 番号付リスト1
        $wiki = '#' . inline($m[1]);
    }else if(preg_match('/^  \([0-9]+\)(.*)/s', $buf, $m)){
        // 番号付リスト2
        $wiki = '##' . inline($m[1]);
    }else if(preg_match('/^    \([0-9]+\)(.*)/s', $buf, $m)){
        // 番号付リスト3
        $wiki = '###' . inline($m[1]);
    }else if(preg_match('/^ (.*)/s', $buf, $m)){
        // 整形済みテキスト
        $wiki = $buf;

    }else{
        $wiki = inline($buf);
    }

    return $wiki;
}

$filename = $argv[1];

$fp = fopen($filename, 'rb');
if($fp === false){
    echo "file not found\n";
    exit;
}

$state = STATE_HEADER;
$is_rd = false;

while(!feof($fp)){
    $buf = $wiki = fgets($fp);

    if($state == STATE_HEADER){
        if($buf == "\n"){
            $state = STATE_BODY;
        }else if(preg_match('/^format: *([a-zA-Z]+)/is', $buf, $m)){
            if($m[1] == 'RD'){
                $is_rd = true;
                $wiki = "Format: Wiki\n";
            }else{
                $is_rd = false;
            }
        }
    }else if($state == STATE_BODY){
        if($buf == ".\n"){
            $state = STATE_HEADER;
            $is_rd = false;
        }else if($is_rd === false){
            // RDでないときは何もしない
        }else if(preg_match('/^--- *<blockquote>/is', $buf)){
            // 引用
            $state = STATE_BLOCKQUOTE;
            $wiki = '';
        }else{
            // その他
            $wiki = block($buf);
        }

    }else if($state == STATE_BLOCKQUOTE){
        if(preg_match('/^--- *<\/blockquote>/is', $buf)){
            $state = STATE_BODY;
            $wiki = '';
        }else{
            // その他
            $wiki = '"" ' . block($buf);
        }
    }

    echo $wiki;
}

ディレクトリ内のtd2を全部変換するときはこんな感じのスクリプトを別途用意。

<?php

$files = glob(dirname(__FILE__) . '/*.td2');

foreach($files as $file)
{
    system('php rd2wiki.php ' . basename($file) . ' > wiki/' . basename($file));
}

タイ写真

名前:宮内 はじめ

Code for Nagoya名誉代表

E2D3名古屋支部長

プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。

プロフィール

お問い合わせ