[JM:00665] Re: man2html: unable to open or read file man1/bash.1

Back to archive index

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)




linuxjm-discuss メーリングリストの案内
Back to archive index