あおしまの日記

2018-01-12 Pythonに挑戦してみた

Yukiwikiのページ群の名前をunquoteする(python3)

Yukiwikiのページ群の名前をunquoteする(python3)を含むブックマーク Yukiwikiのページ群の名前をunquoteする(python3)のブックマークコメント

このダイアリーは、もともとYukiwikiを使っていた時の情報を、記法が似通った場所に移行させたいという事で開設したものでした。その時もごく一部の公開すべきネタは移行しておりました。

ただそれも限界がありますし、Scrapboxは増井さんからお誘いを受けてぼちぼち使っていまして、そろそろYukiwiki時代の全情報を移行しようかなあという気になりました。

Yukiwikiの個々のデータはテキストファイルになっていて、quoteされた文字列がファイル名になっているので、どのファイルが何なのかがわかりにくいのが難点です。そこで、今後の作業に先立ち各ページのファイル名を可視化するため、ファイル名をunquoteすることにしました。

ファイル名を2文字ずつ行列にし、%で挟んで電車つなぎにした上で、urllib.parseに通してunuoteした上で、ファイル名の変更コピーをする作戦です。

pythonの手習い目的です。もっとエレガントな方法があるはずですが、今手出しできる材料ではこれが限界でした。

#エラーと戦っていまだによくわからないけれども。

注意:予め直下に出力ディレクトリ./res/を用意しとかないと死にます。

 import os
 import sys
 import glob
 import re
 import urllib.parse
 import shutil
 
 path = "./cgi-bin/wal/WalWiki/wiki"
 files = glob.glob(path + '/*.txt')
 
 outpath = "./res/"
 
 for f in files:
 	val = re.findall(r"[A-Fa-f0-9][A-Fa-f0-9]",f)
 	ch = '%'+'%'.join(val)
 	result = urllib.parse.unquote_plus(ch, encoding='euc_jp', errors='ignore')
 #	print (result)
 
 # filenameのエスケープ
 #	result2 = result.replace('/','_')
 	result2 = re.sub(r'[/:]+', '_', result)
 	
 	newname = outpath + result2 + '.txt'
 #	print (newname)
 	shutil.copy(f, newname)

Yukiwikiの個別ページをScrapboxの書式に擦り合わせる

Yukiwikiの個別ページをScrapboxの書式に擦り合わせるを含むブックマーク Yukiwikiの個別ページをScrapboxの書式に擦り合わせるのブックマークコメント

ファイル名をunquoteしてある前提で、YukiwikiのファイルをScrapboxに貼り付けて困るのは、リンクのルールが一重大かっこである点です。二重大かっこですと、太字になるだけです。

そこで、YukiwikiのWikinameすなわちリンクワードを、二重大かっこ[[]]から一重大かっこ[]に置換することで、コピペ貼り付けの時にいちいち括弧を取り除く必要がなくなります。

ほんとはこれにURLを一重かっこで囲うのも入れたかったが、とりあえず移行できればいいのでさぼりました。URL続きの日本語もリンクになってしまうので、そのうちやります。InterWikiURL補完したかったのですが、これは難しそうなのでやっていません。

こちらもpythonでやりたかったですが、上ので懲りたので、目的優先でperlに逃げました。この作業はWindows上でやりましたので、ファイル名がshiftjisであることを前提にしています。他の環境の方はEncodeのあたりを調整してください。

これのおかげで、だいぶコピペが捗りまして、400ページ強の全データをScrapboxに移行でき、ページ同士のリンク関係もある程度Scrapbox上で構築できました。



use Encode;
 
 while(<.//res//*.txt>){
 	$fname = $_;
 	#ファイル名だけ抽出する(*.txt)
 	$fname =~ s/\.\/\/res\/\///;
 	print $fname."\n";
 
 	#ファイルをオープン
 	open(FH,".//res//$fname");
 	open(FH2,"> .//res2//$fname");
 
 	# Scrapbox用に、先頭にファイル名=タイトル名(.txtを取り去る)を書き込む
 	#ファイル名=shiftjisなので、デコードした上で本文と同じEUCで書きこむ。
 	$fname =~ s/\.txt$//;
 	my $decoded = Encode::decode("shiftjis", $fname);
 	my $fname_euc = Encode::encode("euc-jp", $decoded);
 	print  FH2 $fname_euc."\n\n";
 
 	#ファイルを1行ごとに読み込み、2重カギカッコを1重にして吐き出す
 	while(<FH>){
 		$line = $_;
 		$line =~ s/\[\[(.+)\]\]/\[$1\]/g;
 		print FH2 $line; 
 	}
 	
 	#ファイルを閉じる
 	close (FH2);
 	close (FH);
 }