=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.107 retrieving revision 1.109 diff -u -p -r1.107 -r1.109 --- docbook2mdoc/docbook2mdoc.c 2019/04/12 08:48:16 1.107 +++ docbook2mdoc/docbook2mdoc.c 2019/04/12 10:34:48 1.109 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.107 2019/04/12 08:48:16 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.109 2019/04/12 10:34:48 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -573,24 +573,34 @@ pnode_printauthor(struct format *f, struct pnode *n) static void pnode_printlink(struct format *f, struct pnode *n) { + struct pnode *nc; const char *uri, *text; uri = pnode_getattr_raw(n, ATTRKEY_LINKEND, NULL); if (uri != NULL) { if (TAILQ_FIRST(&n->childq) != NULL) { - print_textnode(f, n); + TAILQ_FOREACH(nc, &n->childq, child) + pnode_print(f, nc); text = ""; - } else { - text = pnode_getattr_raw(n, ATTRKEY_ENDTERM, NULL); - if (text != NULL) + } else if ((text = pnode_getattr_raw(n, + ATTRKEY_ENDTERM, NULL)) != NULL) { + if (f->linestate == LINE_MACRO && f->flags & FMT_ARG) + macro_addarg(f, text, ARG_SPACE); + else print_text(f, text, ARG_SPACE); } if (text != NULL) { - macro_open(f, "Pq"); - f->flags |= FMT_CHILD; + if (f->flags & FMT_IMPL) + macro_open(f, "Po"); + else { + macro_open(f, "Pq"); + f->flags |= FMT_CHILD; + } } macro_open(f, "Sx"); macro_addarg(f, uri, ARG_SPACE); + if (text != NULL && f->flags & FMT_IMPL) + macro_open(f, "Pc"); pnode_unlinksub(n); return; } @@ -641,25 +651,36 @@ pnode_printprologue(struct format *f, struct ptree *tr static void pnode_printvarlistentry(struct format *f, struct pnode *n) { - struct pnode *nc; + struct pnode *nc, *nn; int first = 1; - macro_close(f); macro_open(f, "It"); f->flags |= FMT_IMPL; - TAILQ_FOREACH(nc, &n->childq, child) { + TAILQ_FOREACH_SAFE(nc, &n->childq, child, nn) { if (nc->node != NODE_TERM && nc->node != NODE_GLOSSTERM) continue; - if ( ! first) - macro_addarg(f, ",", 0); + if (first == 0) { + switch (f->linestate) { + case LINE_NEW: + break; + case LINE_TEXT: + print_text(f, ",", 0); + break; + case LINE_MACRO: + macro_addarg(f, ",", 0); + break; + } + } pnode_print(f, nc); + pnode_unlink(nc); first = 0; } macro_close(f); - TAILQ_FOREACH(nc, &n->childq, child) - if (nc->node != NODE_TERM && nc->node != NODE_GLOSSTERM) - pnode_print(f, nc); - pnode_unlinksub(n); + while ((nc = TAILQ_FIRST(&n->childq)) != NULL) { + pnode_print(f, nc); + pnode_unlink(nc); + } + macro_close(f); } static void