]> git.cameronkatri.com Git - mandoc.git/commitdiff
When a .Tg is attached to a paragraph, attach the permalink
authorIngo Schwarze <schwarze@openbsd.org>
Sat, 18 Apr 2020 20:40:10 +0000 (20:40 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Sat, 18 Apr 2020 20:40:10 +0000 (20:40 +0000)
to the first word, or the first few words if they are short.

19 files changed:
Makefile.depend
html.c
html.h
man_validate.c
mdoc_html.c
mdoc_validate.c
read.c
regress/mdoc/Bd/paragraph.out_html
regress/mdoc/Pp/Makefile
regress/mdoc/Pp/arg.in
regress/mdoc/Pp/arg.out_ascii
regress/mdoc/Pp/arg.out_html [new file with mode: 0644]
regress/mdoc/Pp/arg.out_lint
regress/mdoc/Pp/arg.out_markdown
regress/mdoc/Pp/arg.out_tag
regress/mdoc/blank/transp.out_markdown
tag.c
tag.h
term_tag.c

index 5ac547126dd148257349a585ad6675ba9138e912..147f9daf1476d1ba65d2cc0d9bb51779dbd66e6c 100644 (file)
@@ -38,7 +38,7 @@ man.o: man.c config.h mandoc_aux.h mandoc.h roff.h man.h libmandoc.h roff_int.h
 man_html.o: man_html.c config.h mandoc_aux.h mandoc.h roff.h man.h out.h html.h main.h
 man_macro.o: man_macro.c config.h mandoc.h roff.h man.h libmandoc.h roff_int.h libman.h
 man_term.o: man_term.c config.h mandoc_aux.h mandoc.h roff.h man.h out.h term.h term_tag.h main.h
-man_validate.o: man_validate.c config.h mandoc_aux.h mandoc.h roff.h tag.h man.h libmandoc.h roff_int.h libman.h
+man_validate.o: man_validate.c config.h mandoc_aux.h mandoc.h roff.h man.h libmandoc.h roff_int.h libman.h tag.h
 mandoc.o: mandoc.c config.h mandoc_aux.h mandoc.h roff.h libmandoc.h roff_int.h
 mandoc_aux.o: mandoc_aux.c config.h mandoc.h mandoc_aux.h
 mandoc_msg.o: mandoc_msg.c config.h mandoc.h
@@ -56,18 +56,18 @@ mdoc_man.o: mdoc_man.c config.h mandoc_aux.h mandoc.h roff.h mdoc.h man.h out.h
 mdoc_markdown.o: mdoc_markdown.c mandoc_aux.h mandoc.h roff.h mdoc.h main.h
 mdoc_state.o: mdoc_state.c mandoc.h roff.h mdoc.h libmandoc.h roff_int.h libmdoc.h
 mdoc_term.o: mdoc_term.c config.h mandoc_aux.h roff.h mdoc.h out.h term.h term_tag.h main.h
-mdoc_validate.o: mdoc_validate.c config.h mandoc_aux.h mandoc.h mandoc_xr.h roff.h tag.h mdoc.h libmandoc.h roff_int.h libmdoc.h
+mdoc_validate.o: mdoc_validate.c config.h mandoc_aux.h mandoc.h mandoc_xr.h roff.h mdoc.h libmandoc.h roff_int.h libmdoc.h tag.h
 msec.o: msec.c config.h mandoc.h libmandoc.h msec.in
 out.o: out.c config.h mandoc_aux.h tbl.h out.h
 preconv.o: preconv.c config.h mandoc.h roff.h mandoc_parse.h libmandoc.h
-read.o: read.c config.h mandoc_aux.h mandoc.h roff.h tag.h mdoc.h man.h mandoc_parse.h libmandoc.h roff_int.h
+read.o: read.c config.h mandoc_aux.h mandoc.h roff.h mdoc.h man.h mandoc_parse.h libmandoc.h roff_int.h tag.h
 roff.o: roff.c config.h mandoc_aux.h mandoc_ohash.h compat_ohash.h mandoc.h roff.h mandoc_parse.h libmandoc.h roff_int.h tbl_parse.h eqn_parse.h predefs.in
 roff_html.o: roff_html.c mandoc.h roff.h out.h html.h
 roff_term.o: roff_term.c mandoc.h roff.h out.h term.h
 roff_validate.o: roff_validate.c mandoc.h roff.h libmandoc.h roff_int.h
 soelim.o: soelim.c config.h compat_stringlist.h
 st.o: st.c config.h mandoc.h roff.h libmdoc.h
-tag.o: tag.c config.h mandoc_aux.h mandoc_ohash.h compat_ohash.h roff.h mdoc.h tag.h
+tag.o: tag.c config.h mandoc_aux.h mandoc_ohash.h compat_ohash.h roff.h mdoc.h roff_int.h tag.h
 tbl.o: tbl.c config.h mandoc_aux.h mandoc.h tbl.h libmandoc.h tbl_parse.h tbl_int.h
 tbl_data.o: tbl_data.c config.h mandoc_aux.h mandoc.h tbl.h libmandoc.h tbl_int.h
 tbl_html.o: tbl_html.c config.h mandoc.h roff.h tbl.h out.h html.h
@@ -78,5 +78,5 @@ term.o: term.c config.h mandoc.h mandoc_aux.h out.h term.h main.h
 term_ascii.o: term_ascii.c config.h mandoc.h mandoc_aux.h out.h term.h manconf.h main.h
 term_ps.o: term_ps.c config.h mandoc_aux.h out.h term.h manconf.h main.h
 term_tab.o: term_tab.c mandoc_aux.h out.h term.h
-term_tag.o: term_tag.c config.h mandoc.h roff.h tag.h term_tag.h
+term_tag.o: term_tag.c config.h mandoc.h roff.h roff_int.h tag.h term_tag.h
 tree.o: tree.c config.h mandoc.h roff.h mdoc.h man.h tbl.h eqn.h main.h
diff --git a/html.c b/html.c
index e7adea028e5a940dcc48a694f378ee87c04aec06..3aef282a51ef9e65f1df85dcd3ee6ca45767eaf3 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/* $Id: html.c,v 1.267 2020/04/08 11:56:03 schwarze Exp $ */
+/* $Id: html.c,v 1.268 2020/04/18 20:40:10 schwarze Exp $ */
 /*
  * Copyright (c) 2011-2015, 2017-2020 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -878,6 +878,15 @@ print_gen_comment(struct html *h, struct roff_node *n)
 void
 print_text(struct html *h, const char *word)
 {
+       print_tagged_text(h, word, NULL);
+}
+
+void
+print_tagged_text(struct html *h, const char *word, struct roff_node *n)
+{
+       struct tag      *t;
+       char            *href;
+
        /*
         * Always wrap text in a paragraph unless already contained in
         * some flow container; never put it directly into a section.
@@ -898,13 +907,20 @@ print_text(struct html *h, const char *word)
        }
 
        /*
-        * Print the text, optionally surrounded by HTML whitespace,
-        * optionally manually switching fonts before and after.
+        * Optionally switch fonts, optionally write a permalink, then
+        * print the text, optionally surrounded by HTML whitespace.
         */
 
        assert(h->metaf == NULL);
        print_metaf(h);
        print_indent(h);
+
+       if (n != NULL && (href = html_make_id(n, 0)) != NULL) {
+               t = print_otag(h, TAG_A, "chR", "permalink", href);
+               free(href);
+       } else
+               t = NULL;
+
        if ( ! print_encode(h, word, NULL, 0)) {
                if ( ! (h->flags & HTML_NONOSPACE))
                        h->flags &= ~HTML_NOSPACE;
@@ -915,7 +931,8 @@ print_text(struct html *h, const char *word)
        if (h->metaf != NULL) {
                print_tagq(h, h->metaf);
                h->metaf = NULL;
-       }
+       } else if (t != NULL)
+               print_tagq(h, t);
 
        h->flags &= ~HTML_IGNDELIM;
 }
diff --git a/html.h b/html.h
index d9e6591214e49ce8435cdb9712a8cf511ddf1ace..07a42a0c3578cc7077b46161fb42c83bc89c960d 100644 (file)
--- a/html.h
+++ b/html.h
@@ -1,4 +1,4 @@
-/* $Id: html.h,v 1.107 2020/03/13 15:32:28 schwarze Exp $ */
+/* $Id: html.h,v 1.108 2020/04/18 20:40:10 schwarze Exp $ */
 /*
  * Copyright (c) 2017, 2018, 2019, 2020 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -127,6 +127,8 @@ struct tag   *print_otag_id(struct html *, enum htmltag, const char *,
                        struct roff_node *);
 void             print_tagq(struct html *, const struct tag *);
 void             print_stagq(struct html *, const struct tag *);
+void             print_tagged_text(struct html *, const char *,
+                       struct roff_node *);
 void             print_text(struct html *, const char *);
 void             print_tblclose(struct html *);
 void             print_tbl(struct html *, const struct tbl_span *);
index ee634f50600b81d4c89215e770e3221837a96b84..84fc442429831dcd50c467c3d407dff156d11bbf 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: man_validate.c,v 1.152 2020/04/04 20:33:33 schwarze Exp $ */
+/* $Id: man_validate.c,v 1.153 2020/04/18 20:40:10 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2012-2020 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
 #include "mandoc_aux.h"
 #include "mandoc.h"
 #include "roff.h"
-#include "tag.h"
 #include "man.h"
 #include "libmandoc.h"
 #include "roff_int.h"
 #include "libman.h"
+#include "tag.h"
 
 #define        CHKARGS   struct roff_man *man, struct roff_node *n
 
index dd0f1235481abc7f6c7f07a1335efee0a74cb5b5..bff4757f60d0734f006af96330f6a29b38b081e9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mdoc_html.c,v 1.338 2020/04/06 10:16:17 schwarze Exp $ */
+/* $Id: mdoc_html.c,v 1.339 2020/04/18 20:40:10 schwarze Exp $ */
 /*
  * Copyright (c) 2014-2020 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -377,10 +377,13 @@ print_mdoc_node(MDOC_ARGS)
                }
                t = h->tag;
                t->refcnt++;
-               if (NODE_DELIMC & n->flags)
+               if (n->flags & NODE_DELIMC)
                        h->flags |= HTML_NOSPACE;
-               print_text(h, n->string);
-               if (NODE_DELIMO & n->flags)
+               if (n->flags & NODE_HREF)
+                       print_tagged_text(h, n->string, n);
+               else
+                       print_text(h, n->string);
+               if (n->flags & NODE_DELIMO)
                        h->flags |= HTML_NOSPACE;
                break;
        case ROFFT_EQN:
index 82c5e43c6bc4ccda6c52d4f4bf9465e34d8ff975..129e4730afb48295aad2a3b6d5a5d0c43023bc63 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mdoc_validate.c,v 1.384 2020/04/08 11:56:03 schwarze Exp $ */
+/* $Id: mdoc_validate.c,v 1.385 2020/04/18 20:40:10 schwarze Exp $ */
 /*
  * Copyright (c) 2010-2020 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
 #include "mandoc.h"
 #include "mandoc_xr.h"
 #include "roff.h"
-#include "tag.h"
 #include "mdoc.h"
 #include "libmandoc.h"
 #include "roff_int.h"
 #include "libmdoc.h"
+#include "tag.h"
 
 /* FIXME: .Bl -diag can't have non-text children in HEAD. */
 
diff --git a/read.c b/read.c
index a47240c42761513c62f65f05242264179da898b3..920459649eb01fb3f5f62a6bd900374ffb71fd50 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,6 +1,6 @@
-/* $Id: read.c,v 1.217 2020/04/07 22:56:02 schwarze Exp $ */
+/* $Id: read.c,v 1.218 2020/04/18 20:40:10 schwarze Exp $ */
 /*
- * Copyright (c) 2010-2019 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010-2020 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012 Joerg Sonnenberger <joerg@netbsd.org>
  *
 #include "mandoc_aux.h"
 #include "mandoc.h"
 #include "roff.h"
-#include "tag.h"
 #include "mdoc.h"
 #include "man.h"
 #include "mandoc_parse.h"
 #include "libmandoc.h"
 #include "roff_int.h"
+#include "tag.h"
 
 #define        REPARSE_LIMIT   1000
 
@@ -708,7 +708,7 @@ mparse_result(struct mparse *curp)
                        mdoc_validate(curp->man);
                else
                        man_validate(curp->man);
-               tag_postprocess(curp->man->meta.first);
+               tag_postprocess(curp->man, curp->man->meta.first);
        }
        return &curp->man->meta;
 }
index f537335e0c70f32c532382b5e2f36b2af57f8a52..07a0276995f9a5e4219e926097da617eb7bbb0dd 100644 (file)
@@ -1,6 +1,8 @@
-<p class="Pp" id="npara">normal paragraph</p>
+<p class="Pp" id="npara"><a class="permalink" href="#npara">normal</a>
+  paragraph</p>
 <div class="Bd Pp" id="filled">filled display
-<p class="Pp" id="fpara">paragraph in display</p>
+<p class="Pp" id="fpara"><a class="permalink" href="#fpara">paragraph</a> in
+    display</p>
 </div>
 back to normal
 <p class="Pp">another paragraph</p>
@@ -9,7 +11,7 @@ back to normal
 unfilled
 display
 <mark id="upara"></mark>
-unfilled
+<a class="permalink" href="#upara">unfilled</a>
 paragraph
 </pre>
 </div>
index 03d32774e3dd38c78c7bc80d446e8abb9da380af..d13a1f3e190d9172cfdebe3a487a9fe11c2c9aa3 100644 (file)
@@ -1,7 +1,8 @@
-# $OpenBSD: Makefile,v 1.7 2020/04/06 09:55:50 schwarze Exp $
+# $OpenBSD: Makefile,v 1.8 2020/04/18 20:28:46 schwarze Exp $
 
 REGRESS_TARGETS         = arg
 TAG_TARGETS     = arg
 LINT_TARGETS    = arg
+HTML_TARGETS    = arg
 
 .include <bsd.regress.mk>
index 1e62c80c3773c7431591e6e0efeb3a89f9dc7fc0..542cb759f3a183d3606c37b404c994e10ea159b2 100644 (file)
@@ -1,11 +1,13 @@
-.\" $OpenBSD: arg.in,v 1.5 2020/04/06 09:55:50 schwarze Exp $
-.Dd $Mdocdate: April 6 2020 $
+.\" $OpenBSD: arg.in,v 1.6 2020/04/18 20:28:46 schwarze Exp $
+.Dd $Mdocdate: April 18 2020 $
 .Dt PP-ARG 1
 .Os
 .Sh NAME
 .Nm Pp-arg
 .Nd paragraph macro with arguments
 .Sh DESCRIPTION
+BEGINTEST
+.Pp
 line 1
 .Tg first
 .Pp drop this
@@ -17,3 +19,5 @@ line 4
 .Tg last
 .Pp
 final text
+.Pp
+ENDTEST
index 70eebb4d991ceddc9609fae78a609ffd1533214b..86ebee94aad3e0ccd082558c3d48f932c04a9cb3 100644 (file)
@@ -4,6 +4,8 @@ N\bNA\bAM\bME\bE
      P\bPp\bp-\b-a\bar\brg\bg - paragraph macro with arguments
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+     BEGINTEST
+
      line 1
 
      line 2
@@ -13,4 +15,6 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
 
      final text
 
-OpenBSD                          April 6, 2020                         OpenBSD
+     ENDTEST
+
+OpenBSD                         April 18, 2020                         OpenBSD
diff --git a/regress/mdoc/Pp/arg.out_html b/regress/mdoc/Pp/arg.out_html
new file mode 100644 (file)
index 0000000..c601661
--- /dev/null
@@ -0,0 +1,6 @@
+<p class="Pp">line 1</p>
+<p class="Pp" id="first"><a class="permalink" href="#first">line 2</a>
+  <br/>
+  line 3</p>
+<p class="Pp">line 4</p>
+<p class="Pp" id="last"><a class="permalink" href="#last">final</a> text</p>
index 40d77064c329e389e53a3dca301d51eda619b219..79cf10cb31650a20354778501c0e351c3f93b55e 100644 (file)
@@ -1,3 +1,3 @@
-mandoc: arg.in:13:5: ERROR: skipping all arguments: br drop this
-mandoc: arg.in:15:8: ERROR: skipping excess arguments: sp ... drop this
-mandoc: arg.in:11:2: ERROR: skipping all arguments: Pp drop
+mandoc: arg.in:15:5: ERROR: skipping all arguments: br drop this
+mandoc: arg.in:17:8: ERROR: skipping excess arguments: sp ... drop this
+mandoc: arg.in:13:2: ERROR: skipping all arguments: Pp drop
index 0b06ac9ea6006713abce5f374a9b44b0c7441213..a793f5a1254c0e10fe3ee7e1ff1bb5204d38657d 100644 (file)
@@ -6,6 +6,8 @@ PP-ARG(1) - General Commands Manual
 
 # DESCRIPTION
 
+BEGINTEST
+
 line 1
 
 line 2  
@@ -13,6 +15,9 @@ line 3
 
 line 4
 
-final text
+final
+text
+
+ENDTEST
 
-OpenBSD - April 6, 2020
+OpenBSD - April 18, 2020
index 443b1be2c9bb9e72ddf74f86d1412b3218007ce1..c58db3688f93807301c59df3e7f51c1ede026f9e 100644 (file)
@@ -1,4 +1,4 @@
 NAME 3
 DESCRIPTION 6
-first 9
-last 14
+first 11
+last 16
index 9c8ac8258fa0277a0e99afdf57d8f547e0d96b23..6c317e4663272140d3ae0987d1c91baf6034ceca 100644 (file)
@@ -23,7 +23,8 @@ Pp sp 2v:
 
 sp Pp:
 
-Double sp:
+Double
+sp:
 
 br blank:
 
diff --git a/tag.c b/tag.c
index 0c330f4638029e635b5bb860c9967ae5341ff699..105f19e1270cd10f08b91c208d7c9ea9d22186a1 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -1,4 +1,4 @@
-/* $Id: tag.c,v 1.34 2020/04/08 11:56:04 schwarze Exp $ */
+/* $Id: tag.c,v 1.35 2020/04/18 20:40:10 schwarze Exp $ */
 /*
  * Copyright (c) 2015,2016,2018,2019,2020 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -32,6 +32,7 @@
 #include "mandoc_ohash.h"
 #include "roff.h"
 #include "mdoc.h"
+#include "roff_int.h"
 #include "tag.h"
 
 struct tag_entry {
@@ -258,13 +259,37 @@ tag_move_id(struct roff_node *n)
  * to the beginning of the respective paragraphs.
  */
 void
-tag_postprocess(struct roff_node *n)
+tag_postprocess(struct roff_man *man, struct roff_node *n)
 {
+       struct roff_node        *nn;
+       char                    *cp;
+
        if (n->flags & NODE_ID) {
                switch (n->tok) {
+               case MDOC_Pp:
+                       nn = n->next;
+                       if (nn == NULL || nn->type != ROFFT_TEXT ||
+                           *nn->string == '\0' || *nn->string == ' ')
+                               break;
+                       /* Use the first few letters for the permalink. */
+                       cp = nn->string;
+                       while (cp != NULL && cp - nn->string < 5)
+                               cp = strchr(cp + 1, ' ');
+                       if (cp != NULL && cp[1] != '\0') {
+                               /* Split a longer text node. */
+                               man->last = nn;
+                               man->next = ROFF_NEXT_SIBLING;
+                               roff_word_alloc(man, nn->line,
+                                   nn->pos + (cp - nn->string), cp + 1);
+                               man->last->flags = nn->flags;
+                               *cp = '\0';
+                       }
+                       assert(nn->tag == NULL);
+                       nn->tag = mandoc_strdup(n->tag);
+                       nn->flags |= NODE_HREF;
+                       break;
                case MDOC_Bd:
                case MDOC_Bl:
-               case MDOC_Pp:
                        /* XXX No permalink for now. */
                        break;
                default:
@@ -281,5 +306,5 @@ tag_postprocess(struct roff_node *n)
                }
        }
        for (n = n->child; n != NULL; n = n->next)
-               tag_postprocess(n);
+               tag_postprocess(man, n);
 }
diff --git a/tag.h b/tag.h
index c6b6028b649972af7b80d63cefd43255eb567995..1eace6fd515eeef23895c29dac911bde26ad54a9 100644 (file)
--- a/tag.h
+++ b/tag.h
@@ -1,4 +1,4 @@
-/* $Id: tag.h,v 1.13 2020/04/07 22:56:02 schwarze Exp $ */
+/* $Id: tag.h,v 1.14 2020/04/18 20:40:10 schwarze Exp $ */
 /*
  * Copyright (c) 2015, 2018, 2019, 2020 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -31,5 +31,5 @@
 void            tag_alloc(void);
 int             tag_exists(const char *);
 void            tag_put(const char *, int, struct roff_node *);
-void            tag_postprocess(struct roff_node *);
+void            tag_postprocess(struct roff_man *, struct roff_node *);
 void            tag_free(void);
index 201471c5dd0ed401ab4a02cdd737b37a98d4a58f..7895d872ea0e918a0c544e295643c73f6460a53b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: term_tag.c,v 1.3 2020/04/08 11:56:04 schwarze Exp $ */
+/* $Id: term_tag.c,v 1.4 2020/04/18 20:40:10 schwarze Exp $ */
 /*
  * Copyright (c) 2015,2016,2018,2019,2020 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -31,6 +31,7 @@
 
 #include "mandoc.h"
 #include "roff.h"
+#include "roff_int.h"
 #include "tag.h"
 #include "term_tag.h"