source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: * implement -Tman .Bl -item -inset -diag -ohang -dash -hyphen
@ 2012-07-10 14:38 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2012-07-10 14:38 UTC (permalink / raw)
  To: source

Log Message:
-----------
* implement -Tman .Bl -item -inset -diag -ohang -dash -hyphen -enum .It
* fix -Tman .Bl -bullet .It
* adjust the -Tascii .Bl -bullet -dash -hyphen .It
default and minimum width to new groff standards,
it changed from 4n (in groff 1.15) to 2n (in groff 1.21)
* same for -Tascii -enum, it changed from 5n to 2n
* use -hang formatting for -Tascii -enum -width 2n
* for -Tascii -enum, the default is -width 3n

Modified Files:
--------------
    mdocml:
        mdoc.h
        mdoc_man.c
        mdoc_term.c
        mdoc_validate.c

Revision Data
-------------
Index: mdoc_man.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_man.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -Lmdoc_man.c -Lmdoc_man.c -u -p -r1.29 -r1.30
--- mdoc_man.c
+++ mdoc_man.c
@@ -46,6 +46,7 @@ static	void	  font_pop(void);
 static	void	  post_bd(DECL_ARGS);
 static	void	  post_bf(DECL_ARGS);
 static	void	  post_bk(DECL_ARGS);
+static	void	  post_bl(DECL_ARGS);
 static	void	  post_dl(DECL_ARGS);
 static	void	  post_enc(DECL_ARGS);
 static	void	  post_eo(DECL_ARGS);
@@ -56,6 +57,7 @@ static	void	  post_fn(DECL_ARGS);
 static	void	  post_fo(DECL_ARGS);
 static	void	  post_font(DECL_ARGS);
 static	void	  post_in(DECL_ARGS);
+static	void	  post_it(DECL_ARGS);
 static	void	  post_lb(DECL_ARGS);
 static	void	  post_nm(DECL_ARGS);
 static	void	  post_percent(DECL_ARGS);
@@ -68,6 +70,7 @@ static	int	  pre_ap(DECL_ARGS);
 static	int	  pre_bd(DECL_ARGS);
 static	int	  pre_bf(DECL_ARGS);
 static	int	  pre_bk(DECL_ARGS);
+static	int	  pre_bl(DECL_ARGS);
 static	int	  pre_br(DECL_ARGS);
 static	int	  pre_bx(DECL_ARGS);
 static	int	  pre_dl(DECL_ARGS);
@@ -97,6 +100,8 @@ static	int	  pre_ux(DECL_ARGS);
 static	int	  pre_xr(DECL_ARGS);
 static	void	  print_word(const char *);
 static	void	  print_offs(const char *);
+static	void	  print_width(const char *);
+static	void	  print_count(int *);
 static	void	  print_node(DECL_ARGS);
 
 static	const struct manact manacts[MDOC_MAX + 1] = {
@@ -111,9 +116,9 @@ static	const struct manact manacts[MDOC_
 	{ cond_body, pre_dl, post_dl, NULL, NULL }, /* Dl */
 	{ cond_body, pre_bd, post_bd, NULL, NULL }, /* Bd */
 	{ NULL, NULL, NULL, NULL, NULL }, /* Ed */
-	{ NULL, NULL, NULL, NULL, NULL }, /* Bl */
+	{ cond_body, pre_bl, post_bl, NULL, NULL }, /* Bl */
 	{ NULL, NULL, NULL, NULL, NULL }, /* El */
-	{ NULL, pre_it, NULL, NULL, NULL }, /* _It */
+	{ NULL, pre_it, post_it, NULL, NULL }, /* It */
 	{ NULL, pre_em, post_font, NULL, NULL }, /* Ad */
 	{ NULL, pre_an, NULL, NULL, NULL }, /* An */
 	{ NULL, pre_em, post_font, NULL, NULL }, /* Ar */
@@ -355,6 +360,36 @@ print_offs(const char *v)
 }
 
 void
+print_width(const char *v)
+{
+	char		  buf[24];
+	struct roffsu	  su;
+	size_t		  sz;
+
+	if (a2roffsu(v, &su, SCALE_MAX)) {
+		if (SCALE_EN == su.unit)
+			sz = su.scale;
+		else {
+			print_word(v);
+			return;
+		}
+	} else
+		sz = strlen(v);
+
+	snprintf(buf, sizeof(buf), "%ldn", sz + 2);
+	print_word(buf);
+}
+
+void
+print_count(int *count)
+{
+	char		  buf[12];
+
+	snprintf(buf, sizeof(buf), "%d.", ++*count);
+	print_word(buf);
+}
+
+void
 man_man(void *arg, const struct man *man)
 {
 
@@ -705,6 +740,23 @@ post_bk(DECL_ARGS)
 }
 
 static int
+pre_bl(DECL_ARGS)
+{
+
+	if (LIST_enum == n->norm->Bl.type)
+		n->norm->Bl.count = 0;
+	return(1);
+}
+
+static void
+post_bl(DECL_ARGS)
+{
+
+	if (LIST_enum == n->norm->Bl.type)
+		n->norm->Bl.count = 0;
+}
+
+static int
 pre_br(DECL_ARGS)
 {
 
@@ -944,24 +996,85 @@ pre_it(DECL_ARGS)
 {
 	const struct mdoc_node *bln;
 
-	if (MDOC_HEAD == n->type) {
+	switch (n->type) {
+	case (MDOC_HEAD):
 		outflags |= MMAN_nl;
-		print_word(".TP");
-		bln = n->parent->parent->prev;
+		bln = n->parent->parent;
 		switch (bln->norm->Bl.type) {
+		case (LIST_item):
+			if (bln->norm->Bl.comp)
+				outflags |= MMAN_br;
+			else
+				outflags |= MMAN_sp;
+			return(0);
+		case (LIST_inset):
+			/* FALLTHROUGH */
+		case (LIST_diag):
+			/* FALLTHROUGH */
+		case (LIST_ohang):
+			if (bln->norm->Bl.comp)
+				outflags |= MMAN_br;
+			else
+				outflags |= MMAN_sp;
+			if (bln->norm->Bl.type == LIST_diag)
+				print_word(".B \"");
+			else
+				print_word(".R \"");
+			outflags &= ~MMAN_spc;
+			return(1);
 		case (LIST_bullet):
-			print_word("4n");
+			/* FALLTHROUGH */
+		case (LIST_dash):
+			/* FALLTHROUGH */
+		case (LIST_hyphen):
+			print_word(".TP");
+			print_width(bln->norm->Bl.width);
+			outflags |= MMAN_nl;
+			font_push('B');
+			if (LIST_bullet == bln->norm->Bl.type)
+				print_word("o");
+			else
+				print_word("-");
+			font_pop();
+			break;
+		case (LIST_enum):
+			print_word(".TP");
+			print_width(bln->norm->Bl.width);
+			outflags |= MMAN_nl;
+			print_count(&bln->norm->Bl.count);
 			outflags |= MMAN_nl;
-			print_word("\\fBo\\fP");
 			break;
 		default:
 			if (bln->norm->Bl.width)
-				print_word(bln->norm->Bl.width);
+				print_width(bln->norm->Bl.width);
 			break;
 		}
 		outflags |= MMAN_nl;
+	default:
+		break;
 	}
 	return(1);
+}
+
+static void
+post_it(DECL_ARGS)
+{
+	const struct mdoc_node *bln;
+
+	if (MDOC_HEAD == n->type) {
+		bln = n->parent->parent;
+		switch (bln->norm->Bl.type) {
+		case (LIST_diag):
+			outflags &= ~MMAN_spc;
+			print_word("\\ ");
+			break;
+		case (LIST_ohang):
+			outflags |= MMAN_br;
+			break;
+		default:
+			break;
+		}
+	}
 }
 
 static void
Index: mdoc_validate.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v
retrieving revision 1.184
retrieving revision 1.185
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.184 -r1.185
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -733,14 +733,14 @@ pre_bl(PRE_ARGS)
 	/* 
 	 * Validate the width field.  Some list types don't need width
 	 * types and should be warned about them.  Others should have it
-	 * and must also be warned.
+	 * and must also be warned.  Yet others have a default and need
+	 * no warning.
 	 */
 
 	switch (n->norm->Bl.type) {
 	case (LIST_tag):
-		if (n->norm->Bl.width)
-			break;
-		mdoc_nmsg(mdoc, n, MANDOCERR_NOWIDTHARG);
+		if (NULL == n->norm->Bl.width)
+			mdoc_nmsg(mdoc, n, MANDOCERR_NOWIDTHARG);
 		break;
 	case (LIST_column):
 		/* FALLTHROUGH */
@@ -753,6 +753,18 @@ pre_bl(PRE_ARGS)
 	case (LIST_item):
 		if (n->norm->Bl.width)
 			mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV);
+		break;
+	case (LIST_bullet):
+		/* FALLTHROUGH */
+	case (LIST_dash):
+		/* FALLTHROUGH */
+	case (LIST_hyphen):
+		if (NULL == n->norm->Bl.width)
+			n->norm->Bl.width = "2n";
+		break;
+	case (LIST_enum):
+		if (NULL == n->norm->Bl.width)
+			n->norm->Bl.width = "3n";
 		break;
 	default:
 		break;
Index: mdoc_term.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_term.c,v
retrieving revision 1.241
retrieving revision 1.242
diff -Lmdoc_term.c -Lmdoc_term.c -u -p -r1.241 -r1.242
--- mdoc_term.c
+++ mdoc_term.c
@@ -727,12 +727,10 @@ termp_it_pre(DECL_ARGS)
 	case (LIST_dash):
 		/* FALLTHROUGH */
 	case (LIST_hyphen):
-		if (width < term_len(p, 4))
-			width = term_len(p, 4);
-		break;
+		/* FALLTHROUGH */
 	case (LIST_enum):
-		if (width < term_len(p, 5))
-			width = term_len(p, 5);
+		if (width < term_len(p, 2))
+			width = term_len(p, 2);
 		break;
 	case (LIST_hang):
 		if (0 == width)
@@ -787,11 +785,17 @@ termp_it_pre(DECL_ARGS)
 	 */
 
 	switch (type) {
+	case (LIST_enum):
+		/*
+		 * Weird special case.
+		 * Very narrow enum lists actually hang.
+		 */
+		if (width == term_len(p, 2))
+			p->flags |= TERMP_HANG;
+		/* FALLTHROUGH */
 	case (LIST_bullet):
 		/* FALLTHROUGH */
 	case (LIST_dash):
-		/* FALLTHROUGH */
-	case (LIST_enum):
 		/* FALLTHROUGH */
 	case (LIST_hyphen):
 		if (MDOC_HEAD == n->type)
Index: mdoc.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.h,v
retrieving revision 1.122
retrieving revision 1.123
diff -Lmdoc.h -Lmdoc.h -u -p -r1.122 -r1.123
--- mdoc.h
+++ mdoc.h
@@ -311,6 +311,7 @@ struct	mdoc_bl {
 	int		  comp; /* -compact */
 	size_t		  ncols; /* -column arg count */
 	const char	**cols; /* -column val ptr */
+	int		  count; /* -enum counter */
 };
 
 struct	mdoc_bf {
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2012-07-10 14:38 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-10 14:38 mdocml: * implement -Tman .Bl -item -inset -diag -ohang -dash -hyphen 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).