=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.110 retrieving revision 1.115 diff -u -p -r1.110 -r1.115 --- docbook2mdoc/docbook2mdoc.c 2019/04/12 11:19:31 1.110 +++ docbook2mdoc/docbook2mdoc.c 2019/04/12 21:37:07 1.115 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.110 2019/04/12 11:19:31 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.115 2019/04/12 21:37:07 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -70,12 +70,18 @@ pnode_printtext(struct format *f, struct pnode *n) */ if (f->linestate != LINE_MACRO && - (nn = TAILQ_NEXT(n, child)) != NULL && nn->spc == 0 && - (nn->node != NODE_TEXT && nn->node != NODE_ESCAPE)) { - macro_open(f, "Pf"); - accept_arg = 1; - f->flags |= FMT_CHILD; - nn->spc = 1; + (nn = TAILQ_NEXT(n, child)) != NULL && nn->spc == 0) { + switch (pnode_class(nn->node)) { + case CLASS_LINE: + case CLASS_ENCL: + macro_open(f, "Pf"); + accept_arg = 1; + f->flags |= FMT_CHILD; + nn->spc = 1; + break; + default: + break; + } } switch (f->linestate) { @@ -192,7 +198,7 @@ pnode_printrefsynopsisdiv(struct format *f, struct pno static void pnode_printrefsect(struct format *f, struct pnode *n) { - struct pnode *nc; + struct pnode *nc, *ncc; const char *title; int flags, level; @@ -264,12 +270,24 @@ pnode_printrefsect(struct format *f, struct pnode *n) break; } - if (nc != NULL) { + if (nc != NULL) macro_addnode(f, nc, flags); - pnode_unlink(nc); - } else + else macro_addarg(f, title, flags | ARG_QUOTED); macro_close(f); + + /* + * DocBook has no equivalent for -split mode, + * so just switch the default in the AUTHORS section. + */ + + if (nc != NULL) { + ncc = TAILQ_FIRST(&nc->childq); + if (ncc != NULL && ncc->node == NODE_TEXT && + strcasecmp(ncc->b, "AUTHORS") == 0) + macro_line(f, "An -nosplit"); + pnode_unlink(nc); + } } /* @@ -575,7 +593,8 @@ pnode_printauthor(struct format *f, struct pnode *n) if ((nc = pnode_findfirst(n, NODE_EMAIL)) != NULL) { f->flags |= FMT_CHILD; - pnode_print(f, nc); + macro_open(f, "Aq Mt"); + macro_addnode(f, nc, ARG_SPACE); pnode_unlink(nc); } @@ -657,12 +676,6 @@ pnode_printprologue(struct format *f, struct ptree *tr } else pnode_printrefmeta(f, refmeta); macro_line(f, "Os"); - - if (tree->flags & TREE_EQN) { - macro_line(f, "EQ"); - print_text(f, "delim $$", 0); - macro_line(f, "EN"); - } } /* @@ -836,12 +849,12 @@ static void pnode_print(struct format *f, struct pnode *n) { struct pnode *nc, *nn; - enum linestate sv; + int was_impl; if (n == NULL) return; - sv = f->linestate; + was_impl = f->flags & FMT_IMPL; if (n->spc) f->flags &= ~FMT_NOSPC; else @@ -880,11 +893,15 @@ pnode_print(struct format *f, struct pnode *n) break; case NODE_EDITOR: print_text(f, "editor:", ARG_SPACE); - sv = LINE_TEXT; macro_open(f, "An"); break; case NODE_EMAIL: - macro_open(f, "Aq Mt"); + if (was_impl) + macro_open(f, "Ao Mt"); + else { + macro_open(f, "Aq Mt"); + f->flags |= FMT_IMPL; + } break; case NODE_EMPHASIS: case NODE_FIRSTTERM: @@ -910,13 +927,11 @@ pnode_print(struct format *f, struct pnode *n) macro_open(f, "Fd"); break; case NODE_INFORMALEQUATION: + macro_line(f, "Bd -ragged -offset indent"); + /* FALLTHROUGH */ + case NODE_INLINEEQUATION: macro_line(f, "EQ"); break; - case NODE_INLINEEQUATION: - if (f->linestate == LINE_NEW) - f->linestate = LINE_TEXT; - putchar('$'); - break; case NODE_ITEMIZEDLIST: pnode_printlist(f, n); break; @@ -930,7 +945,12 @@ pnode_print(struct format *f, struct pnode *n) pnode_printlink(f, n); break; case NODE_LITERAL: - macro_open(f, "Ql"); + if (was_impl) + macro_open(f, "So"); + else { + macro_open(f, "Ql"); + f->flags |= FMT_IMPL; + } break; case NODE_LITERALLAYOUT: macro_close(f); @@ -973,7 +993,12 @@ pnode_print(struct format *f, struct pnode *n) pnode_unlinksub(n); break; case NODE_QUOTE: - macro_open(f, "Qo"); + if (was_impl) + macro_open(f, "Do"); + else { + macro_open(f, "Dq"); + f->flags |= FMT_IMPL; + } break; case NODE_PROGRAMLISTING: case NODE_SCREEN: @@ -1047,6 +1072,13 @@ pnode_print(struct format *f, struct pnode *n) pnode_print(f, nc); switch (n->node) { + case NODE_EMAIL: + if (was_impl) { + f->flags &= ~FMT_NOSPC; + macro_open(f, "Ac"); + } else + f->flags &= ~FMT_IMPL; + break; case NODE_ESCAPE: case NODE_TERM: case NODE_TEXT: @@ -1054,11 +1086,18 @@ pnode_print(struct format *f, struct pnode *n) return; case NODE_INFORMALEQUATION: macro_line(f, "EN"); + macro_line(f, "Ed"); break; case NODE_INLINEEQUATION: - fputs("$ ", stdout); - f->linestate = sv; + macro_line(f, "EN"); break; + case NODE_LITERAL: + if (was_impl) { + f->flags &= ~FMT_NOSPC; + macro_open(f, "Sc"); + } else + f->flags &= ~FMT_IMPL; + break; case NODE_MEMBER: if ((nn = TAILQ_NEXT(n, child)) != NULL && nn->node != NODE_MEMBER) @@ -1086,12 +1125,11 @@ pnode_print(struct format *f, struct pnode *n) fputs(" } ", stdout); break; case NODE_QUOTE: - if (sv == LINE_NEW) - macro_close(f); - sv = f->linestate; - macro_open(f, "Qc"); - if (sv == LINE_NEW) - macro_close(f); + if (was_impl) { + f->flags &= ~FMT_NOSPC; + macro_open(f, "Dc"); + } else + f->flags &= ~FMT_IMPL; break; case NODE_PREFACE: case NODE_SECTION: @@ -1122,7 +1160,7 @@ pnode_print(struct format *f, struct pnode *n) } void -ptree_print(struct ptree *tree) +ptree_print_mdoc(struct ptree *tree) { struct format formatter;