=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.50 retrieving revision 1.53 diff -u -p -r1.50 -r1.53 --- docbook2mdoc/docbook2mdoc.c 2019/03/22 16:10:09 1.50 +++ docbook2mdoc/docbook2mdoc.c 2019/03/22 16:25:42 1.53 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.50 2019/03/22 16:10:09 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.53 2019/03/22 16:25:42 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -45,6 +45,7 @@ struct parse { char *b; /* NUL-terminated buffer for pre-print */ size_t bsz; /* current length of b */ size_t mbsz; /* max bsz allocation */ + int level; /* header level, starting at 1 */ int newln; /* output: are we on a fresh line */ }; @@ -711,59 +712,71 @@ static void pnode_printrefsect(struct parse *p, struct pnode *pn) { struct pnode *pp; + const char *title; + int flags, level; + level = ++p->level; + flags = 1 == level ? MACROLINE_UPPER : 0; + if (3 > level) { + switch (pn->node) { + case (NODE_CAUTION): + case (NODE_NOTE): + case (NODE_TIP): + case (NODE_WARNING): + level = 3; + break; + default: + break; + } + } + TAILQ_FOREACH(pp, &pn->childq, child) if (NODE_TITLE == pp->node) break; - switch (pn->node) { - case (NODE_REFSECT1): - /* FALLTHROUGH */ - case (NODE_SECT1): - /* FALLTHROUGH */ - case (NODE_CHAPTER): + if (NULL == pp) { + switch (pn->node) { + case (NODE_PREFACE): + title = "Preface"; + break; + case (NODE_CAUTION): + title = "Caution"; + break; + case (NODE_NOTE): + title = "Note"; + break; + case (NODE_TIP): + title = "Tip"; + break; + case (NODE_WARNING): + title = "Warning"; + break; + default: + title = "Unknown"; + break; + } + } + + switch (level) { + case (1): fputs(".Sh", stdout); break; - case (NODE_REFSECT2): - /* FALLTHROUGH */ - case (NODE_SECT2): + case (2): fputs(".Ss", stdout); break; - case (NODE_REFSECT3): + default: puts(".Pp"); fputs(".Sy", stdout); break; - case (NODE_NOTE): - /* FALLTHROUGH */ - case (NODE_REFSECTION): - /* FALLTHROUGH */ - case (NODE_TIP): - /* FALLTHROUGH */ - case (NODE_CAUTION): - /* FALLTHROUGH */ - case (NODE_WARNING): - puts(".Pp"); - if (NULL == pp) - return; - fputs(".Em", stdout); - break; - default: - break; } - p->newln = 0; - if (NULL != pp) { - pnode_printmacrolinetext(p, pp, - NODE_REFSECT1 == pn->node || NODE_SECT1 == pn->node ? - MACROLINE_UPPER : 0); + p->newln = 0; + pnode_printmacrolinetext(p, pp, flags); pnode_printmclose(p, 1); pnode_unlink(pp); - } else { - puts(NODE_REFSECT1 == pn->node || NODE_SECT1 == pn->node ? - "UNKNOWN" : "unknown"); - p->newln = 1; - } + } else + printf(" %s\n", title); } /* @@ -806,7 +819,6 @@ pnode_printrefmeta(struct parse *p, struct pnode *pn) else if (NODE_REFENTRYTITLE == pp->node) title = pp; - puts(".Dd $Mdocdate" "$"); fputs(".Dt", stdout); p->newln = 0; @@ -820,8 +832,6 @@ pnode_printrefmeta(struct parse *p, struct pnode *pn) p->newln = 1; } else pnode_printmacroline(p, manvol); - - puts(".Os"); } static void @@ -1069,19 +1079,27 @@ static void pnode_printprologue(struct parse *p, struct pnode *pn) { struct pnode *pp; + struct pattr *ap; + const char *name; pp = NULL == p->root ? NULL : pnode_findfirst(p->root, NODE_REFMETA); + puts(".Dd $Mdocdate" "$"); if (NULL != pp) { pnode_printrefmeta(p, pp); pnode_unlink(pp); } else { - puts(".\\\" Supplying bogus prologue..."); - puts(".Dd $Mdocdate" "$"); - puts(".Dt UNKNOWN 1"); - puts(".Os"); + name = "UNKNOWN"; + TAILQ_FOREACH(ap, &p->root->attrq, child) { + if (ATTRKEY_ID == ap->key) { + name = ap->rawval; + break; + } + } + printf(".Dt %s 1\n", name); } + puts(".Os"); if (PARSE_EQN & p->flags) { puts(".EQ"); @@ -1176,7 +1194,7 @@ pnode_printlist(struct parse *p, struct pnode *pn) if (NODE_ORDEREDLIST == pn->node) puts(".Bl -enum"); else - puts(".Bl -item"); + puts(".Bl -bullet"); TAILQ_FOREACH(pp, &pn->childq, child) { assert(p->newln); @@ -1417,26 +1435,18 @@ pnode_print(struct parse *p, struct pnode *pn) pnode_printrefsynopsisdiv(p, pn); puts(".Sh SYNOPSIS"); break; + case (NODE_PREFACE): case (NODE_REFSECT1): - /* FALLTHROUGH */ case (NODE_REFSECT2): - /* FALLTHROUGH */ case (NODE_REFSECT3): - /* FALLTHROUGH */ case (NODE_REFSECTION): - /* FALLTHROUGH */ case (NODE_CHAPTER): - /* FALLTHROUGH */ case (NODE_SECT1): - /* FALLTHROUGH */ case (NODE_SECT2): - /* FALLTHROUGH */ + case (NODE_SECTION): case (NODE_NOTE): - /* FALLTHROUGH */ case (NODE_TIP): - /* FALLTHROUGH */ case (NODE_CAUTION): - /* FALLTHROUGH */ case (NODE_WARNING): assert(p->newln); pnode_printrefsect(p, pn); @@ -1609,6 +1619,21 @@ pnode_print(struct parse *p, struct pnode *pn) NODE_REFNAME == TAILQ_NEXT(pn, child)->node) fputs(" ,", stdout); pnode_printmclose(p, sv); + break; + case (NODE_PREFACE): + case (NODE_REFSECT1): + case (NODE_REFSECT2): + case (NODE_REFSECT3): + case (NODE_REFSECTION): + case (NODE_CHAPTER): + case (NODE_SECT1): + case (NODE_SECT2): + case (NODE_SECTION): + case (NODE_NOTE): + case (NODE_TIP): + case (NODE_CAUTION): + case (NODE_WARNING): + p->level--; break; case (NODE_LITERALLAYOUT): /* FALLTHROUGH */