pukiwiki
Crowi

pukiwikiからCrowiに移行する

目的

古くから使われているwikiソフトウェアであるpukiwikiのデータを、Markdownで書けるCrowi(またはその派生であるCrowi-plus)に移行したい

想定する環境

  • Ubuntu16.04LTS
  • pukiwiki 1.5.0
  • Crowi-plus v2.3.2
    • docker-compose版にしておくとデータ転送に途中で失敗しても復旧が簡単なのでオススメ

移行の流れ

  1. pukiwikiのデータのファイル名をリネーム
  2. (EUC-JP版の場合のみ)pukiwikiのデータ内の文字コードをUTF-8に変換
  3. pukiwiki記法をMarkdown記法に変換
  4. データをcrowiへ送信

以下、この流れに沿って具体的な作業を説明する

pukiwikiのデータのファイル名をリネーム

  • pukiwikiのindex.phpなどが置かれているディレクトリへ移動する
  • こちらの記事にあるコードをlswiki.plとして保存
  • bashで以下のコマンドを実行
    • wikiディレクトリ配下にpukiwikiのデータファイルが格納されている
    • wiki_modディレクトリに変換したファイルが格納される
for file in $(ls wiki/*); do
  install -p -D $file wiki_mod/`./lswiki.pl -f euc-jp -s $file`
done

(EUC-JP版の場合のみ)pukiwikiのデータ内の文字コードをUTF-8に変換

  • 以下をbashで実行する
for file in $(find wiki_mod -type f); do
  iconv -f EUCJP -t UTF8 $file > $file.utf8;
  mv $file.utf8 $file;
done

pukiwiki記法をMarkdown記法に変換

find wiki_mod -type f | xargs sed -i -e 's/ \[#[0-9a-z]\+\]$//g' -e 's/^\*\*\*/###/g' -e 's/^\*\*/##/g' -e 's/^\*/#/g' -e 's/^---/    -/g' -e 's/^--/  -/g' -e 's/^\(\s*\)-\([^ ]\)/\1- \2/g' -e 's/^\(\s*\)+\([^ ]\)/\1+ \2/g' -e 's/&br;/<br>/g' -e 's/^#pre{*/```/g' -e 's/^}}*/```/g' -e 's/%%/~~/g' -e "s/^\#lsx/`echo -ne '\u0024'`lsx()/g"

データをcrowiへ送信

  • 以下のpythonスクリプトのurl, access_token, user_idをそれぞれCrowiで設定されている適切なものに修正し、pythonで実行する
import requests
import os
import sys

url = 'http://example.com:3000/_api/pages.create'
pukiwiki_root = "wiki_mod"
access_token = "replace_with_your_access_token"
user_id = "your_id"

for root, dirs, names in os.walk(pukiwiki_root):
    for fn in names:
        fpath = os.path.join(root, fn)
        fn_base, ext = os.path.splitext(os.path.relpath(fpath,start=pukiwiki_root))
        body = u''
        with open(fpath, 'r') as f:
            body = f.read()

        data = {"access_token": access_token,
                "path": "/user/" + user_id + "/" + fn_base,
                "body": body}

        rsult = requests.request(method='post', url=url, data=data)
        if rsult.status_code != requests.codes.ok:
            print("Error! status code : " + str(rsult.status_code))
            sys.exit(1)
        print(rsult.text)

注意点

  • pukiwikiにスペースが含まれるタイトルはファイル名の変換に失敗する
  • CrowiのAPIの仕様は公開されていないため、将来的には変更される可能性がある
  • 上記コードは無保証なので、データバックアップを取った上で自己責任でご利用ください

まとめ

  • ポイントとしては以下の3点
    • ファイル名、ファイル中の文字コードをUTF-8に変換する
    • pukiwiki記法をmarkdown記法へ変換する
    • CrowiのAPIを使ってpukiwikiのデータをCrowiに書き込む