=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.143 retrieving revision 1.148 diff -u -p -r1.143 -r1.148 --- docbook2mdoc/docbook2mdoc.c 2019/04/28 19:59:01 1.143 +++ docbook2mdoc/docbook2mdoc.c 2019/05/02 04:15:40 1.148 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.143 2019/04/28 19:59:01 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.148 2019/05/02 04:15:40 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -40,6 +40,7 @@ pnode_printtext(struct format *f, struct pnode *n) char *cp; int accept_arg; + para_check(f); cp = n->b; accept_arg = f->flags & FMT_ARG; if (f->linestate == LINE_MACRO && !accept_arg && @@ -54,15 +55,18 @@ pnode_printtext(struct format *f, struct pnode *n) if (isspace((unsigned char)*cp)) { while (isspace((unsigned char)*cp)) cp++; - macro_close(f); + n->flags |= NFLAG_SPC; } else { - fputs(" Ns", stdout); - f->flags &= FMT_IMPL; + f->flags &= ~FMT_NOSPC; + f->flags |= FMT_CHILD; + macro_open(f, "Ns"); + f->flags &= ~FMT_ARG; + f->flags |= FMT_CHILD; accept_arg = 1; } } - if (f->linestate == LINE_MACRO && !accept_arg && - (f->flags & (FMT_CHILD | FMT_IMPL)) == 0) + if (f->linestate == LINE_MACRO && f->nofill == 0 && + !accept_arg && (f->flags & FMT_IMPL) == 0) macro_close(f); /* @@ -71,7 +75,7 @@ pnode_printtext(struct format *f, struct pnode *n) * Set the spacing flag to avoid a redundant .Ns macro. */ - if (f->linestate != LINE_MACRO && + if ((f->nofill || f->linestate != LINE_MACRO) && (nn = TAILQ_NEXT(n, child)) != NULL && (nn->flags & NFLAG_SPC) == 0) { switch (pnode_class(nn->node)) { @@ -100,9 +104,16 @@ pnode_printtext(struct format *f, struct pnode *n) } break; case LINE_MACRO: - if (accept_arg == 0) - macro_close(f); - else if (n->flags & NFLAG_SPC || + if (accept_arg == 0) { + if (f->nofill) { + f->flags &= ~FMT_NOSPC; + f->flags |= FMT_CHILD; + macro_open(f, "No "); + f->flags &= ~FMT_ARG; + f->flags |= FMT_CHILD; + } else + macro_close(f); + } else if (n->flags & NFLAG_SPC || (f->flags & FMT_ARG) == 0 || (nn = TAILQ_PREV(n, pnodeq, child)) == NULL || pnode_class(nn->node) != CLASS_TEXT) @@ -345,7 +356,7 @@ pnode_printmath(struct format *f, struct pnode *n) static void pnode_printfuncprototype(struct format *f, struct pnode *n) { - struct pnode *fdef, *ftype, *nc, *nn; + struct pnode *fdef, *fps, *ftype, *nc, *nn; /* * Extract child and ignore child. @@ -399,7 +410,16 @@ pnode_printfuncprototype(struct format *f, struct pnod return; while (nc != NULL) { - macro_nodeline(f, "Fa", nc, ARG_SINGLE); + if ((fps = pnode_takefirst(nc, NODE_FUNCPARAMS)) != NULL) { + macro_open(f, "Fa \""); + macro_addnode(f, nc, ARG_QUOTED); + macro_addarg(f, "(", ARG_QUOTED); + macro_addnode(f, fps, ARG_QUOTED); + macro_addarg(f, ")", ARG_QUOTED); + putchar('"'); + macro_close(f); + } else + macro_nodeline(f, "Fa", nc, ARG_SINGLE); pnode_unlink(nc); nc = TAILQ_FIRST(&n->childq); } @@ -921,6 +941,10 @@ pnode_print(struct format *f, struct pnode *n) if (n == NULL) return; + if (n->flags & NFLAG_LINE && + (f->nofill || (f->flags & (FMT_ARG | FMT_IMPL)) == 0)) + macro_close(f); + was_impl = f->flags & FMT_IMPL; if (n->flags & NFLAG_SPC) f->flags &= ~FMT_NOSPC; @@ -1184,6 +1208,9 @@ pnode_print(struct format *f, struct pnode *n) break; } + if (pnode_class(n->node) == CLASS_NOFILL) + f->nofill++; + TAILQ_FOREACH(nc, &n->childq, child) pnode_print(f, nc); @@ -1284,10 +1311,21 @@ pnode_print(struct format *f, struct pnode *n) case NODE_SUBTITLE: f->parastate = PARA_WANT; break; + case NODE_YEAR: + if ((nn = TAILQ_NEXT(n, child)) != NULL && + nn->node == NODE_YEAR && + f->linestate == LINE_TEXT) { + print_text(f, ",", 0); + nn->flags |= NFLAG_SPC; + if ((nc = TAILQ_FIRST(&nn->childq)) != NULL) + nc->flags |= NFLAG_SPC; + } default: break; } f->flags &= ~FMT_ARG; + if (pnode_class(n->node) == CLASS_NOFILL) + f->nofill--; } void @@ -1295,7 +1333,7 @@ ptree_print_mdoc(struct ptree *tree) { struct format formatter; - formatter.level = 0; + formatter.level = formatter.nofill = 0; formatter.linestate = LINE_NEW; formatter.parastate = PARA_HAVE; pnode_printprologue(&formatter, tree->root);