aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tag.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2020-04-19 16:36:16 +0000
committerIngo Schwarze <schwarze@openbsd.org>2020-04-19 16:36:16 +0000
commit53e82aa8ae9cb194d4b8418e8dd4223a4a5097d3 (patch)
tree574a3520a99a5f38f585bd966a97f48de110c942 /tag.c
parent4ee381e7bf5e05beda919be00d162d31ae86f4b8 (diff)
downloadmandoc-53e82aa8ae9cb194d4b8418e8dd4223a4a5097d3.tar.gz
mandoc-53e82aa8ae9cb194d4b8418e8dd4223a4a5097d3.tar.zst
mandoc-53e82aa8ae9cb194d4b8418e8dd4223a4a5097d3.zip
When .Bd, .D1, or .Dl is tagged, attach the permalink
to the first few letters, similar to what was earlier done for .Pp.
Diffstat (limited to 'tag.c')
-rw-r--r--tag.c65
1 files changed, 41 insertions, 24 deletions
diff --git a/tag.c b/tag.c
index 105f19e1..fcaad99f 100644
--- a/tag.c
+++ b/tag.c
@@ -1,4 +1,4 @@
-/* $Id: tag.c,v 1.35 2020/04/18 20:40:10 schwarze Exp $ */
+/* $Id: tag.c,v 1.36 2020/04/19 16:36:16 schwarze Exp $ */
/*
* Copyright (c) 2015,2016,2018,2019,2020 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -43,6 +43,8 @@ struct tag_entry {
char s[];
};
+static void tag_move_href(struct roff_man *,
+ struct roff_node *, const char *);
static void tag_move_id(struct roff_node *);
static struct ohash tag_data;
@@ -254,6 +256,39 @@ tag_move_id(struct roff_node *n)
}
/*
+ * When a paragraph is tagged and starts with text,
+ * move the permalink to the first few words.
+ */
+static void
+tag_move_href(struct roff_man *man, struct roff_node *n, const char *tag)
+{
+ char *cp;
+
+ if (n == NULL || n->type != ROFFT_TEXT ||
+ *n->string == '\0' || *n->string == ' ')
+ return;
+
+ cp = n->string;
+ while (cp != NULL && cp - n->string < 5)
+ cp = strchr(cp + 1, ' ');
+
+ /* If the first text node is longer, split it. */
+
+ if (cp != NULL && cp[1] != '\0') {
+ man->last = n;
+ man->next = ROFF_NEXT_SIBLING;
+ roff_word_alloc(man, n->line,
+ n->pos + (cp - n->string), cp + 1);
+ man->last->flags = n->flags & ~NODE_LINE;
+ *cp = '\0';
+ }
+
+ assert(n->tag == NULL);
+ n->tag = mandoc_strdup(tag);
+ n->flags |= NODE_HREF;
+}
+
+/*
* When all tags have been set, decide where to put
* the associated permalinks, and maybe move some tags
* to the beginning of the respective paragraphs.
@@ -261,34 +296,16 @@ tag_move_id(struct roff_node *n)
void
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;
+ tag_move_href(man, n->next, n->tag);
break;
case MDOC_Bd:
+ case MDOC_D1:
+ case MDOC_Dl:
+ tag_move_href(man, n->child, n->tag);
+ break;
case MDOC_Bl:
/* XXX No permalink for now. */
break;