From cc61d00ed522f99c9f1a34fcc6add2d202942885 Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Tue, 2 Oct 2018 14:56:47 +0000 Subject: 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. --- TODO | 7 +------ html.c | 4 +++- html.h | 4 +++- man.conf.5 | 7 ++++--- manconf.h | 5 +++-- mandoc.1 | 5 ++++- manpath.c | 9 ++++++--- mdoc_html.c | 34 ++++++++++++++++++++++++++++++++-- 8 files changed, 56 insertions(+), 19 deletions(-) diff --git a/TODO b/TODO index 14289756..a168133e 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,6 @@ ************************************************************************ * Official mandoc TODO. -* $Id: TODO,v 1.272 2018/10/02 12:33:36 schwarze Exp $ +* $Id: TODO,v 1.273 2018/10/02 14:56:47 schwarze Exp $ ************************************************************************ Many issues are annotated for difficulty as follows: @@ -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 diff --git a/html.c b/html.c index 5078864f..0d6687fb 100644 --- a/html.c +++ b/html.c @@ -1,4 +1,4 @@ -/* $Id: html.c,v 1.240 2018/10/02 12:33:37 schwarze Exp $ */ +/* $Id: html.c,v 1.241 2018/10/02 14:56:47 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons * Copyright (c) 2011-2015, 2017, 2018 Ingo Schwarze @@ -136,6 +136,8 @@ html_alloc(const struct manoutput *outopts) 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); diff --git a/html.h b/html.h index 606dd76d..5f3c5ebe 100644 --- a/html.h +++ b/html.h @@ -1,4 +1,4 @@ -/* $Id: html.h,v 1.93 2018/10/02 12:33:37 schwarze Exp $ */ +/* $Id: html.h,v 1.94 2018/10/02 14:56:47 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons * Copyright (c) 2017, 2018 Ingo Schwarze @@ -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 */
 };
 
 
diff --git a/man.conf.5 b/man.conf.5
index be099808..0ffe868a 100644
--- a/man.conf.5
+++ b/man.conf.5
@@ -1,6 +1,6 @@
-.\"	$Id: man.conf.5,v 1.5 2017/08/22 18:17:52 schwarze Exp $
+.\"	$Id: man.conf.5,v 1.6 2018/10/02 14:56:47 schwarze Exp $
 .\"
-.\" 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
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: August 22 2017 $
+.Dd $Mdocdate: October 2 2018 $
 .Dt MAN.CONF 5
 .Os
 .Sh NAME
@@ -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
diff --git a/manconf.h b/manconf.h
index b4cd3164..babd463b 100644
--- a/manconf.h
+++ b/manconf.h
@@ -1,4 +1,4 @@
-/*	$Id: manconf.h,v 1.5 2017/07/01 09:47:30 schwarze Exp $ */
+/*	$Id: manconf.h,v 1.6 2018/10/02 14:56:47 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2015, 2017 Ingo Schwarze 
  * Copyright (c) 2011 Kristaps Dzonsons 
@@ -34,8 +34,9 @@ struct	manoutput {
 	size_t	  width;
 	int	  fragment;
 	int	  mdoc;
-	int	  synopsisonly;
 	int	  noval;
+	int	  synopsisonly;
+	int	  toc;
 };
 
 struct	manconf {
diff --git a/mandoc.1 b/mandoc.1
index c35ef73a..cd84be76 100644
--- a/mandoc.1
+++ b/mandoc.1
@@ -1,4 +1,4 @@
-.\"	$Id: mandoc.1,v 1.229 2018/10/02 12:33:37 schwarze Exp $
+.\"	$Id: mandoc.1,v 1.230 2018/10/02 14:56:47 schwarze Exp $
 .\"
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons 
 .\" Copyright (c) 2012, 2014-2018 Ingo Schwarze 
@@ -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,
diff --git a/manpath.c b/manpath.c
index 54f7a6b1..f6cf704f 100644
--- a/manpath.c
+++ b/manpath.c
@@ -1,6 +1,6 @@
-/*	$Id: manpath.c,v 1.35 2017/07/01 09:47:30 schwarze Exp $ */
+/*	$Id: manpath.c,v 1.36 2018/10/02 14:56:47 schwarze Exp $ */
 /*
- * 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, const char *cp, int fromfile)
 {
 	const char *const toks[] = {
 	    "includes", "man", "paper", "style",
-	    "indent", "width", "fragment", "mdoc", "noval"
+	    "indent", "width", "fragment", "mdoc", "noval", "toc"
 	};
 
 	const char	*errstr;
@@ -320,6 +320,9 @@ manconf_output(struct manoutput *conf, const char *cp, int fromfile)
 	case 8:
 		conf->noval = 1;
 		return 0;
+	case 9:
+		conf->toc = 1;
+		return 0;
 	default:
 		if (fromfile)
 			warnx("-O %s: Bad argument", cp);
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 
  * Copyright (c) 2014,2015,2016,2017,2018 Ingo Schwarze 
@@ -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);
-- 
cgit v1.2.3-56-ge451