aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tag.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2020-04-18 20:40:10 +0000
committerIngo Schwarze <schwarze@openbsd.org>2020-04-18 20:40:10 +0000
commitfcd488027f8d6316b641cffa970d451df8a92c76 (patch)
treed6d2d4b2d01db1839ff1d98268209c616b5304bb /tag.c
parent637b922ab2b2aa18419a0abed18ae9d2fed4e50a (diff)
downloadmandoc-fcd488027f8d6316b641cffa970d451df8a92c76.tar.gz
mandoc-fcd488027f8d6316b641cffa970d451df8a92c76.tar.zst
mandoc-fcd488027f8d6316b641cffa970d451df8a92c76.zip
When a .Tg is attached to a paragraph, attach the permalink
to the first word, or the first few words if they are short.
Diffstat (limited to 'tag.c')
-rw-r--r--tag.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/tag.c b/tag.c
index 0c330f46..105f19e1 100644
--- 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);
}