discuss@mandoc.bsd.lv
 help / color / mirror / Atom feed
From: Ingo Schwarze <schwarze@usta.de>
To: Aman Verma <amanraoverma+vim@gmail.com>
Cc: discuss@mandoc.bsd.lv
Subject: Re: In HTML output literal blocks should strip newline before closing pre
Date: Fri, 16 Oct 2020 19:46:36 +0200	[thread overview]
Message-ID: <20201016174636.GA5947@athene.usta.de> (raw)
In-Reply-To: <CA+c7JOBAxCfT35p6p-p3M9d3T9k=FDMt9E+UcyTHhEOf2MHfiQ@mail.gmail.com>

Hello Aman,

Aman Verma wrote on Thu, Oct 15, 2020 at 04:48:50PM -0400:

> The problem with `.Bd -literal` blocks in HTML output is that
> mandoc doesn't output the closing pre tag on the same line.
> If the element is indented, browsers will display an extra
> line since pre is telling them to preserve whitespace.
> 
> A good example of the issue is
> <https://mandoc.bsd.lv/man/mdoc.7.html#NAME>.
> The extra space is clearly visible. The source is
> 
>         <pre>.Nm name0 ,
>     .Nm name1 ,
>     .Nm name2
>     .Nd a one line description
>         </pre>
> 
> What I'm proposing is that it should look like
> 
>         <pre>.Nm name0 ,
>     .Nm name1 ,
>     .Nm name2
>     .Nd a one line description</pre>
> 
> This is what most Markdown processors do to solve the issue.

I think your analysis and proposed solution are both correct,
so i committed the following fix and installed the corrected
version in these locations:

  https://mandoc.bsd.lv/man/
  https://man.bsd.lv/mdoc.7
  https://man.openbsd.org/mdoc.7

Thank you for the bug report,
  Ingo


Log Message:
-----------
In HTML output, avoid printing a newline right after <pre>
and right before </pre> because that resulted in vertical
whitespace not requested by the manual page author.

Formatting bug reported by 
Aman Verma <amanraoverma plus vim at gmail dot com> on discuss@.

Modified Files:
--------------
    mandoc:
        html.c
        man_html.c
        mdoc_html.c
    mandoc/regress/man/HP:
        literal.out_html
    mandoc/regress/man/IP:
        literal.out_html
    mandoc/regress/man/RS:
        literal.out_html
    mandoc/regress/man/SY:
        literal.out_html
    mandoc/regress/man/TP:
        literal.out_html
    mandoc/regress/mdoc/Bd:
        nf.out_html
        paragraph.out_html
    mandoc/regress/mdoc/Rs:
        paragraph.out_html
    mandoc/regress/roff/sp:
        fill-man.out_html
    mandoc/regress/roff/string:
        dotT.out_html

Revision Data
-------------
Index: paragraph.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/mdoc/Rs/paragraph.out_html,v
retrieving revision 1.4
retrieving revision 1.5
diff -Lregress/mdoc/Rs/paragraph.out_html -Lregress/mdoc/Rs/paragraph.out_html -u -p -r1.4 -r1.5
--- regress/mdoc/Rs/paragraph.out_html
+++ regress/mdoc/Rs/paragraph.out_html
@@ -13,4 +13,3 @@
 <p class="Pp">in a paragraph:</p>
 <p class="Pp"><cite class="Rs"><span class="RsA">another author</span>,
     <i class="RsB">another book</i>.</cite></p>
-<pre>
Index: mdoc_html.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/mdoc_html.c,v
retrieving revision 1.340
retrieving revision 1.341
diff -Lmdoc_html.c -Lmdoc_html.c -u -p -r1.340 -r1.341
--- mdoc_html.c
+++ mdoc_html.c
@@ -349,12 +349,11 @@ print_mdoc_node(MDOC_ARGS)
 	if (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT)
 		return;
 
-	if (n->flags & NODE_NOFILL) {
-		html_fillmode(h, ROFF_nf);
-		if (n->flags & NODE_LINE)
-			print_endline(h);
-	} else
+	if ((n->flags & NODE_NOFILL) == 0)
 		html_fillmode(h, ROFF_fi);
+	else if (html_fillmode(h, ROFF_nf) == ROFF_nf &&
+	    n->tok != ROFF_fi && n->flags & NODE_LINE)
+		print_endline(h);
 
 	child = 1;
 	n->flags &= ~NODE_ENDED;
Index: man_html.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/man_html.c,v
retrieving revision 1.178
retrieving revision 1.179
diff -Lman_html.c -Lman_html.c -u -p -r1.178 -r1.179
--- man_html.c
+++ man_html.c
@@ -169,7 +169,12 @@ print_man_node(MAN_ARGS)
 	if (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT)
 		return;
 
-	html_fillmode(h, n->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi);
+	if ((n->flags & NODE_NOFILL) == 0)
+		html_fillmode(h, ROFF_fi);
+	else if (html_fillmode(h, ROFF_nf) == ROFF_nf &&
+	    n->tok != ROFF_fi && n->flags & NODE_LINE &&
+	    (n->prev == NULL || n->prev->tok != MAN_YS))
+		print_endline(h);
 
 	child = 1;
 	switch (n->type) {
@@ -253,13 +258,6 @@ print_man_node(MAN_ARGS)
 	}
 	if (t != NULL)
 		print_stagq(h, t);
-
-	if (n->flags & NODE_NOFILL && n->tok != MAN_YS &&
-	    (n->next != NULL && n->next->flags & NODE_LINE)) {
-		/* In .nf = <pre>, print even empty lines. */
-		h->col++;
-		print_endline(h);
-	}
 }
 
 static void
Index: html.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/html.c,v
retrieving revision 1.270
retrieving revision 1.271
diff -Lhtml.c -Lhtml.c -u -p -r1.270 -r1.271
--- html.c
+++ html.c
@@ -81,7 +81,7 @@ static	const struct htmldata htmltags[TA
 	{"h1",		HTML_TOPHRASE | HTML_NLAROUND},
 	{"h2",		HTML_TOPHRASE | HTML_NLAROUND},
 	{"p",		HTML_TOPHRASE | HTML_NLAROUND | HTML_INDENT},
-	{"pre",		HTML_TOPHRASE | HTML_NLALL | HTML_NOINDENT},
+	{"pre",		HTML_TOPHRASE | HTML_NLAROUND | HTML_NOINDENT},
 	{"a",		HTML_INPHRASE | HTML_TOPHRASE},
 	{"b",		HTML_INPHRASE | HTML_TOPHRASE},
 	{"cite",	HTML_INPHRASE | HTML_TOPHRASE},
Index: literal.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/man/HP/literal.out_html,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lregress/man/HP/literal.out_html -Lregress/man/HP/literal.out_html -u -p -r1.2 -r1.3
--- regress/man/HP/literal.out_html
+++ regress/man/HP/literal.out_html
@@ -1,18 +1,12 @@
 <p class="Pp HP">tag indented text</p>
 <p class="Pp">regular paragraph</p>
-<pre>
-literal
-text
-</pre>
-<pre>
-tag
+<pre>literal
+text</pre>
+<pre>tag
 literal
 hanged
-paragraph
-</pre>
-<pre>
-literal
-paragraph
-</pre>
+paragraph</pre>
+<pre>literal
+paragraph</pre>
 regular text
 <br/>
Index: literal.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/man/IP/literal.out_html,v
retrieving revision 1.6
retrieving revision 1.7
diff -Lregress/man/IP/literal.out_html -Lregress/man/IP/literal.out_html -u -p -r1.6 -r1.7
--- regress/man/IP/literal.out_html
+++ regress/man/IP/literal.out_html
@@ -3,42 +3,32 @@
   <dd>indented regular text</dd>
 </dl>
 <p class="Pp">new regular paragraph</p>
-<pre>
-literal
-text
-</pre>
+<pre>literal
+text</pre>
 <dl class="Bl-tag">
   <dt id="tag~2"><a class="permalink" href="#tag~2">tag</a></dt>
   <dd>
-    <pre>
-indented
+    <pre>indented
 literal
-text
-    </pre>
+text</pre>
   </dd>
 </dl>
-<pre>
-new
+<pre>new
 literal
-paragraph
-</pre>
+paragraph</pre>
 regular text
 <section class="Ss">
 <h2 class="Ss" id="literal_into_indented_paragraph"><a class="permalink" href="#literal_into_indented_paragraph">literal
   into indented paragraph</a></h2>
 <p class="Pp">regular text</p>
-<pre>
-literal
-text
-</pre>
+<pre>literal
+text</pre>
 <dl class="Bl-tag">
   <dt id="tag~3"><a class="permalink" href="#tag~3">tag</a></dt>
   <dd>
-    <pre>
-indented
+    <pre>indented
 literal
-text
-    </pre>
+text</pre>
     indented regular text</dd>
 </dl>
 <p class="Pp">new regular paragraph</p>
@@ -50,17 +40,13 @@ text
 <dl class="Bl-tag">
   <dt id="tag~4"><a class="permalink" href="#tag~4">tag</a></dt>
   <dd>indented regular text
-    <pre>
-indented
+    <pre>indented
 literal
-text
-    </pre>
+text</pre>
   </dd>
 </dl>
-<pre>
-new
+<pre>new
 literal
-paragraph
-</pre>
+paragraph</pre>
 regular text
 <br/>
Index: literal.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/man/RS/literal.out_html,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lregress/man/RS/literal.out_html -Lregress/man/RS/literal.out_html -u -p -r1.2 -r1.3
--- regress/man/RS/literal.out_html
+++ regress/man/RS/literal.out_html
@@ -1,18 +1,12 @@
   <br/>
   initial regular text</p>
-<pre>
-literal text
-before display
-</pre>
+<pre>literal text
+before display</pre>
 <div class="Bd-indent">
-<pre>
-This is a short line.
-This is a very long line that would wrap if it weren't in literal context.
-</pre>
+<pre>This is a short line.
+This is a very long line that would wrap if it weren't in literal context.</pre>
 </div>
-<pre>
-literal text
-after display
-</pre>
+<pre>literal text
+after display</pre>
 <p class="Pp">final regular text
   <br/>
Index: literal.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/man/SY/literal.out_html,v
retrieving revision 1.3
retrieving revision 1.4
diff -Lregress/man/SY/literal.out_html -Lregress/man/SY/literal.out_html -u -p -r1.3 -r1.4
--- regress/man/SY/literal.out_html
+++ regress/man/SY/literal.out_html
@@ -7,23 +7,17 @@
   </tr>
 </table>
 middle regular text
-<pre>
-literal text
-before display
-</pre>
+<pre>literal text
+before display</pre>
 <table class="Nm">
   <tr>
     <td><code class="Nm">command</code></td>
     <td>
-    <pre>
-<i>arguments</i>
-    </pre>
+    <pre><i>arguments</i></pre>
     </td>
   </tr>
 </table>
-<pre>
-literal text
-after display
-</pre>
+<pre>literal text
+after display</pre>
 <p class="Pp">final regular text
   <br/>
Index: literal.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/man/TP/literal.out_html,v
retrieving revision 1.4
retrieving revision 1.5
diff -Lregress/man/TP/literal.out_html -Lregress/man/TP/literal.out_html -u -p -r1.4 -r1.5
--- regress/man/TP/literal.out_html
+++ regress/man/TP/literal.out_html
@@ -3,23 +3,17 @@
   <dd>regular indented text</dd>
 </dl>
 <p class="Pp">regular paragraph</p>
-<pre>
-literal
-text
-</pre>
+<pre>literal
+text</pre>
 <dl class="Bl-tag">
   <dt id="tag~2"><a class="permalink" href="#tag~2">tag</a></dt>
   <dd>
-    <pre>
-indented
+    <pre>indented
 literal
-text
-    </pre>
+text</pre>
   </dd>
 </dl>
-<pre>
-literal
-paragraph
-</pre>
+<pre>literal
+paragraph</pre>
 regular text
 <br/>
Index: paragraph.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/mdoc/Bd/paragraph.out_html,v
retrieving revision 1.5
retrieving revision 1.6
diff -Lregress/mdoc/Bd/paragraph.out_html -Lregress/mdoc/Bd/paragraph.out_html -u -p -r1.5 -r1.6
--- regress/mdoc/Bd/paragraph.out_html
+++ regress/mdoc/Bd/paragraph.out_html
@@ -8,13 +8,11 @@
 back to normal
 <p class="Pp">another paragraph</p>
 <div class="Bd Pp" id="unfilled">
-<pre>
-<a class="permalink" href="#unfilled">unfilled</a> literal
+<pre><a class="permalink" href="#unfilled">unfilled</a> literal
 display
 <mark id="upara"></mark>
 <a class="permalink" href="#upara">unfilled</a> literal
-paragraph
-</pre>
+paragraph</pre>
 </div>
 again back to normal
 <br/>
Index: nf.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/mdoc/Bd/nf.out_html,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lregress/mdoc/Bd/nf.out_html -Lregress/mdoc/Bd/nf.out_html -u -p -r1.2 -r1.3
--- regress/mdoc/Bd/nf.out_html
+++ regress/mdoc/Bd/nf.out_html
@@ -1,20 +1,14 @@
-<pre>
-after .nf
-request
-</pre>
+<pre>after .nf
+request</pre>
 <p class="Pp">after .fi request</p>
 <div class="Bd Pp">
-<pre>
-in unfilled
-block
-</pre>
+<pre>in unfilled
+block</pre>
 after .fi request in unfilled block</div>
 after end of unfilled block
 <div class="Bd Pp">in filled block
-<pre>
-after .nf request
-in filled block
-</pre>
+<pre>after .nf request
+in filled block</pre>
 </div>
 after end of filled block
 <br/>
Index: fill-man.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/roff/sp/fill-man.out_html,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lregress/roff/sp/fill-man.out_html -Lregress/roff/sp/fill-man.out_html -u -p -r1.2 -r1.3
--- regress/roff/sp/fill-man.out_html
+++ regress/roff/sp/fill-man.out_html
@@ -1,7 +1,5 @@
 <p class="Pp">switch to no-fill mode:</p>
-<pre>
-in no-fill mode:
+<pre>in no-fill mode:
 
 back to
-fill mode:
-</pre>
+fill mode:</pre>
Index: dotT.out_html
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/roff/string/dotT.out_html,v
retrieving revision 1.3
retrieving revision 1.4
diff -Lregress/roff/string/dotT.out_html -Lregress/roff/string/dotT.out_html -u -p -r1.3 -r1.4
--- regress/roff/string/dotT.out_html
+++ regress/roff/string/dotT.out_html
@@ -1,3 +1,2 @@
 <p class="Pp">We are using the html device.</p>
 <p class="Pp">The device name can be overridden.</p>
-<pre>
--
 To unsubscribe send an email to discuss+unsubscribe@mandoc.bsd.lv


  reply	other threads:[~2020-10-16 17:46 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-15 20:48 Aman Verma
2020-10-16 17:46 ` Ingo Schwarze [this message]
2020-10-25 20:45   ` Michael Stapelberg
2020-10-26 13:26     ` Ingo Schwarze
2020-10-26 13:42       ` Michael Stapelberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201016174636.GA5947@athene.usta.de \
    --to=schwarze@usta.de \
    --cc=amanraoverma+vim@gmail.com \
    --cc=discuss@mandoc.bsd.lv \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).