tech@mandoc.bsd.lv
 help / color / mirror / Atom feed
* HTML fragment mode.
@ 2011-10-03 10:16 Kristaps Dzonsons
  2011-10-03 21:05 ` Ingo Schwarze
  0 siblings, 1 reply; 2+ messages in thread
From: Kristaps Dzonsons @ 2011-10-03 10:16 UTC (permalink / raw)
  To: tech

[-- Attachment #1: Type: text/plain, Size: 812 bytes --]

Hi,

Enclosed is a small patch that, with -Ofragmnet, has -T[x]html only emit 
the CONTENT of an HTML file, not the file stuff itself (DOCTYPE, HTML, 
HEAD, BODY).  It also makes a new top-level node, <DIV CLASS="mandoc">, 
so that it's easier to embed mandoc -Thtml output in other pages.  Thus, 
consider this SSI pseudo-code:

   <HTML>
     <HEAD><LINK to css><TITLE>blahblah</TITLE></HEAD>
     <BODY>
       <!-- Some regular header stuff. //-->
       <!--#exec cgi="/cgi-bin/mandoc.cgi${PATH_INFO}" -->
       <!-- Some footer stuff. //-->
     </BODY>
   </HTML>

This would be useful for mandoc.cgi, for example, because it wouldn't 
have to bundle all the extra HTML crap (headers, footers, etc.) nor 
would it need to use templates, worry about hardcoded CSS paths, etc. 
Clean!

Thoughts?

Kristaps

[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 5928 bytes --]

Index: example.style.css
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/example.style.css,v
retrieving revision 1.46
diff -u -r1.46 example.style.css
--- example.style.css	26 Aug 2011 09:03:17 -0000	1.46
+++ example.style.css	3 Oct 2011 10:14:25 -0000
@@ -9,8 +9,10 @@
  * See mdoc(7) and man(7) for macro explanations.
  */
 
-html		{ min-width: 580px; width: 580px; }
-body		{ font-family: monospace; }
+div.mandoc	{ min-width: 78ex; 
+		  width: 78ex; 
+	  	  font-family: monospace; } /* This is the outer node of all mandoc -T[x]html documents. */
+
 h1		{ margin-bottom: 0ex; font-size: inherit; margin-left: -4ex; } /* Section header (Sh, SH). */
 h2		{ margin-bottom: 0ex; font-size: inherit; margin-left: -2ex; } /* Sub-section header (Ss, SS). */
 table		{ width: 100%; margin-top: 0ex; margin-bottom: 0ex; } /* All tables. */
Index: html.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/html.c,v
retrieving revision 1.149
diff -u -r1.149 html.c
--- html.c	7 Jul 2011 14:34:11 -0000	1.149
+++ html.c	3 Oct 2011 10:14:25 -0000
@@ -118,13 +118,14 @@
 ml_alloc(char *outopts, enum htmltype type)
 {
 	struct html	*h;
-	const char	*toks[4];
+	const char	*toks[5];
 	char		*v;
 
 	toks[0] = "style";
 	toks[1] = "man";
 	toks[2] = "includes";
-	toks[3] = NULL;
+	toks[3] = "fragment";
+	toks[4] = NULL;
 
 	h = mandoc_calloc(1, sizeof(struct html));
 
@@ -142,6 +143,9 @@
 			break;
 		case (2):
 			h->base_includes = v;
+			break;
+		case (3):
+			h->oflags |= HTML_FRAGMENT;
 			break;
 		default:
 			break;
Index: html.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/html.h,v
retrieving revision 1.46
diff -u -r1.46 html.h
--- html.h	18 Sep 2011 14:14:15 -0000	1.46
+++ html.h	3 Oct 2011 10:14:25 -0000
@@ -104,7 +104,7 @@
 #define	PAIR_STYLE_INIT(p, h)	PAIR_INIT(p, ATTR_STYLE, (h)->buf)
 #define	PAIR_SUMMARY_INIT(p, v)	PAIR_INIT(p, ATTR_SUMMARY, v)
 
-enum	htmltype {
+enum	htmltype { 
 	HTML_HTML_4_01_STRICT,
 	HTML_XHTML_1_0_STRICT
 };
@@ -125,11 +125,13 @@
 	char		 *base_includes; /* base for include href */
 	char		 *style; /* style-sheet URI */
 	char		  buf[BUFSIZ]; /* see bufcat and friends */
-	size_t		  buflen;
+	size_t		  buflen; 
 	struct tag	 *metaf; /* current open font scope */
 	enum htmlfont	  metal; /* last used font */
 	enum htmlfont	  metac; /* current font mode */
-	enum htmltype	  type;
+	enum htmltype	  type; /* output media type */
+	int		  oflags;
+#define	HTML_FRAGMENT	 (1 << 0) /* don't emit HTML/HEAD/BODY */
 };
 
 void		  print_gen_decls(struct html *);
Index: man_html.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man_html.c,v
retrieving revision 1.81
diff -u -r1.81 man_html.c
--- man_html.c	18 Aug 2011 09:16:01 -0000	1.81
+++ man_html.c	3 Oct 2011 10:14:26 -0000
@@ -141,33 +141,32 @@
 void
 html_man(void *arg, const struct man *m)
 {
-	struct html	*h;
-	struct tag	*t;
 	struct mhtml	 mh;
 
-	h = (struct html *)arg;
-
-	print_gen_decls(h);
-
 	memset(&mh, 0, sizeof(struct mhtml));
-
-	t = print_otag(h, TAG_HTML, 0, NULL);
-	print_man(man_meta(m), man_node(m), &mh, h);
-	print_tagq(h, t);
-
-	printf("\n");
+	print_man(man_meta(m), man_node(m), &mh, (struct html *)arg);
+	putchar('\n');
 }
 
 static void
 print_man(MAN_ARGS) 
 {
-	struct tag	*t;
+	struct tag	*t, *tt;
+	struct htmlpair	 tag;
+
+	PAIR_CLASS_INIT(&tag, "mandoc");
 
-	t = print_otag(h, TAG_HEAD, 0, NULL);
-	print_man_head(m, n, mh, h);
-	print_tagq(h, t);
+	if ( ! (HTML_FRAGMENT & h->oflags)) {
+		print_gen_decls(h);
+		t = print_otag(h, TAG_HTML, 0, NULL);
+		tt = print_otag(h, TAG_HEAD, 0, NULL);
+		print_man_head(m, n, mh, h);
+		print_tagq(h, tt);
+		print_otag(h, TAG_BODY, 0, NULL);
+		print_otag(h, TAG_DIV, 1, &tag);
+	} else 
+		t = print_otag(h, TAG_DIV, 1, &tag);
 
-	t = print_otag(h, TAG_BODY, 0, NULL);
 	print_man_nodelist(m, n, mh, h);
 	print_tagq(h, t);
 }
Index: mandoc.1
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.1,v
retrieving revision 1.93
diff -u -r1.93 mandoc.1
--- mandoc.1	26 Sep 2011 20:47:23 -0000	1.93
+++ mandoc.1	3 Oct 2011 10:14:26 -0000
@@ -259,6 +259,11 @@
 .Fl O
 arguments are accepted:
 .Bl -tag -width Ds
+.It Cm fragment
+Do not emit doctype, html, and body elements.
+The
+.Cm style
+argument shall be unused.
 .It Cm includes Ns = Ns Ar fmt
 The string
 .Ar fmt ,
Index: mdoc_html.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_html.c,v
retrieving revision 1.178
diff -u -r1.178 mdoc_html.c
--- mdoc_html.c	26 Aug 2011 09:03:17 -0000	1.178
+++ mdoc_html.c	3 Oct 2011 10:14:26 -0000
@@ -262,17 +262,9 @@
 void
 html_mdoc(void *arg, const struct mdoc *m)
 {
-	struct html 	*h;
-	struct tag	*t;
 
-	h = (struct html *)arg;
-
-	print_gen_decls(h);
-	t = print_otag(h, TAG_HTML, 0, NULL);
-	print_mdoc(mdoc_meta(m), mdoc_node(m), h);
-	print_tagq(h, t);
-
-	printf("\n");
+	print_mdoc(mdoc_meta(m), mdoc_node(m), (struct html *)arg);
+	putchar('\n');
 }
 
 
@@ -360,13 +352,22 @@
 static void
 print_mdoc(MDOC_ARGS)
 {
-	struct tag	*t;
+	struct tag	*t, *tt;
+	struct htmlpair	 tag;
+
+	PAIR_CLASS_INIT(&tag, "mandoc");
 
-	t = print_otag(h, TAG_HEAD, 0, NULL);
-	print_mdoc_head(m, n, h);
-	print_tagq(h, t);
+	if ( ! (HTML_FRAGMENT & h->oflags)) {
+		print_gen_decls(h);
+		t = print_otag(h, TAG_HTML, 0, NULL);
+		tt = print_otag(h, TAG_HEAD, 0, NULL);
+		print_mdoc_head(m, n, h);
+		print_tagq(h, tt);
+		print_otag(h, TAG_BODY, 0, NULL);
+		print_otag(h, TAG_DIV, 1, &tag);
+	} else 
+		t = print_otag(h, TAG_DIV, 1, &tag);
 
-	t = print_otag(h, TAG_BODY, 0, NULL);
 	print_mdoc_nodelist(m, n, h);
 	print_tagq(h, t);
 }

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: HTML fragment mode.
  2011-10-03 10:16 HTML fragment mode Kristaps Dzonsons
@ 2011-10-03 21:05 ` Ingo Schwarze
  0 siblings, 0 replies; 2+ messages in thread
From: Ingo Schwarze @ 2011-10-03 21:05 UTC (permalink / raw)
  To: tech

Hi Kristaps,

> Enclosed is a small patch that, with -Ofragmnet, has -T[x]html only
> emit the CONTENT of an HTML file, not the file stuff itself
> (DOCTYPE, HTML, HEAD, BODY).  It also makes a new top-level node,
> <DIV CLASS="mandoc">, so that it's easier to embed mandoc -Thtml
> output in other pages.  Thus, consider this SSI pseudo-code:
> 
>   <HTML>
>     <HEAD><LINK to css><TITLE>blahblah</TITLE></HEAD>
>     <BODY>
>       <!-- Some regular header stuff. //-->
>       <!--#exec cgi="/cgi-bin/mandoc.cgi${PATH_INFO}" -->
>       <!-- Some footer stuff. //-->
>     </BODY>
>   </HTML>
> 
> This would be useful for mandoc.cgi, for example, because it
> wouldn't have to bundle all the extra HTML crap (headers, footers,
> etc.) nor would it need to use templates, worry about hardcoded CSS
> paths, etc. Clean!
> 
> Thoughts?

From briefly reading the patch, this makes sense to me.

In the manual, i'd probably add another sentence though
briefly stating what this option is useful for.

Yours,
  Ingo
--
 To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-10-03 21:05 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-10-03 10:16 HTML fragment mode Kristaps Dzonsons
2011-10-03 21:05 ` Ingo Schwarze

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).