=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.58 retrieving revision 1.61 diff -u -p -r1.58 -r1.61 --- docbook2mdoc/docbook2mdoc.c 2019/03/22 16:50:54 1.58 +++ docbook2mdoc/docbook2mdoc.c 2019/03/22 17:28:59 1.61 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.58 2019/03/22 16:50:54 schwarze Exp $ */ +/* $Id: docbook2mdoc.c,v 1.61 2019/03/22 17:28:59 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -77,6 +77,7 @@ struct pnode { static const char *attrkeys[ATTRKEY__MAX] = { "choice", + "class", "close", "id", "linkend", @@ -85,6 +86,7 @@ static const char *attrkeys[ATTRKEY__MAX] = { }; static const char *attrvals[ATTRVAL__MAX] = { + "monospaced", "norepeat", "opt", "plain", @@ -491,6 +493,37 @@ pnode_unlinksub(struct pnode *pn) } /* + * Retrieve an enumeration attribute from a node. + * Return ATTRVAL__MAX if the node has no such attribute. + */ +enum attrval +pnode_getattr(struct pnode *pn, enum attrkey key) +{ + struct pattr *ap; + + TAILQ_FOREACH(ap, &pn->attrq, child) + if (ap->key == key) + return ap->val; + return(ATTRVAL__MAX); +} + +/* + * Retrieve an attribute string from a node. + * Return defval if the node has no such attribute. + */ +const char * +pnode_getattr_raw(struct pnode *pn, enum attrkey key, const char *defval) +{ + struct pattr *ap; + + TAILQ_FOREACH(ap, &pn->attrq, child) + if (ap->key == key) + return ATTRVAL__MAX == ap->val ? ap->rawval : + attrvals[ap->val]; + return(defval); +} + +/* * Reset the lookaside buffer. */ static void @@ -687,15 +720,23 @@ pnode_printpara(struct parse *p, struct pnode *pn) struct pnode *pp; assert(p->newln); - if (NULL == pn->parent || NODE_LISTITEM == pn->parent->node) + if ((pp = TAILQ_PREV(pn, pnodeq, child)) == NULL && + (pp = pn->parent) == NULL) return; - pp = TAILQ_PREV(pn, pnodeq, child); - if (NULL == pp) - pp = pn->parent; - if ((NODE_SECTION != pp->node && NODE_PREFACE != pp->node) || - 2 < p->level) - puts(".Pp"); + switch (pp->node) { + case NODE_ENTRY: + case NODE_LISTITEM: + return; + case NODE_PREFACE: + case NODE_SECTION: + if (p->level < 3) + return; + break; + default: + break; + } + puts(".Pp"); } /* @@ -911,15 +952,8 @@ static void pnode_printmathfenced(struct parse *p, struct pnode *pn) { struct pnode *pp; - struct pattr *ap; - TAILQ_FOREACH(ap, &pn->attrq, child) - if (ATTRKEY_OPEN == ap->key) { - printf("left %s ", ap->rawval); - break; - } - if (NULL == ap) - printf("left ( "); + printf("left %s ", pnode_getattr_raw(pn, ATTRKEY_OPEN, "(")); pp = TAILQ_FIRST(&pn->childq); pnode_print(p, pp); @@ -929,13 +963,7 @@ pnode_printmathfenced(struct parse *p, struct pnode *p pnode_print(p, pp); } - TAILQ_FOREACH(ap, &pn->attrq, child) - if (ATTRKEY_CLOSE == ap->key) { - printf("right %s ", ap->rawval); - break; - } - if (NULL == ap) - printf("right ) "); + printf("right %s ", pnode_getattr_raw(pn, ATTRKEY_CLOSE, ")")); } /* @@ -1090,8 +1118,6 @@ 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); @@ -1100,16 +1126,9 @@ pnode_printprologue(struct parse *p, struct pnode *pn) if (NULL != pp) { pnode_printrefmeta(p, pp); pnode_unlink(pp); - } else { - name = "UNKNOWN"; - TAILQ_FOREACH(ap, &p->root->attrq, child) { - if (ATTRKEY_ID == ap->key) { - name = ap->rawval; - break; - } - } - printf(".Dt %s 1\n", name); - } + } else + printf(".Dt %s 1\n", + pnode_getattr_raw(p->root, ATTRKEY_ID, "UNKNOWN")); puts(".Os"); if (PARSE_EQN & p->flags) { @@ -1255,7 +1274,7 @@ static void pnode_print(struct parse *p, struct pnode *pn) { struct pnode *pp; - struct pattr *ap; + const char *ccp; char *cp; int last, sv; @@ -1364,19 +1383,21 @@ pnode_print(struct parse *p, struct pnode *pn) puts(".Sh LEGAL NOTICE"); break; case (NODE_LINK): - TAILQ_FOREACH(ap, &pn->attrq, child) - if (ATTRKEY_LINKEND == ap->key) - break; - if (ap == NULL) + ccp = pnode_getattr_raw(pn, ATTRKEY_LINKEND, NULL); + if (NULL == ccp) break; pnode_printmopen(p); - printf("Sx %s\n", ap->rawval); + printf("Sx %s\n", ccp); p->newln = 1; return; case (NODE_LITERAL): pnode_printmopen(p); fputs("Li", stdout); break; + case (NODE_LITERALLAYOUT): + assert(p->newln); + puts(".Bd -literal"); + break; case (NODE_MML_MFENCED): pnode_printmathfenced(p, pn); pnode_unlinksub(pn); @@ -1419,13 +1440,12 @@ pnode_print(struct parse *p, struct pnode *pn) pnode_printmopen(p); fputs("Qo", stdout); break; - case (NODE_LITERALLAYOUT): - /* FALLTHROUGH */ case (NODE_PROGRAMLISTING): - /* FALLTHROUGH */ case (NODE_SCREEN): assert(p->newln); - puts(".Bd -literal"); + printf(".Bd %s\n", ATTRVAL_MONOSPACED == + pnode_getattr(pn, ATTRKEY_CLASS) ? + "-literal" : "-unfilled"); break; case (NODE_REFENTRYINFO): /* Suppress. */