Masakazu Takahashi
emasa****@gmail*****
2012年 5月 14日 (月) 19:15:25 JST
こんにちは。 2012/5/14 Akihiro MOTOKI <amoto****@gmail*****>: > 今回の問題を解決するには、[JM:00542] のスレッドで報告された問題に対して > 根本的な対処をする必要がありますが、どなたか見て頂けるのであればお願いします。 > man2html.c は訳が分からないスパゲッティコードですが・・・・ > 現在 JM で使っている man2html のソースは JM Git の admin/man-1.6g/man2html/ 以下に > 登録してあり、それをコンパイルしたものを /home/groups/l/li/linuxjm/bin/ 以下に置いています。 ちょろっと見てみました。 まず、man2html の中でも、.PD は無視(空行扱い)されるようになっています。 が、.TP の処理が以下のようになっていました。 (1) <DL>開始。"<DT>"も出力 (2) 1行読んで処理し出力 (3) "<DD>"を出力 ここで、(2) の“1 行”に、.PD 行やコメント行、空行も合致します。 そのため、問題となっていたような出力となります。 そこで、(2) の前に (1.5) 空行相当の行を読み飛ばす。 という処理を追加してみたところ、それっぽい結果になりました。 以下、ご参考までに、workaround なパッチです。 # なお、workaround と言っている理由は、「空行(相当)判定が ad hoc」、 # 「空行を読み飛ばす悪影響はないか?」「.TP 以外は怖いので見てない」 # というあたりですw --- man2html.c.orig 2012-05-14 17:47:49.564457056 +0900 +++ man2html.c 2012-05-14 18:56:55.777933209 +0900 @@ -1703,6 +1703,23 @@ skip_till_newline(char *c) return c; } +static char * +skip_blank_lines(char *c) +{ + char *c2; + + /* XXX: it's workaround */ + while ((c[0] == '\n') || + ((c[0] == '.') && + ((V(c[1],c[2]) == V('\\','"')) || + (V(c[1],c[2]) == V('P','D')) ))) { + c2 = skip_till_newline(c); + if (c2 == c) break; + c = c2; + } + return c; +} + int ifelseval=0; static char * @@ -2200,6 +2217,7 @@ scan_request(char *c) { case V('T','P'): dl_begin(); c=skip_till_newline(c); + c=skip_blank_lines(c); /* somewhere a definition ends with '.TP' */ if (!*c) still_dd=1; else { c=scan_troff(c,1,NULL); -- Masakazu Takahashi (emasaka)