=================================================================== RCS file: /cvs/mandoc/mdoc_html.c,v retrieving revision 1.312 retrieving revision 1.315 diff -u -p -r1.312 -r1.315 --- mandoc/mdoc_html.c 2018/10/02 12:33:37 1.312 +++ mandoc/mdoc_html.c 2018/10/04 13:23:04 1.315 @@ -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.315 2018/10/04 13:23:04 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons * Copyright (c) 2014,2015,2016,2017,2018 Ingo Schwarze @@ -507,9 +507,57 @@ cond_id(const struct roff_node *n) static int mdoc_sh_pre(MDOC_ARGS) { - char *id; + struct roff_node *sn, *subn; + struct tag *t, *tsec, *tsub; + 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; sn != NULL; sn = sn->next) { + tsec = print_otag(h, TAG_LI, ""); + id = html_make_id(sn->head, 0); + print_otag(h, TAG_A, "hR", id); + free(id); + print_mdoc_nodelist(meta, sn->head->child, h); + tsub = NULL; + for (subn = sn->body->child; subn != NULL; + subn = subn->next) { + if (subn->tok != MDOC_Ss) + continue; + id = html_make_id(subn->head, 0); + if (id == NULL) + continue; + if (tsub == NULL) + print_otag(h, TAG_UL, + "c", "Bl-compact"); + tsub = print_otag(h, TAG_LI, ""); + print_otag(h, TAG_A, "hR", id); + free(id); + print_mdoc_nodelist(meta, + subn->head->child, h); + print_tagq(h, tsub); + } + print_tagq(h, tsec); + } + print_tagq(h, t); + break; case ROFFT_HEAD: id = html_make_id(n, 1); print_otag(h, TAG_H1, "cTi", "Sh", id);