=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.89 retrieving revision 1.102 diff -u -p -r1.89 -r1.102 --- docbook2mdoc/docbook2mdoc.c 2019/04/03 16:52:51 1.89 +++ docbook2mdoc/docbook2mdoc.c 2019/04/10 14:37:32 1.102 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.89 2019/04/03 16:52:51 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.102 2019/04/10 14:37:32 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -32,63 +32,136 @@ static void pnode_print(struct format *, struct pnode static void -pnode_printpara(struct format *p, struct pnode *pn) +pnode_printtext(struct format *f, struct pnode *n) { - struct pnode *pp; + struct pnode *nn; + char *cp; + char last; - if ((pp = TAILQ_PREV(pn, pnodeq, child)) == NULL && - (pp = pn->parent) == NULL) + if (n->bsz == 0) { + assert(n->real < n->b); return; + } - switch (pp->node) { + /* + * Text preceding a macro without intervening whitespace + * requires a .Pf macro. + * Set the spacing flag to avoid a redundant .Ns macro. + */ + + if (f->linestate != LINE_MACRO && + (nn = TAILQ_NEXT(n, child)) != NULL && nn->spc == 0 && + (nn->node != NODE_TEXT && nn->node != NODE_ESCAPE)) { + macro_open(f, "Pf"); + nn->spc = 1; + } + + if (f->linestate == LINE_NEW) { + last = '\n'; + f->linestate = LINE_TEXT; + } else { + last = ' '; + if (n->spc || f->linestate == LINE_MACRO) + putchar(' '); + } + + if (n->node == NODE_ESCAPE) { + fputs(n->b, stdout); + return; + } + + /* + * Remove the prefix '-' from