WikklyTextの日本語タイトル不具合を調査しかけて挫折
ローカルでWikiだったらTiddlyWikiで良いじゃん!とか思いながらWikklyTextを試してみたPython大好きbonlifeです。
内容に日本語が利用できるが、タイトルでは不具合があるようだ。
どれどれ、と動作確認。日本語のタイトルでも普通に動く!嘘つき!と一瞬思いましたが、やっぱり問題はありましたよ。"テスト"ってタイトルの文書を作成すると、そのファイル名が ___.html のようにアンダーバーになってしまうマジック!この後、"バロス"ってタイトルの文書を作成しようとすると、一見成功したように見えて、ファイルが作成できない…。"バロス"のリンクをクリックしても"テスト"が表示されるです。(ファイルが作成できないわけじゃなく、アクセスできない?)
いうことでそれっぽいコードを適当にチェック。
- store\wikiStore.py (一部抜粋)
def makeFSname(name): """ Given a WikklyItem name, convert it to a name that can safely be used as a filename (across platforms). Returns filename (basename only - no extension or path). """ #print "CALC STORED NAME",repr(name) # convert to plain ASCII, replacing bad chars if isinstance(name,unicode): name = name.encode('ascii','replace') # invalid under (at least) win32: \/:*?"<>| for c in '\\/*?<>|': name = name.replace(c, '_') # replace all with '_' except these two ... name = name.replace('"', "'") name = name.replace(':', "-") # other problem chars name = name.replace('\n', '_').replace('\r','_') #print "NAME OUT",repr(name) return name
ファイル名生成に使われてるこの関数が犯人っぽい。encode()で'ascii'に変換する際、第2引数の'replace'でasciiにならない文字を ? に置き換えてます。その後、次のforループで ? は '_' に置き換えられてますね。ガーン…。urllibとかurllib2のquote使えば良いっぽい気がしますが、どうなんでしょう。
それにしたって、タイトル以外は日本語通るってどういうことよ、と思ってもう少し調べてみました。
- store\wikiStore.py (一部抜粋)
class WikklyItem(object): """ A WikklyItem represents a single piece of raw (unrendered) wikitext content. """ def __init__(self, name, content=u'', tags=None, author=None, ctime=None, mtime=None, content_type='WikklyText', revision=None): # For ALL text members: Text has already been decoded/unescaped. # sanity checks assert(ctime is None or isinstance(ctime, WikklyDateTime)) assert(mtime is None or isinstance(mtime, WikklyDateTime)) # name/title of this item (not filename) self.name = name # author of this item (unicode) self.author = author or u'Unknown' # creation time (WikklyDateTime) self.ctime = ctime or WikklyDateTime(from_localtime=DT.datetime.now()) # modification time (WikklyDateTime) self.mtime = mtime or WikklyDateTime(from_localtime=DT.datetime.now()) # tags (list of unicode strings) self.tags = tags or [] # wikitext content as unicode. self.content = content # Remember where wikitext came from, since different flags need to # be set to render each correctly with the WikklyText engine. # # Valid types: # 'WikklyText': Native WikklyText. # 'TiddlyWiki': Wikitext from TiddlyWiki HTML file. self.content_type = content_type # a store-specific 'revision' number (set to None if not used for store) # (this does NOT imply any ability to go back to a previous revision!) self.revision = revision
文字列が入りそうな項目の中で、nameのみunicodeを想定してないっぽい。フーン…。どういう順序でどこから何を呼び出しているのか整理して、修正したいところですが、気力が維持出来ず…。とりあえず、ここまで。Python詳しい人、ヘルプ!
ちなみに、Searchで日本語を入力するとアウトです。こんな結果になっちゃいます。
<type 'exceptions.UnicodeDecodeError'>: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
検索まわりも調べる必要がありそうですね。このUnicodeDecodeErrorになりそうな箇所を効率良く見つける方法ってないのかなぁ…。Python詳しい人、ヘルプ!