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

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));
}

タイ写真

最終更新時刻: 2010年03月06日

このメモの今後 / tDiaryを最新にアップデート

このメモの今後

各機能をサービスとして別立てして、疎結合させたい。

  1. コメント管理を外部に。Disqusみたいな。
  2. 画像管理を外部に。Flickrみたいな。
  3. タグ管理を外部に。
  4. 日記の内容をバージョン管理したい。
  5. それぞれの横断検索

現状は下記

  1. tDiary標準機能
  2. image_ex.rb
  3. tDiary標準機能
  4. 未実装
  5. 日記とコメントについてHyperEstraier

それぞれの移行先

  1. 新規実装
  2. 新規実装(gyazoを元に)
  3. 新規実装
  4. バックエンドをSVN/Gitあたりで検討中。
  5. HyperEstraierを使ってごにょごにょ

tDiaryを最新にアップデート

2.2から2.3HEADにアップデートした。

理由はWikiスタイルのバグ修正が入ってたから。

具体的には下記のときにうまくリンクが貼られない。

[[てす|と|http://www.example.com/]]

「てす」しかひょうじされず、「と」は表示されない。

これは今までのtDiaryに添付されていたhikidoc.rbのバージョンが古かった(0.0.2)ため。

tDiaryの2.3HEADでは最新のhikidoc.rb(0.0.5)が添付されており、上記ケースにも対応している。

多分下記のコードが原因。これが最新。

  def compile_bracket_link(link)
    if m = /\A(.*)\|/.match(link)

これが以前のコード。

  def compile_bracket_link(link)
    if m = /\A(?>[^|\\]+|\\.)*\|/.match(link)
最終更新時刻: 2010年03月10日

Google日本語入力の不具合? / 文書管理システム / 文書管理システム2

Google日本語入力の不具合?

ある日突然、日本語キーボードの配列が英語版になってしまった。

たとえば「全角/半角」を押すと「`」になってしまうし、「[」を入力しようとすると「]」になってしまう。

もしやと思ってIMEを「Google日本語入力」から「ATOK」に戻したら治った。不思議なのは、IMEがOFFの状態でも上記の状態になってしまうこと。なんだこれ。

しょうがないので超快適だった「Google日本語入力」をやめることにした。

報告しようと思ったが、ヘルプフォーラムに似たような事象を発見。

2番目はKasperskyが原因だったようだが、自分の環境にはインストールされていないため別要因。

3番目が近い。

文書管理システム

こんな感じの文書管理システムが欲しい。

履歴管理と検索ができて、Wiki形式のテキストをHTMLに変換して表示できるシステム。

文書管理システム2

一覧DBは検索DBと重複するので要らない。

検索にはHyperEstraierを採用。リポジトリはGitがいいけど使い慣れてるからとりあえずSVNで。

スケールはとりあえず考えない。

最終更新時刻: 2010年03月10日

文書管理システム3

PHPでプロトタイピング中。RubyのほうがHyperEstraierとの相性がいいので実用的っぽい。

最終更新時刻: 2010年03月10日

Social IMEがオープンソース化 / PostgreSQL 9.0の新機能

Social IMEがオープンソース化

http://code.google.com/p/social-ime/

IMEの作り方の参考になりそう。

PostgreSQL 9.0の新機能

http://lets.postgresql.jp/documents/technical/8.5/1

ホット・スタンバイとかストリーム・レプリケーションとか、高可用性に関する目玉機能が実装予定。

楽しみ。

最終更新時刻: 2010年03月16日

後で読む

最終更新時刻: 2010年03月18日

SQLのBNF

http://savage.net.au/SQL/

Oracleの構文については驚くことに公式ドキュメントでBNF記法が記載されていた。

http://otndnld.oracle.co.jp/document/products/lite10g/10.2.0/html/B19286-02/sqcmd.htm

最終更新時刻: 2010年03月30日