version 1.41, 2014/10/12 15:34:44 |
version 1.43, 2014/10/19 19:11:29 |
|
|
enum nodeid node; /* current (NODE_ROOT if pre-tree) */ |
enum nodeid node; /* current (NODE_ROOT if pre-tree) */ |
const char *fname; /* filename */ |
const char *fname; /* filename */ |
int stop; /* should we stop now? */ |
int stop; /* should we stop now? */ |
|
#define PARSE_EQN 1 |
|
unsigned int flags; /* document-wide flags */ |
struct pnode *root; /* root of parse tree */ |
struct pnode *root; /* root of parse tree */ |
struct pnode *cur; /* current node in tree */ |
struct pnode *cur; /* current node in tree */ |
char *b; /* nil-terminated buffer for pre-print */ |
char *b; /* nil-terminated buffer for pre-print */ |
Line 305 xml_elem_start(void *arg, const XML_Char *name, const |
|
Line 307 xml_elem_start(void *arg, const XML_Char *name, const |
|
ps->node = ps->cur->node; |
ps->node = ps->cur->node; |
} |
} |
|
|
|
|
for (node = 0; node < NODE__MAX; node++) |
for (node = 0; node < NODE__MAX; node++) |
if (NULL == nodes[node].name) |
if (NULL == nodes[node].name) |
continue; |
continue; |
Line 341 xml_elem_start(void *arg, const XML_Char *name, const |
|
Line 342 xml_elem_start(void *arg, const XML_Char *name, const |
|
return; |
return; |
} |
} |
|
|
|
if (NODE_INLINEEQUATION == node) |
|
ps->flags |= PARSE_EQN; |
|
|
if (NULL == (dat = calloc(1, sizeof(struct pnode)))) { |
if (NULL == (dat = calloc(1, sizeof(struct pnode)))) { |
perror(NULL); |
perror(NULL); |
exit(EXIT_FAILURE); |
exit(EXIT_FAILURE); |
Line 917 pnode_printmath(struct parse *p, struct pnode *pn) |
|
Line 921 pnode_printmath(struct parse *p, struct pnode *pn) |
|
|
|
switch (pn->node) { |
switch (pn->node) { |
case (NODE_MML_MSUP): |
case (NODE_MML_MSUP): |
printf(" sup "); |
fputs(" sup ", stdout); |
break; |
break; |
case (NODE_MML_MFRAC): |
case (NODE_MML_MFRAC): |
printf(" over "); |
fputs(" over ", stdout); |
break; |
break; |
case (NODE_MML_MSUB): |
case (NODE_MML_MSUB): |
printf(" sub "); |
fputs(" sub ", stdout); |
break; |
break; |
default: |
default: |
break; |
break; |
Line 1066 pnode_printprologue(struct parse *p, struct pnode *pn) |
|
Line 1070 pnode_printprologue(struct parse *p, struct pnode *pn) |
|
puts(".Dt UNKNOWN 1"); |
puts(".Dt UNKNOWN 1"); |
puts(".Os"); |
puts(".Os"); |
} |
} |
|
|
|
if (PARSE_EQN & p->flags) { |
|
puts(".EQ"); |
|
puts("delim $$"); |
|
puts(".EN"); |
|
} |
} |
} |
|
|
|
/* |
|
* We can have multiple <term> elements within a <varlistentry>, which |
|
* we should comma-separate as list headers. |
|
*/ |
static void |
static void |
pnode_printvarlistentry(struct parse *p, struct pnode *pn) |
pnode_printvarlistentry(struct parse *p, struct pnode *pn) |
{ |
{ |
struct pnode *pp; |
struct pnode *pp; |
|
int first = 1; |
|
|
assert(p->newln); |
assert(p->newln); |
|
fputs(".It", stdout); |
|
p->newln = 0; |
|
|
TAILQ_FOREACH(pp, &pn->childq, child) |
TAILQ_FOREACH(pp, &pn->childq, child) |
if (NODE_TERM == pp->node) { |
if (NODE_TERM == pp->node) { |
assert(p->newln); |
if ( ! first) |
fputs(".It", stdout); |
putchar(','); |
p->newln = 0; |
|
pnode_print(p, pp); |
pnode_print(p, pp); |
pnode_unlink(pp); |
pnode_unlink(pp); |
pnode_printmclose(p, 1); |
first = 0; |
return; |
} else |
} |
break; |
|
|
puts(".It"); |
putchar('\n'); |
p->newln = 1; |
p->newln = 1; |
} |
} |
|
|
Line 1260 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 1277 pnode_print(struct parse *p, struct pnode *pn) |
|
pnode_printmopen(p); |
pnode_printmopen(p); |
fputs("Fd", stdout); |
fputs("Fd", stdout); |
break; |
break; |
|
case (NODE_INFORMALEQUATION): |
|
if ( ! p->newln) |
|
putchar('\n'); |
|
puts(".EQ"); |
|
p->newln = 0; |
|
break; |
|
case (NODE_INLINEEQUATION): |
|
fputc('$', stdout); |
|
p->newln = 0; |
|
break; |
case (NODE_ITEMIZEDLIST): |
case (NODE_ITEMIZEDLIST): |
assert(p->newln); |
assert(p->newln); |
pnode_printlist(p, pn); |
pnode_printlist(p, pn); |
Line 1273 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 1300 pnode_print(struct parse *p, struct pnode *pn) |
|
pnode_printmopen(p); |
pnode_printmopen(p); |
fputs("Li", stdout); |
fputs("Li", stdout); |
break; |
break; |
case (NODE_MML_MATH): |
|
if ( ! p->newln) |
|
putchar('\n'); |
|
puts(".EQ"); |
|
p->newln = 0; |
|
break; |
|
case (NODE_MML_MFENCED): |
case (NODE_MML_MFENCED): |
pnode_printmathfenced(p, pn); |
pnode_printmathfenced(p, pn); |
pnode_unlinksub(pn); |
pnode_unlinksub(pn); |
Line 1287 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 1308 pnode_print(struct parse *p, struct pnode *pn) |
|
case (NODE_MML_MI): |
case (NODE_MML_MI): |
case (NODE_MML_MN): |
case (NODE_MML_MN): |
case (NODE_MML_MO): |
case (NODE_MML_MO): |
putchar('{'); |
if (TAILQ_EMPTY(&pn->childq)) |
|
break; |
|
fputs(" { ", stdout); |
break; |
break; |
case (NODE_MML_MFRAC): |
case (NODE_MML_MFRAC): |
case (NODE_MML_MSUB): |
case (NODE_MML_MSUB): |
Line 1475 pnode_print(struct parse *p, struct pnode *pn) |
|
Line 1498 pnode_print(struct parse *p, struct pnode *pn) |
|
pnode_print(p, pp); |
pnode_print(p, pp); |
|
|
switch (pn->node) { |
switch (pn->node) { |
case (NODE_MML_MATH): |
case (NODE_INFORMALEQUATION): |
if ( ! p->newln) |
if ( ! p->newln) |
putchar('\n'); |
putchar('\n'); |
puts(".EN"); |
puts(".EN"); |
p->newln = 1; |
p->newln = 1; |
break; |
break; |
|
case (NODE_INLINEEQUATION): |
|
fputs("$ ", stdout); |
|
p->newln = sv; |
|
break; |
case (NODE_MML_MROW): |
case (NODE_MML_MROW): |
case (NODE_MML_MI): |
case (NODE_MML_MI): |
case (NODE_MML_MN): |
case (NODE_MML_MN): |
case (NODE_MML_MO): |
case (NODE_MML_MO): |
putchar('}'); |
if (TAILQ_EMPTY(&pn->childq)) |
|
break; |
|
fputs(" } ", stdout); |
break; |
break; |
case (NODE_APPLICATION): |
case (NODE_APPLICATION): |
case (NODE_ARG): |
case (NODE_ARG): |