=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.108 retrieving revision 1.110 diff -u -p -r1.108 -r1.110 --- docbook2mdoc/docbook2mdoc.c 2019/04/12 09:39:21 1.108 +++ docbook2mdoc/docbook2mdoc.c 2019/04/12 11:19:31 1.110 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.108 2019/04/12 09:39:21 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.110 2019/04/12 11:19:31 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -150,6 +150,27 @@ pnode_printpara(struct format *f, struct pnode *n) macro_line(f, "Pp"); } +static void +pnode_printrefnamediv(struct format *f, struct pnode *n) +{ + struct pnode *nc, *nn; + int comma; + + macro_line(f, "Sh NAME"); + comma = 0; + TAILQ_FOREACH_SAFE(nc, &n->childq, child, nn) { + if (nc->node != NODE_REFNAME) + continue; + if (comma) + macro_addarg(f, ",", ARG_SPACE); + macro_open(f, "Nm"); + macro_addnode(f, nc, ARG_SPACE); + pnode_unlink(nc); + comma = 1; + } + macro_close(f); +} + /* * If the SYNOPSIS macro has a superfluous title, kill it. */ @@ -573,24 +594,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; } @@ -954,13 +985,11 @@ pnode_print(struct format *f, struct pnode *n) pnode_unlinksub(n); break; case NODE_REFNAME: - /* Suppress non-text children... */ + /* More often, these appear inside NODE_REFNAMEDIV. */ macro_open(f, "Nm"); - macro_addnode(f, n, ARG_SPACE | ARG_SINGLE); - pnode_unlinksub(n); break; case NODE_REFNAMEDIV: - macro_line(f, "Sh NAME"); + pnode_printrefnamediv(f, n); break; case NODE_REFPURPOSE: macro_open(f, "Nd"); @@ -1061,20 +1090,6 @@ pnode_print(struct format *f, struct pnode *n) macro_close(f); sv = f->linestate; macro_open(f, "Qc"); - if (sv == LINE_NEW) - macro_close(f); - break; - case NODE_REFNAME: - /* - * If we're in the NAME macro and we have multiple - * macros in sequence, then print out a - * trailing comma before the newline. - */ - if (n->parent != NULL && - n->parent->node == NODE_REFNAMEDIV && - TAILQ_NEXT(n, child) != NULL && - TAILQ_NEXT(n, child)->node == NODE_REFNAME) - macro_addarg(f, ",", ARG_SPACE); if (sv == LINE_NEW) macro_close(f); break;