目的
古くから使われているwikiソフトウェアであるpukiwikiのデータを、Markdownで書けるCrowi(またはその派生であるCrowi-plus)に移行したい
想定する環境
- Ubuntu16.04LTS
- pukiwiki 1.5.0
- Crowi-plus v2.3.2
- docker-compose版にしておくとデータ転送に途中で失敗しても復旧が簡単なのでオススメ
移行の流れ
- pukiwikiのデータのファイル名をリネーム
- (EUC-JP版の場合のみ)pukiwikiのデータ内の文字コードをUTF-8に変換
- pukiwiki記法をMarkdown記法に変換
- データを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記法に変換
- こちらの記事のコードから流用した以下のコマンドをbashで実行
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に書き込む