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 7c249fd4 for ; Tue, 16 Apr 2019 09:26:57 -0500 (EST) Date: Tue, 16 Apr 2019 09:26:57 -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: docbook2mdoc: Reorganize printing of .Pp macro lines, much improved X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Message-ID: Log Message: ----------- Reorganize printing of .Pp macro lines, much improved formatting: Refrain from manual tree inspection. Instead, let and other nodes keep paragraph state and automatically emit .Pp when needed before printing text or macros. Modified Files: -------------- docbook2mdoc: docbook2mdoc.c macro.c macro.h Revision Data ------------- Index: macro.c =================================================================== RCS file: /home/cvs/mdocml/docbook2mdoc/macro.c,v retrieving revision 1.13 retrieving revision 1.14 diff -Lmacro.c -Lmacro.c -u -p -r1.13 -r1.14 --- macro.c +++ macro.c @@ -30,6 +30,13 @@ void macro_open(struct format *f, const char *name) { + if (f->parastate == PARA_WANT) { + if (f->linestate != LINE_NEW) { + putchar('\n'); + f->linestate = LINE_NEW; + } + puts(".Pp"); + } switch (f->linestate) { case LINE_MACRO: if (f->flags & FMT_NOSPC) { @@ -53,6 +60,7 @@ macro_open(struct format *f, const char fputs(name, stdout); f->flags &= FMT_IMPL; f->flags |= FMT_ARG; + f->parastate = PARA_MID; } void @@ -138,6 +146,7 @@ macro_addarg(struct format *f, const cha } if (quote_now) putchar('"'); + f->parastate = PARA_MID; } void @@ -170,6 +179,7 @@ macro_addnode(struct format *f, struct p if (n->node == NODE_TEXT || n->node == NODE_ESCAPE) { macro_addarg(f, n->b, flags); + f->parastate = PARA_MID; return; } @@ -204,6 +214,7 @@ macro_addnode(struct format *f, struct p } if (quote_now) putchar('"'); + f->parastate = PARA_MID; } void @@ -222,6 +233,13 @@ macro_nodeline(struct format *f, const c void print_text(struct format *f, const char *word, int flags) { + if (f->parastate == PARA_WANT) { + if (f->linestate != LINE_NEW) { + putchar('\n'); + f->linestate = LINE_NEW; + } + puts(".Pp"); + } switch (f->linestate) { case LINE_NEW: break; @@ -241,6 +259,7 @@ print_text(struct format *f, const char putchar('e'); } f->linestate = LINE_TEXT; + f->parastate = PARA_MID; f->flags = 0; } Index: macro.h =================================================================== RCS file: /home/cvs/mdocml/docbook2mdoc/macro.h,v retrieving revision 1.4 retrieving revision 1.5 diff -Lmacro.h -Lmacro.h -u -p -r1.4 -r1.5 --- macro.h +++ macro.h @@ -26,6 +26,12 @@ enum linestate { LINE_MACRO /* In the middle of a macro line. */ }; +enum parastate { + PARA_HAVE, /* Just printed .Pp or equivalent. */ + PARA_MID, /* In the middle of a paragraph. */ + PARA_WANT /* Need .Pp before printing anything else. */ +}; + struct format { int level; /* Header level, starting at 1. */ int flags; @@ -34,6 +40,7 @@ struct format { #define FMT_CHILD (1 << 2) /* Expect a single child macro. */ #define FMT_IMPL (1 << 3) /* Partial implicit block is open. */ enum linestate linestate; + enum parastate parastate; }; #define ARG_SPACE 1 /* Insert whitespace before this argument. */ Index: docbook2mdoc.c =================================================================== RCS file: /home/cvs/mdocml/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.129 retrieving revision 1.130 diff -Ldocbook2mdoc.c -Ldocbook2mdoc.c -u -p -r1.129 -r1.130 --- docbook2mdoc.c +++ docbook2mdoc.c @@ -141,45 +141,14 @@ pnode_printimagedata(struct format *f, s } static void -pnode_printpara(struct format *f, struct pnode *n) -{ - struct pnode *np; - - if (n->parent == NULL) - return; - - if ((np = TAILQ_PREV(n, pnodeq, child)) == NULL) - np = n->parent; - - f->flags = 0; - - switch (np->node) { - case NODE_ENTRY: - case NODE_FOOTNOTE: - case NODE_GLOSSTERM: - case NODE_LISTITEM: - case NODE_TERM: - return; - case NODE_APPENDIX: - case NODE_LEGALNOTICE: - case NODE_PREFACE: - case NODE_SECTION: - if (f->level < 3) - return; - break; - default: - break; - } - macro_line(f, "Pp"); -} - -static void pnode_printrefnamediv(struct format *f, struct pnode *n) { struct pnode *nc, *nn; int comma; + f->parastate = PARA_HAVE; macro_line(f, "Sh NAME"); + f->parastate = PARA_HAVE; comma = 0; TAILQ_FOREACH_SAFE(nc, &n->childq, child, nn) { if (nc->node != NODE_REFNAME) @@ -206,7 +175,9 @@ pnode_printrefsynopsisdiv(struct format if (nc->node == NODE_TITLE) pnode_unlink(nc); + f->parastate = PARA_HAVE; macro_line(f, "Sh SYNOPSIS"); + f->parastate = PARA_HAVE; } /* @@ -280,14 +251,17 @@ pnode_printsection(struct format *f, str switch (level) { case 1: macro_close(f); + f->parastate = PARA_HAVE; macro_open(f, "Sh"); break; case 2: macro_close(f); + f->parastate = PARA_HAVE; macro_open(f, "Ss"); break; default: - pnode_printpara(f, n); + if (f->parastate == PARA_MID) + f->parastate = PARA_WANT; macro_open(f, "Sy"); break; } @@ -304,12 +278,14 @@ pnode_printsection(struct format *f, str */ if (nc != NULL) { - ncc = TAILQ_FIRST(&nc->childq); - if (ncc != NULL && ncc->node == NODE_TEXT && + if (level == 1 && + (ncc = TAILQ_FIRST(&nc->childq)) != NULL && + ncc->node == NODE_TEXT && strcasecmp(ncc->b, "AUTHORS") == 0) macro_line(f, "An -nosplit"); pnode_unlink(nc); } + f->parastate = level > 2 ? PARA_WANT : PARA_HAVE; } /* @@ -785,6 +761,7 @@ pnode_printprologue(struct format *f, st pnode_unlink(name); pnode_unlink(vol); pnode_unlink(descr); + f->parastate = PARA_HAVE; } static void @@ -928,6 +905,7 @@ pnode_printvarlistentry(struct format *f int first = 1; macro_open(f, "It"); + f->parastate = PARA_HAVE; f->flags |= FMT_IMPL; TAILQ_FOREACH_SAFE(nc, &n->childq, child, nn) { if (nc->node != NODE_TERM && nc->node != NODE_GLOSSTERM) @@ -944,16 +922,19 @@ pnode_printvarlistentry(struct format *f break; } } + f->parastate = PARA_HAVE; pnode_print(f, nc); pnode_unlink(nc); first = 0; } macro_close(f); + f->parastate = PARA_HAVE; while ((nc = TAILQ_FIRST(&n->childq)) != NULL) { pnode_print(f, nc); pnode_unlink(nc); } macro_close(f); + f->parastate = PARA_HAVE; } static void @@ -963,8 +944,9 @@ pnode_printtitle(struct format *f, struc TAILQ_FOREACH_SAFE(nc, &n->childq, child, nn) { if (nc->node == NODE_TITLE) { - pnode_printpara(f, nc); - pnode_print(f, nc); + if (f->parastate == PARA_MID) + f->parastate = PARA_WANT; + macro_nodeline(f, "Sy", nc, 0); pnode_unlink(nc); } } @@ -992,7 +974,9 @@ pnode_printtgroup1(struct format *f, str macro_line(f, "Bl -bullet -compact"); while ((nc = pnode_findfirst(n, NODE_ENTRY)) != NULL) { macro_line(f, "It"); + f->parastate = PARA_HAVE; pnode_print(f, nc); + f->parastate = PARA_HAVE; pnode_unlink(nc); } macro_line(f, "El"); @@ -1004,16 +988,20 @@ pnode_printtgroup2(struct format *f, str { struct pnode *nr, *ne; + f->parastate = PARA_HAVE; macro_line(f, "Bl -tag -width Ds"); while ((nr = pnode_findfirst(n, NODE_ROW)) != NULL) { if ((ne = pnode_findfirst(n, NODE_ENTRY)) == NULL) break; macro_open(f, "It"); f->flags |= FMT_IMPL; + f->parastate = PARA_HAVE; pnode_print(f, ne); macro_close(f); pnode_unlink(ne); + f->parastate = PARA_HAVE; pnode_print(f, nr); + f->parastate = PARA_HAVE; pnode_unlink(nr); } macro_line(f, "El"); @@ -1036,6 +1024,7 @@ pnode_printtgroup(struct format *f, stru break; } + f->parastate = PARA_HAVE; macro_line(f, "Bl -ohang"); while ((nc = pnode_findfirst(n, NODE_ROW)) != NULL) { macro_line(f, "It Table Row"); @@ -1051,11 +1040,14 @@ pnode_printlist(struct format *f, struct struct pnode *nc; pnode_printtitle(f, n); + f->parastate = PARA_HAVE; macro_argline(f, "Bl", n->node == NODE_ORDEREDLIST ? "-enum" : "-bullet"); TAILQ_FOREACH(nc, &n->childq, child) { macro_line(f, "It"); + f->parastate = PARA_HAVE; pnode_print(f, nc); + f->parastate = PARA_HAVE; } macro_line(f, "El"); pnode_unlinksub(n); @@ -1067,6 +1059,7 @@ pnode_printvariablelist(struct format *f struct pnode *nc; pnode_printtitle(f, n); + f->parastate = PARA_HAVE; macro_line(f, "Bl -tag -width Ds"); TAILQ_FOREACH(nc, &n->childq, child) { if (nc->node == NODE_VARLISTENTRY) @@ -1110,7 +1103,9 @@ pnode_print(struct format *f, struct pno macro_line(f, "An -split"); break; case NODE_BLOCKQUOTE: + f->parastate = PARA_HAVE; macro_line(f, "Bd -ragged -offset indent"); + f->parastate = PARA_HAVE; break; case NODE_CITEREFENTRY: pnode_printciterefentry(f, n); @@ -1146,6 +1141,8 @@ pnode_print(struct format *f, struct pno if ((nc = TAILQ_FIRST(&n->childq)) != NULL && pnode_class(nc->node) < CLASS_LINE) macro_open(f, "Em"); + if (n->node == NODE_GLOSSTERM) + f->parastate = PARA_HAVE; break; case NODE_ENVAR: macro_open(f, "Ev"); @@ -1158,6 +1155,7 @@ pnode_print(struct format *f, struct pno break; case NODE_FOOTNOTE: macro_line(f, "Bo"); + f->parastate = PARA_HAVE; break; case NODE_FUNCTION: macro_open(f, "Fn"); @@ -1172,7 +1170,9 @@ pnode_print(struct format *f, struct pno pnode_printimagedata(f, n); break; case NODE_INFORMALEQUATION: + f->parastate = PARA_HAVE; macro_line(f, "Bd -ragged -offset indent"); + f->parastate = PARA_HAVE; /* FALLTHROUGH */ case NODE_INLINEEQUATION: macro_line(f, "EQ"); @@ -1201,8 +1201,10 @@ pnode_print(struct format *f, struct pno break; case NODE_LITERALLAYOUT: macro_close(f); + f->parastate = PARA_HAVE; macro_argline(f, "Bd", pnode_getattr(n, ATTRKEY_CLASS) == ATTRVAL_MONOSPACED ? "-literal" : "-unfilled"); + f->parastate = PARA_HAVE; break; case NODE_MARKUP: macro_open(f, "Ic"); @@ -1235,7 +1237,8 @@ pnode_print(struct format *f, struct pno pnode_printlist(f, n); break; case NODE_PARA: - pnode_printpara(f, n); + if (f->parastate == PARA_MID) + f->parastate = PARA_WANT; break; case NODE_PARAMDEF: case NODE_PARAMETER: @@ -1260,7 +1263,9 @@ pnode_print(struct format *f, struct pno case NODE_PROGRAMLISTING: case NODE_SCREEN: case NODE_SYNOPSIS: + f->parastate = PARA_HAVE; macro_line(f, "Bd -literal"); + f->parastate = PARA_HAVE; break; case NODE_SYSTEMITEM: pnode_printsystemitem(f, n); @@ -1296,7 +1301,8 @@ pnode_print(struct format *f, struct pno macro_open(f, "Ar"); break; case NODE_SBR: - macro_line(f, "br"); + if (f->parastate == PARA_MID) + macro_line(f, "br"); break; case NODE_SUBSCRIPT: if (f->linestate == LINE_MACRO) @@ -1320,7 +1326,8 @@ pnode_print(struct format *f, struct pno break; case NODE_TITLE: case NODE_SUBTITLE: - pnode_printpara(f, n); + if (f->parastate == PARA_MID) + f->parastate = PARA_WANT; macro_nodeline(f, "Sy", n, 0); pnode_unlinksub(n); break; @@ -1357,8 +1364,12 @@ pnode_print(struct format *f, struct pno /* Accept more arguments to the previous macro. */ return; case NODE_FOOTNOTE: + f->parastate = PARA_HAVE; macro_line(f, "Bc"); break; + case NODE_GLOSSTERM: + f->parastate = PARA_HAVE; + break; case NODE_INFORMALEQUATION: macro_line(f, "EN"); macro_line(f, "Ed"); @@ -1401,6 +1412,10 @@ pnode_print(struct format *f, struct pno break; fputs(" } ", stdout); break; + case NODE_PARA: + if (f->parastate == PARA_MID) + f->parastate = PARA_WANT; + break; case NODE_QUOTE: if ((nc = TAILQ_FIRST(&n->childq)) != NULL && nc->node == NODE_FILENAME && @@ -1427,8 +1442,13 @@ pnode_print(struct format *f, struct pno case NODE_PROGRAMLISTING: case NODE_SCREEN: case NODE_SYNOPSIS: + f->parastate = PARA_HAVE; macro_line(f, "Ed"); break; + case NODE_TITLE: + case NODE_SUBTITLE: + f->parastate = PARA_WANT; + break; default: break; } @@ -1442,6 +1462,7 @@ ptree_print_mdoc(struct ptree *tree) formatter.level = 0; formatter.linestate = LINE_NEW; + formatter.parastate = PARA_HAVE; pnode_printprologue(&formatter, tree->root); pnode_print(&formatter, tree->root); if (formatter.linestate != LINE_NEW) -- To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv