In fragment identifiers, use ~%d for ordinal suffixes,
authorIngo Schwarze <schwarze@openbsd.org>
Mon, 20 Apr 2020 13:07:24 +0000 (13:07 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Mon, 20 Apr 2020 13:07:24 +0000 (13:07 +0000)
and reserve the character '~' for that purpose.

Bug found by validator.w3.org in openssl(1), which contains both a
tag "tls1_2" and a second instance of a tag "tls1", which also resulted
in "tls1_2", causing a clash.  Now, the second instance of "tls1" is
rendered as "tls1~2" instead, employing the newly reserved '~'.

html.c
regress/man/IP/literal.out_html
regress/man/TP/literal.out_html
regress/man/TP/vert.out_html
regress/mdoc/Bd/nested.out_html
regress/mdoc/Sh/tag.out_html

diff --git a/html.c b/html.c
index 6e18fac291f0f8ff3f712dbfe434b2646fe132ae..8b7937a5063818f1ba95062d2428e9af9a3e4fb6 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/* $Id: html.c,v 1.269 2020/04/19 15:16:56 schwarze Exp $ */
+/* $Id: html.c,v 1.270 2020/04/20 13:07:24 schwarze Exp $ */
 /*
  * Copyright (c) 2011-2015, 2017-2020 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -383,11 +383,12 @@ html_make_id(const struct roff_node *n, int unique)
         * permitted in URL-fragment strings according to the
         * explicit list at:
         * https://url.spec.whatwg.org/#url-fragment-string
+        * In addition, reserve '~' for ordinal suffixes.
         */
 
        for (cp = buf; *cp != '\0'; cp++)
                if (isalnum((unsigned char)*cp) == 0 &&
-                   strchr("!$&'()*+,-./:;=?@_~", *cp) == NULL)
+                   strchr("!$&'()*+,-./:;=?@_", *cp) == NULL)
                        *cp = '_';
 
        if (unique == 0)
@@ -407,7 +408,7 @@ html_make_id(const struct roff_node *n, int unique)
 
        if (entry->ord > 1) {
                cp = buf;
-               mandoc_asprintf(&buf, "%s_%d", cp, entry->ord);
+               mandoc_asprintf(&buf, "%s~%d", cp, entry->ord);
                free(cp);
        }
        return buf;
index 3b9cc429a3cabd65b1c7a8f6b172ea86c3e24916..aa0536e795c277a5408c3af9cc2ba3368bb08289 100644 (file)
@@ -8,7 +8,7 @@ literal
 text
 </pre>
 <dl class="Bl-tag">
-  <dt id="tag_2"><a class="permalink" href="#tag_2">tag</a></dt>
+  <dt id="tag~2"><a class="permalink" href="#tag~2">tag</a></dt>
   <dd>
     <pre>
 indented
@@ -32,7 +32,7 @@ literal
 text
 </pre>
 <dl class="Bl-tag">
-  <dt id="tag_3"><a class="permalink" href="#tag_3">tag</a></dt>
+  <dt id="tag~3"><a class="permalink" href="#tag~3">tag</a></dt>
   <dd>
     <pre>
 indented
@@ -48,7 +48,7 @@ text
   out of indented paragraph</a></h2>
 <p class="Pp">regular text</p>
 <dl class="Bl-tag">
-  <dt id="tag_4"><a class="permalink" href="#tag_4">tag</a></dt>
+  <dt id="tag~4"><a class="permalink" href="#tag~4">tag</a></dt>
   <dd>indented regular text
     <pre>
 indented
index 8b818ed8c686e998afd69998b8aa364ae7a231c2..914c7b5c6efefb69ed23e7584a036da385cf1ef2 100644 (file)
@@ -8,7 +8,7 @@ literal
 text
 </pre>
 <dl class="Bl-tag">
-  <dt id="tag_2"><a class="permalink" href="#tag_2">tag</a></dt>
+  <dt id="tag~2"><a class="permalink" href="#tag~2">tag</a></dt>
   <dd>
     <pre>
 indented
index 1124ed33dd7e31dae2e1f0e8b2df96b087f58f4f..4499432b1a5a37effe8f4a2b8ac140e1e4089c1f 100644 (file)
@@ -4,6 +4,6 @@
 <dl class="Bl-tag">
   <dt id="tag"><a class="permalink" href="#tag">tag</a></dt>
   <dd>text</dd>
-  <dt id="tag_2"><a class="permalink" href="#tag_2">tag</a></dt>
+  <dt id="tag~2"><a class="permalink" href="#tag~2">tag</a></dt>
   <dd>text</dd>
 </dl>
index bc71c2700f2a2cdff260c68a8002b0caff410ba3..9476189599a1f357df49c0445555a60ac643ece2 100644 (file)
@@ -8,10 +8,10 @@
 outer text</div>
 regular text
 <div class="Bd Pp
-  Bd-indent" id="outer_2"><a class="permalink" href="#outer_2">outer</a> text
+  Bd-indent" id="outer~2"><a class="permalink" href="#outer~2">outer</a> text
   (4n)
 <div class="Bd Pp
-  Bd-indent" id="inner_2"><a class="permalink" href="#inner_2">inner</a> text
+  Bd-indent" id="inner~2"><a class="permalink" href="#inner~2">inner</a> text
   (2n)</div>
 outer text
 <dl class="Bl-tag">
index d99c6d4da69be9c79326d6fcb7b56c23f1692b1c..0dd39398470a2c6b6b408661901b42d41fa39eac 100644 (file)
@@ -2,7 +2,7 @@
 </section>
 </section>
 <section class="Sh">
-<h1 class="Sh" id="DESCRIPTION_2"><a class="permalink" href="#DESCRIPTION_2">DESCRIPTION</a></h1>
+<h1 class="Sh" id="DESCRIPTION~2"><a class="permalink" href="#DESCRIPTION~2">DESCRIPTION</a></h1>
 <p class="Pp">Text in duplicate description section.</p>
 </section>
 <section class="Sh">