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詳しい人、ヘルプ!