=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.79 retrieving revision 1.89 diff -u -p -r1.79 -r1.89 --- docbook2mdoc/docbook2mdoc.c 2019/04/02 15:53:02 1.79 +++ docbook2mdoc/docbook2mdoc.c 2019/04/03 16:52:51 1.89 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.79 2019/04/02 15:53:02 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.89 2019/04/03 16:52:51 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -172,7 +172,6 @@ pnode_printciterefentry(struct format *p, struct pnode macro_addarg(p, "1", ARG_SPACE); else macro_addnode(p, manvol, ARG_SPACE | ARG_SINGLE); - macro_close(p); pnode_unlinksub(pn); } @@ -202,25 +201,17 @@ pnode_printrefmeta(struct format *p, struct pnode *pn) } static void -pnode_printfuncdef(struct format *p, struct pnode *pn) +pnode_printfuncdef(struct format *f, struct pnode *n) { - struct pnode *pp, *ftype, *func; + struct pnode *nc; - ftype = func = NULL; - TAILQ_FOREACH(pp, &pn->childq, child) { - if (pp->node == NODE_TEXT) - ftype = pp; - else if (pp->node == NODE_FUNCTION) - func = pp; + nc = TAILQ_FIRST(&n->childq); + if (nc != NULL && nc->node == NODE_TEXT) { + macro_argline(f, "Ft", nc->b); + pnode_unlink(nc); } - if (ftype != NULL) - macro_argline(p, "Ft", ftype->b); - macro_open(p, "Fo"); - if (func == NULL) - macro_addarg(p, "UNKNOWN", ARG_SPACE); - else - macro_addnode(p, func, ARG_SPACE | ARG_SINGLE); - macro_close(p); + macro_nodeline(f, "Fo", n, ARG_SINGLE); + pnode_unlinksub(n); } /* @@ -289,14 +280,14 @@ pnode_printfuncprototype(struct format *p, struct pnod if (fdef->node == NODE_FUNCDEF) break; - if (fdef != NULL) + if (fdef != NULL) { pnode_printfuncdef(p, fdef); - else + pnode_unlink(fdef); + } else macro_line(p, "Fo UNKNOWN"); TAILQ_FOREACH(pp, &pn->childq, child) - if (pp->node == NODE_PARAMDEF) - macro_nodeline(p, "Fa", pp, ARG_SINGLE); + macro_nodeline(p, "Fa", pp, ARG_SINGLE); macro_line(p, "Fc"); pnode_unlinksub(pn); @@ -438,6 +429,16 @@ pnode_printauthor(struct format *f, struct pnode *n) } /* + * If there is an email address, + * print it on the same macro line. + */ + + if ((nc = pnode_findfirst(n, NODE_EMAIL)) != NULL) { + pnode_print(f, nc); + pnode_unlink(nc); + } + + /* * If there are still unprinted children, end the scope * with a comma. Otherwise, leave the scope open in case * a text node follows that starts with closing punctuation. @@ -531,21 +532,66 @@ pnode_printrow(struct format *p, struct pnode *pn) } static void -pnode_printtable(struct format *p, struct pnode *pn) +pnode_printtgroup1(struct format *f, struct pnode *n) { - struct pnode *pp; + struct pnode *nc; - pnode_printtitle(p, pn); - macro_line(p, "Bl -ohang"); - while ((pp = pnode_findfirst(pn, NODE_ROW)) != NULL) { - macro_line(p, "It Table Row"); - pnode_printrow(p, pp); + macro_line(f, "Bl -bullet -compact"); + while ((nc = pnode_findfirst(n, NODE_ENTRY)) != NULL) { + macro_line(f, "It"); + pnode_print(f, nc); + pnode_unlink(nc); } - macro_line(p, "El"); - pnode_unlinksub(pn); + macro_line(f, "El"); + pnode_unlinksub(n); } static void +pnode_printtgroup2(struct format *f, struct pnode *n) +{ + struct pnode *nr, *ne; + + 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"); + pnode_print(f, ne); + macro_close(f); + pnode_unlink(ne); + pnode_print(f, nr); + pnode_unlink(nr); + } + macro_line(f, "El"); + pnode_unlinksub(n); +} + +static void +pnode_printtgroup(struct format *f, struct pnode *n) +{ + struct pnode *nc; + + switch (atoi(pnode_getattr_raw(n, ATTRKEY_COLS, "0"))) { + case 1: + pnode_printtgroup1(f, n); + return; + case 2: + pnode_printtgroup2(f, n); + return; + default: + break; + } + + macro_line(f, "Bl -ohang"); + while ((nc = pnode_findfirst(n, NODE_ROW)) != NULL) { + macro_line(f, "It Table Row"); + pnode_printrow(f, nc); + } + macro_line(f, "El"); + pnode_unlinksub(n); +} + +static void pnode_printlist(struct format *p, struct pnode *pn) { struct pnode *pp; @@ -570,7 +616,7 @@ pnode_printvariablelist(struct format *p, struct pnode macro_line(p, "Bl -tag -width Ds"); TAILQ_FOREACH(pp, &pn->childq, child) { if (pp->node == NODE_VARLISTENTRY) - pnode_print(p, pp); + pnode_printvarlistentry(p, pp); else macro_nodeline(p, "It", pp, 0); } @@ -720,6 +766,7 @@ pnode_print(struct format *p, struct pnode *pn) case NODE_PARA: pnode_printpara(p, pn); break; + case NODE_PARAMDEF: case NODE_PARAMETER: macro_nodeline(p, "Fa", pn, ARG_SINGLE); pnode_unlinksub(pn); @@ -729,15 +776,13 @@ pnode_print(struct format *p, struct pnode *pn) break; case NODE_PROGRAMLISTING: case NODE_SCREEN: + case NODE_SYNOPSIS: macro_line(p, "Bd -literal"); break; case NODE_REFENTRYINFO: /* Suppress. */ pnode_unlinksub(pn); break; - case NODE_REFMETA: - abort(); - break; case NODE_REFNAME: /* Suppress non-text children... */ macro_open(p, "Nm"); @@ -773,10 +818,6 @@ pnode_print(struct format *p, struct pnode *pn) case NODE_STRUCTNAME: macro_open(p, "Vt"); break; - case NODE_TABLE: - case NODE_INFORMALTABLE: - pnode_printtable(p, pn); - break; case NODE_TEXT: if (pn->bsz == 0) { assert(pn->real != pn->b); @@ -820,9 +861,17 @@ pnode_print(struct format *p, struct pnode *pn) putchar('e'); } break; + case NODE_TGROUP: + pnode_printtgroup(p, pn); + break; case NODE_TITLE: - if (pn->parent->node == NODE_BOOKINFO) + if (pn->parent->node == NODE_BOOKINFO) { macro_open(p, "Nd"); + break; + } + pnode_printpara(p, pn); + macro_nodeline(p, "Sy", pn, 0); + pnode_unlinksub(pn); break; case NODE_TYPE: macro_open(p, "Vt"); @@ -833,9 +882,6 @@ pnode_print(struct format *p, struct pnode *pn) case NODE_VARIABLELIST: pnode_printvariablelist(p, pn); break; - case NODE_VARLISTENTRY: - pnode_printvarlistentry(p, pn); - break; case NODE_VARNAME: macro_open(p, "Va"); break; @@ -925,6 +971,7 @@ pnode_print(struct format *p, struct pnode *pn) case NODE_LITERALLAYOUT: case NODE_PROGRAMLISTING: case NODE_SCREEN: + case NODE_SYNOPSIS: macro_line(p, "Ed"); break; case NODE_TITLE: