=================================================================== RCS file: /cvs/mandoc/mdoc_html.c,v retrieving revision 1.92 retrieving revision 1.98 diff -u -p -r1.92 -r1.98 --- mandoc/mdoc_html.c 2010/07/02 12:54:33 1.92 +++ mandoc/mdoc_html.c 2010/07/19 11:11:54 1.98 @@ -1,6 +1,6 @@ -/* $Id: mdoc_html.c,v 1.92 2010/07/02 12:54:33 kristaps Exp $ */ +/* $Id: mdoc_html.c,v 1.98 2010/07/19 11:11:54 kristaps Exp $ */ /* - * Copyright (c) 2008, 2009 Kristaps Dzonsons + * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -30,7 +30,6 @@ #include "mandoc.h" #include "out.h" #include "html.h" -#include "regs.h" #include "mdoc.h" #include "main.h" @@ -73,6 +72,8 @@ static int mdoc_aq_pre(MDOC_ARGS); static int mdoc_ar_pre(MDOC_ARGS); static int mdoc_bd_pre(MDOC_ARGS); static int mdoc_bf_pre(MDOC_ARGS); +static void mdoc_bk_post(MDOC_ARGS); +static int mdoc_bk_pre(MDOC_ARGS); static void mdoc_bl_post(MDOC_ARGS); static int mdoc_bl_pre(MDOC_ARGS); static void mdoc_bq_post(MDOC_ARGS); @@ -208,7 +209,7 @@ static const struct htmlmdoc mdocs[MDOC_MAX] = { {mdoc_em_pre, NULL}, /* Em */ {NULL, NULL}, /* Eo */ {mdoc_xx_pre, NULL}, /* Fx */ - {mdoc_ms_pre, NULL}, /* Ms */ /* FIXME: convert to symbol? */ + {mdoc_ms_pre, NULL}, /* Ms */ {NULL, NULL}, /* No */ {mdoc_ns_pre, NULL}, /* Ns */ {mdoc_xx_pre, NULL}, /* Nx */ @@ -237,7 +238,7 @@ static const struct htmlmdoc mdocs[MDOC_MAX] = { {NULL, NULL}, /* Fc */ {mdoc_op_pre, mdoc_op_post}, /* Oo */ {NULL, NULL}, /* Oc */ - {NULL, NULL}, /* Bk */ + {mdoc_bk_pre, mdoc_bk_post}, /* Bk */ {NULL, NULL}, /* Ek */ {mdoc_bt_pre, NULL}, /* Bt */ {NULL, NULL}, /* Hf */ @@ -442,6 +443,18 @@ print_mdoc_node(MDOC_ARGS) break; } + if (HTML_KEEP & h->flags) { + if (n->prev && n->prev->line != n->line) { + h->flags &= ~HTML_KEEP; + h->flags |= HTML_PREKEEP; + } else if (NULL == n->prev) { + if (n->parent && n->parent->line != n->line) { + h->flags &= ~HTML_KEEP; + h->flags |= HTML_PREKEEP; + } + } + } + if (child && n->child) print_mdoc_nodelist(m, n->child, h); @@ -1074,7 +1087,7 @@ mdoc_it_head_pre(MDOC_ARGS, enum mdoc_list type, struc static int mdoc_it_pre(MDOC_ARGS) { - int i, wp, comp; + int i, comp; const struct mdoc_node *bl, *nn; struct roffsu width, offs; enum mdoc_list type; @@ -1116,16 +1129,6 @@ mdoc_it_pre(MDOC_ARGS) if (bl->data.Bl->width) a2width(bl->data.Bl->width, &width); - wp = -1; - for (i = 0; bl->args && i < (int)bl->args->argc; i++) - switch (bl->args->argv[i].arg) { - case (MDOC_Column): - wp = i; /* Save for later. */ - break; - default: - break; - } - /* Override width in some cases. */ switch (type) { @@ -1149,8 +1152,8 @@ mdoc_it_pre(MDOC_ARGS) for (i = 0; nn && nn != n; nn = nn->next) if (MDOC_BODY == nn->type) i++; - if (i < (int)bl->args->argv[wp].sz) - a2width(bl->args->argv[wp].value[i], &width); + if (i < (int)bl->data.Bl->ncols) + a2width(bl->data.Bl->cols[i], &width); } if (MDOC_HEAD == n->type) @@ -1734,6 +1737,11 @@ mdoc_sp_pre(MDOC_ARGS) len = 0; break; default: + assert(n->parent); + if ((NULL == n->next || NULL == n->prev) && + (MDOC_Ss == n->parent->tok || + MDOC_Sh == n->parent->tok)) + return(0); len = 1; break; } @@ -2236,4 +2244,36 @@ mdoc__x_post(MDOC_ARGS) h->flags |= HTML_NOSPACE; print_text(h, n->next ? "," : "."); +} + + +/* ARGSUSED */ +static int +mdoc_bk_pre(MDOC_ARGS) +{ + + switch (n->type) { + case (MDOC_BLOCK): + break; + case (MDOC_HEAD): + return(0); + case (MDOC_BODY): + h->flags |= HTML_PREKEEP; + break; + default: + abort(); + /* NOTREACHED */ + } + + return(1); +} + + +/* ARGSUSED */ +static void +mdoc_bk_post(MDOC_ARGS) +{ + + if (MDOC_BODY == n->type) + h->flags &= ~(HTML_KEEP | HTML_PREKEEP); }