RDスタイルからWikiスタイルに変換 / タイ写真
投稿日: 2010年03月05日 更新日: 2017年07月22日
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やデータビズが好きです。このサイトは宮内の個人的なメモです。