diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2012-11-16 17:16:55 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2012-11-16 17:16:55 +0000 |
commit | f514b64edd2431e2accb9fd52736b10c0c718f6c (patch) | |
tree | 4711062fa350c143a9c9808451a6f77175a16536 /mdoc_term.c | |
parent | c070642807053876d10f7d2e6a1e090eee114928 (diff) | |
download | mandoc-f514b64edd2431e2accb9fd52736b10c0c718f6c.tar.gz |
Improve formatting of badly nested font blocks.
The basic idea is to already pop the font at the end marker
instead of allowing it to linger until the final end of the block.
This requires a few preliminaries:
* For each block, save a pointer to the previous font
to be used in case the block breaks another and gets extended.
* That requires making node information writable during rendering.
* Now fonts may get popped in the wrong order; hence, after the stack
has already been rewound further by some block that began earlier,
ignore popping a font that was put on the stack later.
* To be able to exploit all this for font blocks, tie processing
to their body, not their block, which is more logical anyway.
Triggered by florian@ reporting vaguely similar issues with list blocks.
Diffstat (limited to 'mdoc_term.c')
-rw-r--r-- | mdoc_term.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/mdoc_term.c b/mdoc_term.c index 4f5b0ae1..85e659db 100644 --- a/mdoc_term.c +++ b/mdoc_term.c @@ -42,7 +42,7 @@ struct termpair { #define DECL_ARGS struct termp *p, \ struct termpair *pair, \ const struct mdoc_meta *m, \ - const struct mdoc_node *n + struct mdoc_node *n struct termact { int (*pre)(DECL_ARGS); @@ -293,14 +293,13 @@ static void print_mdoc_node(DECL_ARGS) { int chld; - const void *font; struct termpair npair; size_t offset, rmargin; chld = 1; offset = p->offset; rmargin = p->rmargin; - font = term_fontq(p); + n->prev_font = term_fontq(p); memset(&npair, 0, sizeof(struct termpair)); npair.ppair = pair; @@ -366,7 +365,8 @@ print_mdoc_node(DECL_ARGS) if (chld && n->child) print_mdoc_nodelist(p, &npair, m, n->child); - term_fontpopq(p, font); + term_fontpopq(p, + (ENDBODY_NOT == n->end ? n : n->pending)->prev_font); switch (n->type) { case (MDOC_TEXT): @@ -1606,7 +1606,7 @@ static int termp_bd_pre(DECL_ARGS) { size_t tabwidth, rm, rmax; - const struct mdoc_node *nn; + struct mdoc_node *nn; if (MDOC_BLOCK == n->type) { print_bvspace(p, n, n); @@ -2075,7 +2075,7 @@ termp_bf_pre(DECL_ARGS) if (MDOC_HEAD == n->type) return(0); - else if (MDOC_BLOCK != n->type) + else if (MDOC_BODY != n->type) return(1); if (FONT_Em == n->norm->Bf.font) |