Haddock で日本語が出ない原因を調べる

Haddock では non-ASCII な文字は全て ෝ 形式で出力するという仕様となっている。乱暴だとは思うが、とりあえずこうしておけばブラウザからはちゃんと見えるし、仕様については、まぁいいんでないかなと思う。

しかし実際にやってみると、これすらも出力されない。この原因を調べた。

文字列変換部分

< や > といった文字は、HTML で出力するためにはエスケープしなければならない。こういった処理を行なっているのが、次の関数。

-- Haddock.Utils.Html.hs

-- Processing Strings into Html friendly things.
-- This converts a String to a Html String.
stringToHtmlString :: String -> String
stringToHtmlString = concatMap fixChar
    where
      fixChar '<' = "&lt;"
      fixChar '>' = "&gt;"
      fixChar '&' = "&amp;"
      fixChar '"' = "&quot;"
      fixChar c
	| isAscii c = [c]
	| otherwise = "&#x" ++ showHex (ord c) ";"

ASCII ならそのまま、それ以外なら数値化した文字を 16 進表記で文字列化している。問題なさそうだ。

では、そもそもこの関数に渡される文字列はどうなっているのか。trace してみた。

import Debug.Trace (trace)

trace :: (Show a) => a -> a
trace' x = trace' (show x) x

stringToHtmlString = concatMap fixChar . trace'

結果は、日本語の部分が空白となって出力された。つまり stringToHtmlString に渡される前の時点で空白になっちゃってるので、stringToHtmlString でどうにかしようと思ってもどうにもできないでいるのだ。

文字列はどこからやってくるのか

じゃあ渡される文字列はどこから持ってきているものか。日本語の部分を出力する際の、呼び出し元をたどる。

ということを調べている時点で時間切れ。大まかには、GHC API を使ってインタフェースファイルから色々と情報を取り出しているようだった。つーことは GHC が生成するインタフェースファイルに non-ASCII な文字が残ってないってこと?うーむ。