=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.69 retrieving revision 1.71 diff -u -p -r1.69 -r1.71 --- docbook2mdoc/docbook2mdoc.c 2019/03/24 16:45:46 1.69 +++ docbook2mdoc/docbook2mdoc.c 2019/03/24 23:48:58 1.71 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.69 2019/03/24 16:45:46 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.71 2019/03/24 23:48:58 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -711,6 +711,23 @@ macro_closepunct(struct parse *p, struct pnode *pn) } static void +print_text(struct parse *p, const char *word) +{ + switch (p->linestate) { + case LINE_NEW: + break; + case LINE_TEXT: + putchar(' '); + break; + case LINE_MACRO: + macro_close(p); + break; + } + fputs(word, stdout); + p->linestate = LINE_TEXT; +} + +static void pnode_printpara(struct parse *p, struct pnode *pn) { struct pnode *pp; @@ -740,13 +757,13 @@ pnode_printpara(struct parse *p, struct pnode *pn) static void pnode_printrefsynopsisdiv(struct parse *p, struct pnode *pn) { - struct pnode *pp; + struct pnode *pp, *pq; - TAILQ_FOREACH(pp, &pn->childq, child) - if (pp->node == NODE_TITLE) { + TAILQ_FOREACH_SAFE(pp, &pn->childq, child, pq) + if (pp->node == NODE_TITLE) pnode_unlink(pp); - return; - } + + macro_line(p, "Sh SYNOPSIS"); } /* @@ -850,6 +867,7 @@ pnode_printciterefentry(struct parse *p, struct pnode else macro_addnode(p, manvol, 0); macro_close(p); + pnode_unlinksub(pn); } static void @@ -874,6 +892,7 @@ pnode_printrefmeta(struct parse *p, struct pnode *pn) else macro_addnode(p, manvol, 0); macro_close(p); + pnode_unlink(pn); } static void @@ -944,8 +963,8 @@ pnode_printmathfenced(struct parse *p, struct pnode *p putchar(','); pnode_print(p, pp); } - printf("right %s ", pnode_getattr_raw(pn, ATTRKEY_CLOSE, ")")); + pnode_unlinksub(pn); } /* @@ -978,6 +997,7 @@ pnode_printmath(struct parse *p, struct pnode *pn) pp = TAILQ_NEXT(pp, child); pnode_print(p, pp); + pnode_unlinksub(pn); } static void @@ -999,6 +1019,7 @@ pnode_printfuncprototype(struct parse *p, struct pnode pnode_printparamdef(p, pp); macro_line(p, "Fc"); + pnode_unlinksub(pn); } /* @@ -1034,6 +1055,7 @@ pnode_printarg(struct parse *p, struct pnode *pn) if (isrep && pp->node == NODE_TEXT) macro_addarg(p, "...", 0); } + pnode_unlinksub(pn); } static void @@ -1084,6 +1106,7 @@ pnode_printgroup(struct parse *p, struct pnode *pn) } if (sv) macro_close(p); + pnode_unlinksub(pn); } static void @@ -1095,10 +1118,9 @@ pnode_printprologue(struct parse *p, struct pnode *pn) pnode_findfirst(p->root, NODE_REFMETA); macro_line(p, "Dd $Mdocdate" "$"); - if (pp != NULL) { + if (pp != NULL) pnode_printrefmeta(p, pp); - pnode_unlink(pp); - } else { + else { macro_open(p, "Dt"); macro_addarg(p, pnode_getattr_raw(p->root, ATTRKEY_ID, "UNKNOWN"), 0); @@ -1109,7 +1131,7 @@ pnode_printprologue(struct parse *p, struct pnode *pn) if (p->flags & PARSE_EQN) { macro_line(p, "EQ"); - puts("delim $$"); + print_text(p, "delim $$"); macro_line(p, "EN"); } } @@ -1129,7 +1151,7 @@ pnode_printvarlistentry(struct parse *p, struct pnode if (pp->node != NODE_TERM) continue; if ( ! first) - putchar(','); + macro_addarg(p, ",", MACROLINE_NOWS); pnode_print(p, pp); first = 0; } @@ -1137,9 +1159,24 @@ pnode_printvarlistentry(struct parse *p, struct pnode TAILQ_FOREACH(pp, &pn->childq, child) if (pp->node != NODE_TERM) pnode_print(p, pp); + pnode_unlinksub(pn); } static void +pnode_printtitle(struct parse *p, struct pnode *pn) +{ + struct pnode *pp, *pq; + + TAILQ_FOREACH_SAFE(pp, &pn->childq, child, pq) { + if (pp->node == NODE_TITLE) { + pnode_printpara(p, pp); + pnode_print(p, pp); + pnode_unlink(pp); + } + } +} + +static void pnode_printrow(struct parse *p, struct pnode *pn) { struct pnode *pp; @@ -1150,6 +1187,7 @@ pnode_printrow(struct parse *p, struct pnode *pn) pnode_print(p, pp); } macro_line(p, "El"); + pnode_unlink(pn); } static void @@ -1157,20 +1195,14 @@ pnode_printtable(struct parse *p, struct pnode *pn) { struct pnode *pp; - TAILQ_FOREACH(pp, &pn->childq, child) { - if (pp->node == NODE_TITLE) { - pnode_printpara(p, pp); - pnode_print(p, pp); - pnode_unlink(pp); - } - } + 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); - pnode_unlink(pp); } macro_line(p, "El"); + pnode_unlinksub(pn); } static void @@ -1178,13 +1210,7 @@ pnode_printlist(struct parse *p, struct pnode *pn) { struct pnode *pp; - TAILQ_FOREACH(pp, &pn->childq, child) { - if (pp->node == NODE_TITLE) { - pnode_printpara(p, pp); - pnode_print(p, pp); - pnode_unlink(pp); - } - } + pnode_printtitle(p, pn); macro_argline(p, "Bl", pn->node == NODE_ORDEREDLIST ? "-enum" : "-bullet"); TAILQ_FOREACH(pp, &pn->childq, child) { @@ -1192,6 +1218,7 @@ pnode_printlist(struct parse *p, struct pnode *pn) pnode_print(p, pp); } macro_line(p, "El"); + pnode_unlinksub(pn); } static void @@ -1199,13 +1226,7 @@ pnode_printvariablelist(struct parse *p, struct pnode { struct pnode *pp; - TAILQ_FOREACH(pp, &pn->childq, child) { - if (pp->node == NODE_TITLE) { - pnode_printpara(p, pp); - pnode_print(p, pp); - pnode_unlink(pp); - } - } + pnode_printtitle(p, pn); macro_line(p, "Bl -tag -width Ds"); TAILQ_FOREACH(pp, &pn->childq, child) { if (pp->node == NODE_VARLISTENTRY) @@ -1214,6 +1235,7 @@ pnode_printvariablelist(struct parse *p, struct pnode macro_nodeline(p, "It", pp); } macro_line(p, "El"); + pnode_unlinksub(pn); } /* @@ -1245,7 +1267,6 @@ pnode_print(struct parse *p, struct pnode *pn) return; case NODE_ARG: pnode_printarg(p, pn); - pnode_unlinksub(pn); break; case NODE_AUTHOR: macro_open(p, "An"); @@ -1258,7 +1279,6 @@ pnode_print(struct parse *p, struct pnode *pn) break; case NODE_CITEREFENTRY: pnode_printciterefentry(p, pn); - pnode_unlinksub(pn); break; case NODE_CITETITLE: macro_open(p, "%T"); @@ -1273,10 +1293,7 @@ pnode_print(struct parse *p, struct pnode *pn) macro_open(p, "Dv"); break; case NODE_EDITOR: - if (p->linestate != LINE_NEW) - putchar('\n'); - puts("editor:"); - p->linestate = LINE_TEXT; + print_text(p, "editor:"); macro_open(p, "An"); break; case NODE_EMAIL: @@ -1297,7 +1314,6 @@ pnode_print(struct parse *p, struct pnode *pn) break; case NODE_FUNCPROTOTYPE: pnode_printfuncprototype(p, pn); - pnode_unlinksub(pn); break; case NODE_FUNCSYNOPSISINFO: macro_open(p, "Fd"); @@ -1314,11 +1330,9 @@ pnode_print(struct parse *p, struct pnode *pn) break; case NODE_ITEMIZEDLIST: pnode_printlist(p, pn); - pnode_unlinksub(pn); break; case NODE_GROUP: pnode_printgroup(p, pn); - pnode_unlinksub(pn); break; case NODE_KEYSYM: macro_open(p, "Sy"); @@ -1341,7 +1355,6 @@ pnode_print(struct parse *p, struct pnode *pn) break; case NODE_MML_MFENCED: pnode_printmathfenced(p, pn); - pnode_unlinksub(pn); break; case NODE_MML_MROW: case NODE_MML_MI: @@ -1355,14 +1368,12 @@ pnode_print(struct parse *p, struct pnode *pn) case NODE_MML_MSUB: case NODE_MML_MSUP: pnode_printmath(p, pn); - pnode_unlinksub(pn); break; case NODE_OPTION: macro_open(p, "Fl"); break; case NODE_ORDEREDLIST: pnode_printlist(p, pn); - pnode_unlinksub(pn); break; case NODE_PARA: pnode_printpara(p, pn); @@ -1391,7 +1402,8 @@ pnode_print(struct parse *p, struct pnode *pn) break; case NODE_REFNAME: /* Suppress non-text children... */ - macro_nodeline(p, "Nm", pn); + macro_open(p, "Nm"); + macro_addnode(p, pn, 0); pnode_unlinksub(pn); break; case NODE_REFNAMEDIV: @@ -1402,7 +1414,6 @@ pnode_print(struct parse *p, struct pnode *pn) break; case NODE_REFSYNOPSISDIV: pnode_printrefsynopsisdiv(p, pn); - macro_line(p, "Sh SYNOPSIS"); break; case NODE_PREFACE: case NODE_SECTION: @@ -1427,7 +1438,6 @@ pnode_print(struct parse *p, struct pnode *pn) case NODE_TABLE: case NODE_INFORMALTABLE: pnode_printtable(p, pn); - pnode_unlinksub(pn); break; case NODE_TEXT: bufclear(p); @@ -1486,11 +1496,9 @@ pnode_print(struct parse *p, struct pnode *pn) break; case NODE_VARIABLELIST: pnode_printvariablelist(p, pn); - pnode_unlinksub(pn); break; case NODE_VARLISTENTRY: pnode_printvarlistentry(p, pn); - pnode_unlinksub(pn); break; case NODE_VARNAME: macro_open(p, "Va"); @@ -1566,7 +1574,7 @@ pnode_print(struct parse *p, struct pnode *pn) pn->parent->node == NODE_REFNAMEDIV && TAILQ_NEXT(pn, child) != NULL && TAILQ_NEXT(pn, child)->node == NODE_REFNAME) - fputs(" ,", stdout); + macro_addarg(p, ",", 0); if (sv == LINE_NEW) macro_close(p); break;