=================================================================== RCS file: /cvs/docbook2mdoc/docbook2mdoc.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -p -r1.40 -r1.41 --- docbook2mdoc/docbook2mdoc.c 2014/10/12 15:08:45 1.40 +++ docbook2mdoc/docbook2mdoc.c 2014/10/12 15:34:44 1.41 @@ -1,4 +1,4 @@ -/* $Id: docbook2mdoc.c,v 1.40 2014/10/12 15:08:45 kristaps Exp $ */ +/* $Id: docbook2mdoc.c,v 1.41 2014/10/12 15:34:44 kristaps Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * @@ -74,7 +74,9 @@ struct pnode { static const char *attrkeys[ATTRKEY__MAX] = { "choice", + "close", "id", + "open", "rep" }; @@ -863,6 +865,43 @@ pnode_printparamdef(struct parse *p, struct pnode *pn) } /* + * The node is a little peculiar. + * First, it can have arbitrary open and closing tokens, which default + * to parentheses. + * Second, >1 arguments are separated by commas. + */ +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 ( "); + + pp = TAILQ_FIRST(&pn->childq); + pnode_print(p, pp); + + while (NULL != (pp = TAILQ_NEXT(pp, child))) { + putchar(','); + 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 ) "); +} + +/* * These math nodes require special handling because they have infix * syntax, instead of the usual prefix or prefix. * So we need to break up the first and second child node with a @@ -1241,7 +1280,8 @@ pnode_print(struct parse *p, struct pnode *pn) p->newln = 0; break; case (NODE_MML_MFENCED): - printf("left {"); + pnode_printmathfenced(p, pn); + pnode_unlinksub(pn); break; case (NODE_MML_MROW): case (NODE_MML_MI): @@ -1440,9 +1480,6 @@ pnode_print(struct parse *p, struct pnode *pn) putchar('\n'); puts(".EN"); p->newln = 1; - break; - case (NODE_MML_MFENCED): - printf("right }"); break; case (NODE_MML_MROW): case (NODE_MML_MI):