aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/mdoc_html.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2018-10-02 14:56:47 +0000
committerIngo Schwarze <schwarze@openbsd.org>2018-10-02 14:56:47 +0000
commitcc61d00ed522f99c9f1a34fcc6add2d202942885 (patch)
treebd523708468309e4a2f716485ca75294c2822d66 /mdoc_html.c
parentdfc72caad2158b1226363fe39e7bfa995ef68f78 (diff)
downloadmandoc-cc61d00ed522f99c9f1a34fcc6add2d202942885.tar.gz
mandoc-cc61d00ed522f99c9f1a34fcc6add2d202942885.tar.zst
mandoc-cc61d00ed522f99c9f1a34fcc6add2d202942885.zip
Add an option -T html -O toc to add a brief table of contents near
the top of HTML pages containing at least two non-standard sections. Suggested by Adam Kalisz and discussed with kristaps@ during EuroBSDCon 2018.
Diffstat (limited to 'mdoc_html.c')
-rw-r--r--mdoc_html.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/mdoc_html.c b/mdoc_html.c
index fd181b60..555046be 100644
--- a/mdoc_html.c
+++ b/mdoc_html.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_html.c,v 1.312 2018/10/02 12:33:37 schwarze Exp $ */
+/* $Id: mdoc_html.c,v 1.313 2018/10/02 14:56:47 schwarze Exp $ */
/*
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2014,2015,2016,2017,2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -507,9 +507,39 @@ cond_id(const struct roff_node *n)
static int
mdoc_sh_pre(MDOC_ARGS)
{
- char *id;
+ struct roff_node *sn;
+ struct tag *t, *tt;
+ char *id;
+ int sc;
switch (n->type) {
+ case ROFFT_BLOCK:
+ if ((h->oflags & HTML_TOC) == 0 ||
+ h->flags & HTML_TOCDONE ||
+ n->sec <= SEC_SYNOPSIS)
+ break;
+ h->flags |= HTML_TOCDONE;
+ sc = 0;
+ for (sn = n->next; sn != NULL; sn = sn->next)
+ if (sn->sec == SEC_CUSTOM)
+ if (++sc == 2)
+ break;
+ if (sc < 2)
+ break;
+ t = print_otag(h, TAG_H1, "c", "Sh");
+ print_text(h, "TABLE OF CONTENTS");
+ print_tagq(h, t);
+ t = print_otag(h, TAG_UL, "c", "Bl-compact");
+ for (sn = n->next; sn != NULL; sn = sn->next) {
+ id = html_make_id(sn->head, 0);
+ tt = print_otag(h, TAG_LI, "");
+ print_otag(h, TAG_A, "hR", id);
+ print_mdoc_nodelist(meta, sn->head->child, h);
+ print_tagq(h, tt);
+ free(id);
+ }
+ print_tagq(h, t);
+ break;
case ROFFT_HEAD:
id = html_make_id(n, 1);
print_otag(h, TAG_H1, "cTi", "Sh", id);