=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.119 retrieving revision 1.129 diff -u -p -r1.119 -r1.129 --- docbook2mdoc/docbook2mdoc.c 2019/04/14 12:38:33 1.119 +++ docbook2mdoc/docbook2mdoc.c 2019/04/15 19:15:19 1.129 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.119 2019/04/14 12:38:33 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 @@ -126,6 +126,21 @@ pnode_printtext(struct format *f, struct pnode *n) } static void +pnode_printimagedata(struct format *f, struct pnode *n) +{ + const char *cp; + + if ((cp = pnode_getattr_raw(n, ATTRKEY_FILEREF, NULL)) == NULL) + cp = pnode_getattr_raw(n, ATTRKEY_ENTITYREF, NULL); + if (cp != NULL) { + print_text(f, "[image:", ARG_SPACE); + print_text(f, cp, ARG_SPACE); + print_text(f, "]", 0); + } else + print_text(f, "[image]", ARG_SPACE); +} + +static void pnode_printpara(struct format *f, struct pnode *n) { struct pnode *np; @@ -140,6 +155,7 @@ pnode_printpara(struct format *f, struct pnode *n) switch (np->node) { case NODE_ENTRY: + case NODE_FOOTNOTE: case NODE_GLOSSTERM: case NODE_LISTITEM: case NODE_TERM: @@ -210,19 +226,22 @@ pnode_printsection(struct format *f, struct pnode *n) level = ++f->level; flags = ARG_SPACE; - if (level == 1) - flags |= ARG_UPPER; - if (level < 3) { - switch (n->node) { - case NODE_CAUTION: - case NODE_NOTE: - case NODE_TIP: - case NODE_WARNING: + switch (n->node) { + case NODE_PREFACE: + case NODE_SECTION: + case NODE_APPENDIX: + if (level == 1) + flags |= ARG_UPPER; + break; + case NODE_SIMPLESECT: + case NODE_LEGALNOTICE: + if (level < 2) + level = 2; + break; + default: + if (level < 3) level = 3; - break; - default: - break; - } + break; } TAILQ_FOREACH(nc, &n->childq, child) @@ -606,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; @@ -648,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 @@ -1037,9 +1100,6 @@ pnode_print(struct format *f, struct pnode *n) f->flags |= FMT_NOSPC; switch (n->node) { - case NODE_APPLICATION: - macro_open(f, "Nm"); - break; case NODE_ARG: pnode_printarg(f, n); break; @@ -1064,9 +1124,13 @@ pnode_print(struct format *f, struct pnode *n) case NODE_CONSTANT: macro_open(f, "Dv"); break; + case NODE_COPYRIGHT: + print_text(f, "Copyright", ARG_SPACE); + fputs(" \\(co", stdout); + break; case NODE_EDITOR: print_text(f, "editor:", ARG_SPACE); - macro_open(f, "An"); + pnode_printauthor(f, n); break; case NODE_EMAIL: if (was_impl) @@ -1079,7 +1143,9 @@ pnode_print(struct format *f, struct pnode *n) case NODE_EMPHASIS: case NODE_FIRSTTERM: case NODE_GLOSSTERM: - macro_open(f, "Em"); + if ((nc = TAILQ_FIRST(&n->childq)) != NULL && + pnode_class(nc->node) < CLASS_LINE) + macro_open(f, "Em"); break; case NODE_ENVAR: macro_open(f, "Ev"); @@ -1090,6 +1156,9 @@ pnode_print(struct format *f, struct pnode *n) case NODE_FILENAME: macro_open(f, "Pa"); break; + case NODE_FOOTNOTE: + macro_line(f, "Bo"); + break; case NODE_FUNCTION: macro_open(f, "Fn"); break; @@ -1099,6 +1168,9 @@ pnode_print(struct format *f, struct pnode *n) case NODE_FUNCSYNOPSISINFO: macro_open(f, "Fd"); break; + case NODE_IMAGEDATA: + pnode_printimagedata(f, n); + break; case NODE_INFORMALEQUATION: macro_line(f, "Bd -ragged -offset indent"); /* FALLTHROUGH */ @@ -1118,8 +1190,10 @@ pnode_print(struct format *f, struct pnode *n) pnode_printlink(f, n); break; case NODE_LITERAL: - if (was_impl) - macro_open(f, "So"); + if (n->parent != NULL && n->parent->node == NODE_QUOTE) + macro_open(f, "Li"); + else if (was_impl) + macro_open(f, "So Li"); else { macro_open(f, "Ql"); f->flags |= FMT_IMPL; @@ -1149,8 +1223,13 @@ 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: - macro_open(f, "Fl"); + if ((nc = TAILQ_FIRST(&n->childq)) != NULL && + pnode_class(nc->node) < CLASS_LINE) + macro_open(f, "Fl"); break; case NODE_ORDEREDLIST: pnode_printlist(f, n); @@ -1166,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"); @@ -1199,6 +1283,7 @@ pnode_print(struct format *f, struct pnode *n) break; case NODE_PREFACE: case NODE_SECTION: + case NODE_SIMPLESECT: case NODE_APPENDIX: case NODE_LEGALNOTICE: case NODE_NOTE: @@ -1213,6 +1298,19 @@ pnode_print(struct format *f, struct pnode *n) case NODE_SBR: macro_line(f, "br"); break; + case NODE_SUBSCRIPT: + if (f->linestate == LINE_MACRO) + macro_addarg(f, "_", 0); + else + print_text(f, "_", 0); + if ((nc = TAILQ_FIRST(&n->childq)) != NULL) + nc->spc = 0; + break; + case NODE_SUPERSCRIPT: + fputs("\\(ha", stdout); + if ((nc = TAILQ_FIRST(&n->childq)) != NULL) + nc->spc = 0; + break; case NODE_TEXT: case NODE_ESCAPE: pnode_printtext(f, n); @@ -1221,6 +1319,7 @@ pnode_print(struct format *f, struct pnode *n) pnode_printtgroup(f, n); break; case NODE_TITLE: + case NODE_SUBTITLE: pnode_printpara(f, n); macro_nodeline(f, "Sy", n, 0); pnode_unlinksub(n); @@ -1234,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; } @@ -1254,6 +1356,9 @@ pnode_print(struct format *f, struct pnode *n) case NODE_TEXT: /* Accept more arguments to the previous macro. */ return; + case NODE_FOOTNOTE: + macro_line(f, "Bc"); + break; case NODE_INFORMALEQUATION: macro_line(f, "EN"); macro_line(f, "Ed"); @@ -1262,7 +1367,9 @@ pnode_print(struct format *f, struct pnode *n) macro_line(f, "EN"); break; case NODE_LITERAL: - if (was_impl) { + if (n->parent != NULL && n->parent->node == NODE_QUOTE) + /* nothing */; + else if (was_impl) { f->flags &= ~FMT_NOSPC; macro_open(f, "Sc"); } else @@ -1295,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