X-Git-Url: https://git.cameronkatri.com/mandoc.git/blobdiff_plain/2bcccf0dba8f2c504e9c3597a11177aaca90023c..9c1eaf47face65f05d12c1991f19a92789b433fc:/man_html.c

diff --git a/man_html.c b/man_html.c
index ed6e6c7f..0a386e07 100644
--- a/man_html.c
+++ b/man_html.c
@@ -1,6 +1,6 @@
-/*	$Id: man_html.c,v 1.38 2010/06/26 15:36:37 kristaps Exp $ */
+/*	$Id: man_html.c,v 1.45 2010/07/23 12:27:28 kristaps Exp $ */
 /*
- * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -29,7 +29,6 @@
 #include "mandoc.h"
 #include "out.h"
 #include "html.h"
-#include "regs.h"
 #include "man.h"
 #include "main.h"
 
@@ -41,8 +40,14 @@
 
 #define	MAN_ARGS	  const struct man_meta *m, \
 			  const struct man_node *n, \
+			  struct mhtml *mh, \
 			  struct html *h
 
+struct	mhtml {
+	int		  fl;
+#define	MANH_LITERAL	 (1 << 0) /* literal context */
+};
+
 struct	htmlman {
 	int		(*pre)(MAN_ARGS);
 	int		(*post)(MAN_ARGS);
@@ -59,6 +64,8 @@ static	int		  a2width(const struct man_node *,
 static	int		  man_alt_pre(MAN_ARGS);
 static	int		  man_br_pre(MAN_ARGS);
 static	int		  man_ign_pre(MAN_ARGS);
+static	int		  man_in_pre(MAN_ARGS);
+static	int		  man_literal_pre(MAN_ARGS);
 static	void		  man_root_post(MAN_ARGS);
 static	int		  man_root_pre(MAN_ARGS);
 static	int		  man_B_pre(MAN_ARGS);
@@ -97,8 +104,8 @@ static	const struct htmlman mans[MAN_MAX] = {
 	{ NULL, NULL }, /* na */
 	{ NULL, NULL }, /* i */
 	{ man_br_pre, NULL }, /* sp */
-	{ NULL, NULL }, /* nf */
-	{ NULL, NULL }, /* fi */
+	{ man_literal_pre, NULL }, /* nf */
+	{ man_literal_pre, NULL }, /* fi */
 	{ NULL, NULL }, /* r */
 	{ NULL, NULL }, /* RE */
 	{ man_RS_pre, NULL }, /* RS */
@@ -106,9 +113,10 @@ static	const struct htmlman mans[MAN_MAX] = {
 	{ man_ign_pre, NULL }, /* UC */
 	{ man_ign_pre, NULL }, /* PD */
 	{ man_br_pre, NULL }, /* Sp */
-	{ man_ign_pre, NULL }, /* Vb */
-	{ NULL, NULL }, /* Ve */
+	{ man_literal_pre, NULL }, /* Vb */
+	{ man_literal_pre, NULL }, /* Ve */
 	{ man_ign_pre, NULL }, /* AT */
+	{ man_in_pre, NULL }, /* in */
 };
 
 
@@ -117,13 +125,16 @@ 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), h);
+	print_man(man_meta(m), man_node(m), &mh, h);
 	print_tagq(h, t);
 
 	printf("\n");
@@ -138,7 +149,7 @@ print_man(MAN_ARGS)
 
 	t = print_otag(h, TAG_HEAD, 0, NULL);
 
-	print_man_head(m, n, h);
+	print_man_head(m, n, mh, h);
 	print_tagq(h, t);
 	t = print_otag(h, TAG_BODY, 0, NULL);
 
@@ -146,7 +157,7 @@ print_man(MAN_ARGS)
 	tag.val = "body";
 	print_otag(h, TAG_DIV, 1, &tag);
 
-	print_man_nodelist(m, n, h);
+	print_man_nodelist(m, n, mh, h);
 
 	print_tagq(h, t);
 }
@@ -170,9 +181,9 @@ static void
 print_man_nodelist(MAN_ARGS)
 {
 
-	print_man_node(m, n, h);
+	print_man_node(m, n, mh, h);
 	if (n->next)
-		print_man_nodelist(m, n->next, h);
+		print_man_nodelist(m, n->next, mh, h);
 }
 
 
@@ -195,10 +206,14 @@ print_man_node(MAN_ARGS)
 
 	switch (n->type) {
 	case (MAN_ROOT):
-		child = man_root_pre(m, n, h);
+		child = man_root_pre(m, n, mh, h);
 		break;
 	case (MAN_TEXT):
 		print_text(h, n->string);
+
+		if (MANH_LITERAL & mh->fl)
+			print_otag(h, TAG_BR, 0, NULL);
+
 		return;
 	default:
 		/* 
@@ -213,12 +228,12 @@ print_man_node(MAN_ARGS)
 			t = h->tags.head;
 		}
 		if (mans[n->tok].pre)
-			child = (*mans[n->tok].pre)(m, n, h);
+			child = (*mans[n->tok].pre)(m, n, mh, h);
 		break;
 	}
 
 	if (child && n->child)
-		print_man_nodelist(m, n->child, h);
+		print_man_nodelist(m, n->child, mh, h);
 
 	/* This will automatically close out any font scope. */
 	print_stagq(h, t);
@@ -227,13 +242,13 @@ print_man_node(MAN_ARGS)
 
 	switch (n->type) {
 	case (MAN_ROOT):
-		man_root_post(m, n, h);
+		man_root_post(m, n, mh, h);
 		break;
 	case (MAN_TEXT):
 		break;
 	default:
 		if (mans[n->tok].post)
-			(*mans[n->tok].post)(m, n, h);
+			(*mans[n->tok].post)(m, n, mh, h);
 		break;
 	}
 }
@@ -454,7 +469,7 @@ man_alt_pre(MAN_ARGS)
 		 * closed out with the scope.
 		 */
 		t = print_ofont(h, fp);
-		print_man_node(m, nn, h);
+		print_man_node(m, nn, mh, h);
 		print_tagq(h, t);
 	}
 
@@ -648,10 +663,10 @@ man_IP_pre(MAN_ARGS)
 
 	if (MAN_IP == n->tok)
 		for (nn = n->child; nn->next; nn = nn->next)
-			print_man_node(m, nn, h);
+			print_man_node(m, nn, mh, h);
 	if (MAN_TP == n->tok)
 		for (nn = n->child->next; nn; nn = nn->next)
-			print_man_node(m, nn, h);
+			print_man_node(m, nn, mh, h);
 
 	return(0);
 }
@@ -716,6 +731,37 @@ man_I_pre(MAN_ARGS)
 }
 
 
+/* ARGSUSED */
+static int
+man_literal_pre(MAN_ARGS)
+{
+
+	switch (n->tok) {
+	case (MAN_nf):
+		/* FALLTHROUGH */
+	case (MAN_Vb):
+		print_otag(h, TAG_BR, 0, NULL);
+		mh->fl |= MANH_LITERAL;
+		return(MAN_Vb != n->tok);
+	default:
+		mh->fl &= ~MANH_LITERAL;
+		break;
+	}
+
+	return(1);
+}
+
+
+/* ARGSUSED */
+static int
+man_in_pre(MAN_ARGS)
+{
+
+	print_otag(h, TAG_BR, 0, NULL);
+	return(0);
+}
+
+
 /* ARGSUSED */
 static int
 man_ign_pre(MAN_ARGS)