From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from localhost (fantadrom.bsd.lv [local]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id 81c73470 for ; Tue, 2 Oct 2018 09:57:18 -0500 (EST) Date: Tue, 2 Oct 2018 09:57:18 -0500 (EST) X-Mailinglist: mandoc-source Reply-To: source@mandoc.bsd.lv MIME-Version: 1.0 From: schwarze@mandoc.bsd.lv To: source@mandoc.bsd.lv Subject: mandoc: Add an option -T html -O toc to add a brief table of contents X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Message-Id: <381bc690b263a5d0@fantadrom.bsd.lv> Log Message: ----------- 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. Modified Files: -------------- mandoc: TODO html.c html.h man.conf.5 manconf.h mandoc.1 manpath.c mdoc_html.c Revision Data ------------- Index: mandoc.1 =================================================================== RCS file: /home/cvs/mandoc/mandoc/mandoc.1,v retrieving revision 1.229 retrieving revision 1.230 diff -Lmandoc.1 -Lmandoc.1 -u -p -r1.229 -r1.230 --- mandoc.1 +++ mandoc.1 @@ -371,6 +371,9 @@ The file is used for an external style-sheet. This must be a valid absolute or relative URI. +.It Cm toc +If an input file contains at least two non-standard sections, +print a table of contents near the beginning of the output. .El .Ss Locale Output By default, Index: html.h =================================================================== RCS file: /home/cvs/mandoc/mandoc/html.h,v retrieving revision 1.93 retrieving revision 1.94 diff -Lhtml.h -Lhtml.h -u -p -r1.93 -r1.94 --- html.h +++ html.h @@ -93,6 +93,7 @@ struct html { #define HTML_SPLIT (1 << 8) /* break line before .An */ #define HTML_NONEWLINE (1 << 9) /* No line break in nofill mode. */ #define HTML_BUFFER (1 << 10) /* Collect a word to see if it fits. */ +#define HTML_TOCDONE (1 << 11) /* The TOC was already written. */ size_t indent; /* current output indentation level */ int noindent; /* indent disabled by
 */
 	size_t		  col; /* current output byte position */
@@ -110,6 +111,7 @@ struct	html {
 	enum htmlfont	  metac; /* current font mode */
 	int		  oflags; /* output options */
 #define	HTML_FRAGMENT	 (1 << 0) /* don't emit HTML/HEAD/BODY */
+#define	HTML_TOC	 (1 << 1) /* emit a table of contents */
 };
 
 
Index: TODO
===================================================================
RCS file: /home/cvs/mandoc/mandoc/TODO,v
retrieving revision 1.272
retrieving revision 1.273
diff -LTODO -LTODO -u -p -r1.272 -r1.273
--- TODO
+++ TODO
@@ -390,11 +390,6 @@ are mere guesses, and some may be wrong.
 
 --- HTML issues --------------------------------------------------------
 
-- table of content at the top of HTML (and perhaps ps/pdf) pages
-  only if there are at least two (or three?) non-standard sections
-  only if the new option -O toc is given
-  suggested by Adam Kalisz during EuroBSDCon 2018
-
 - wrap Sh and Ss content into 
Laura Morales 21 Apr 2018 18:10:48 +0200 (Evaluate whether this is really useful and has no adverse Index: manconf.h =================================================================== RCS file: /home/cvs/mandoc/mandoc/manconf.h,v retrieving revision 1.5 retrieving revision 1.6 diff -Lmanconf.h -Lmanconf.h -u -p -r1.5 -r1.6 --- manconf.h +++ manconf.h @@ -34,8 +34,9 @@ struct manoutput { size_t width; int fragment; int mdoc; - int synopsisonly; int noval; + int synopsisonly; + int toc; }; struct manconf { Index: man.conf.5 =================================================================== RCS file: /home/cvs/mandoc/mandoc/man.conf.5,v retrieving revision 1.5 retrieving revision 1.6 diff -Lman.conf.5 -Lman.conf.5 -u -p -r1.5 -r1.6 --- man.conf.5 +++ man.conf.5 @@ -1,6 +1,6 @@ .\" $Id$ .\" -.\" Copyright (c) 2015 Ingo Schwarze +.\" Copyright (c) 2015, 2017 Ingo Schwarze .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -98,6 +98,7 @@ manual. .It Ic man Ta string Ta Cm html Ta path for \&Xr links .It Ic paper Ta string Ta Cm ps , pdf Ta paper size .It Ic style Ta string Ta Cm html Ta CSS file +.It Ic toc Ta none Ta Cm html Ta print table of contents .It Ic width Ta integer Ta Cm ascii , utf8 Ta right margin .El .It Ic _whatdb Ar path Ns Cm /whatis.db Index: manpath.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/manpath.c,v retrieving revision 1.35 retrieving revision 1.36 diff -Lmanpath.c -Lmanpath.c -u -p -r1.35 -r1.36 --- manpath.c +++ manpath.c @@ -1,6 +1,6 @@ /* $Id$ */ /* - * Copyright (c) 2011, 2014, 2015, 2017 Ingo Schwarze + * Copyright (c) 2011,2014,2015,2017,2018 Ingo Schwarze * Copyright (c) 2011 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any @@ -233,7 +233,7 @@ manconf_output(struct manoutput *conf, c { const char *const toks[] = { "includes", "man", "paper", "style", - "indent", "width", "fragment", "mdoc", "noval" + "indent", "width", "fragment", "mdoc", "noval", "toc" }; const char *errstr; @@ -319,6 +319,9 @@ manconf_output(struct manoutput *conf, c return 0; case 8: conf->noval = 1; + return 0; + case 9: + conf->toc = 1; return 0; default: if (fromfile) Index: html.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/html.c,v retrieving revision 1.240 retrieving revision 1.241 diff -Lhtml.c -Lhtml.c -u -p -r1.240 -r1.241 --- html.c +++ html.c @@ -136,6 +136,8 @@ html_alloc(const struct manoutput *outop h->base_includes = outopts->includes; if (outopts->fragment) h->oflags |= HTML_FRAGMENT; + if (outopts->toc) + h->oflags |= HTML_TOC; mandoc_ohash_init(&id_unique, 4, 0); Index: mdoc_html.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/mdoc_html.c,v retrieving revision 1.312 retrieving revision 1.313 diff -Lmdoc_html.c -Lmdoc_html.c -u -p -r1.312 -r1.313 --- mdoc_html.c +++ mdoc_html.c @@ -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); -- To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv