LoginSignup
7
8

More than 5 years have passed since last update.

pukiwikiからCrowiに移行する

Posted at

目的

古くから使われている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に書き込む
7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8