=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.126 retrieving revision 1.129 diff -u -p -r1.126 -r1.129 --- docbook2mdoc/docbook2mdoc.c 2019/04/14 22:37:56 1.126 +++ docbook2mdoc/docbook2mdoc.c 2019/04/15 19:15:19 1.129 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.126 2019/04/14 22:37:56 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.129 2019/04/15 19:15:19 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -625,6 +625,18 @@ pnode_printauthor(struct format *f, struct pnode *n) } static void +pnode_printxref(struct format *f, struct pnode *n) +{ + const char *linkend; + + linkend = pnode_getattr_raw(n, ATTRKEY_LINKEND, NULL); + if (linkend != NULL) { + macro_open(f, "Sx"); + macro_addarg(f, linkend, ARG_SPACE); + } +} + +static void pnode_printlink(struct format *f, struct pnode *n) { struct pnode *nc; @@ -667,8 +679,40 @@ pnode_printlink(struct format *f, struct pnode *n) if (TAILQ_FIRST(&n->childq) != NULL) macro_addnode(f, n, ARG_SPACE | ARG_SINGLE); pnode_unlinksub(n); + } +} + +static void +pnode_printolink(struct format *f, struct pnode *n) +{ + const char *uri, *ptr, *local; + + uri = pnode_getattr_raw(n, ATTRKEY_TARGETDOC, NULL); + ptr = pnode_getattr_raw(n, ATTRKEY_TARGETPTR, NULL); + local = pnode_getattr_raw(n, ATTRKEY_LOCALINFO, NULL); + if (uri == NULL) { + uri = ptr; + ptr = NULL; + } + if (uri == NULL) { + uri = local; + local = NULL; + } + if (uri == NULL) return; + + macro_open(f, "Lk"); + macro_addarg(f, uri, ARG_SPACE | ARG_SINGLE); + macro_addnode(f, n, ARG_SPACE | ARG_SINGLE); + if (ptr != NULL || local != NULL) { + macro_close(f); + macro_open(f, "Pq"); + if (ptr != NULL) + macro_addarg(f, ptr, ARG_SPACE); + if (local != NULL) + macro_addarg(f, local, ARG_SPACE); } + pnode_unlinksub(n); } static void @@ -1179,6 +1223,9 @@ pnode_print(struct format *f, struct pnode *n) case NODE_MML_MSUP: pnode_printmath(f, n); break; + case NODE_OLINK: + pnode_printolink(f, n); + break; case NODE_OPTION: if ((nc = TAILQ_FIRST(&n->childq)) != NULL && pnode_class(nc->node) < CLASS_LINE) @@ -1198,7 +1245,12 @@ pnode_print(struct format *f, struct pnode *n) pnode_unlinksub(n); break; case NODE_QUOTE: - if (was_impl) + if ((nc = TAILQ_FIRST(&n->childq)) != NULL && + nc->node == NODE_FILENAME && + TAILQ_NEXT(nc, child) == NULL) { + if (n->spc) + nc->spc = 1; + } else if (was_impl) macro_open(f, "Do"); else { macro_open(f, "Dq"); @@ -1281,6 +1333,9 @@ pnode_print(struct format *f, struct pnode *n) case NODE_VARNAME: macro_open(f, "Va"); break; + case NODE_XREF: + pnode_printxref(f, n); + break; default: break; } @@ -1347,7 +1402,11 @@ pnode_print(struct format *f, struct pnode *n) fputs(" } ", stdout); break; case NODE_QUOTE: - if (was_impl) { + if ((nc = TAILQ_FIRST(&n->childq)) != NULL && + nc->node == NODE_FILENAME && + TAILQ_NEXT(nc, child) == NULL) + /* nothing */; + else if (was_impl) { f->flags &= ~FMT_NOSPC; macro_open(f, "Dc"); } else