=================================================================== RCS file: /cvs/mandoc/html.c,v retrieving revision 1.135 retrieving revision 1.140 diff -u -p -r1.135 -r1.140 --- mandoc/html.c 2011/04/30 22:14:02 1.135 +++ mandoc/html.c 2011/05/17 10:48:06 1.140 @@ -1,4 +1,4 @@ -/* $Id: html.c,v 1.135 2011/04/30 22:14:02 kristaps Exp $ */ +/* $Id: html.c,v 1.140 2011/05/17 10:48:06 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2011 Ingo Schwarze @@ -31,6 +31,7 @@ #include #include "mandoc.h" +#include "libmandoc.h" #include "out.h" #include "html.h" #include "main.h" @@ -93,6 +94,19 @@ static const char *const htmlattrs[ATTR_MAX] = { "colspan", /* ATTR_COLSPAN */ }; +static const char *const roffscales[SCALE_MAX] = { + "cm", /* SCALE_CM */ + "in", /* SCALE_IN */ + "pc", /* SCALE_PC */ + "pt", /* SCALE_PT */ + "em", /* SCALE_EM */ + "em", /* SCALE_MM */ + "ex", /* SCALE_EN */ + "ex", /* SCALE_BU */ + "em", /* SCALE_VS */ + "ex", /* SCALE_FS */ +}; + static void print_num(struct html *, const char *, size_t); static void print_spec(struct html *, const char *, size_t); static void print_res(struct html *, const char *, size_t); @@ -122,7 +136,7 @@ ml_alloc(char *outopts, enum htmltype type) h->type = type; h->tags.head = NULL; - h->symtab = mchars_init(); + h->symtab = mchars_alloc(); while (outopts && *outopts) switch (getsubopt(&outopts, UNCONST(toks), &v)) { @@ -212,11 +226,10 @@ print_gen_head(struct html *h) static void print_num(struct html *h, const char *p, size_t len) { - const char *rhs; + char c; - rhs = mchars_num2char(p, len); - if (rhs) - putchar((int)*rhs); + if ('\0' != (c = mchars_num2char(p, len))) + putchar((int)c); } static void @@ -295,7 +308,43 @@ print_metaf(struct html *h, enum mandoc_esc deco) print_otag(h, TAG_I, 0, NULL); } +int +html_strlen(const char *cp) +{ + int ssz, sz; + const char *seq, *p; + /* + * Account for escaped sequences within string length + * calculations. This follows the logic in term_strlen() as we + * must calculate the width of produced strings. + * Assume that characters are always width of "1". This is + * hacky, but it gets the job done for approximation of widths. + */ + + sz = 0; + while (NULL != (p = strchr(cp, '\\'))) { + sz += (int)(p - cp); + ++cp; + switch (mandoc_escape(&cp, &seq, &ssz)) { + case (ESCAPE_ERROR): + return(sz); + case (ESCAPE_NUMBERED): + /* FALLTHROUGH */ + case (ESCAPE_PREDEF): + /* FALLTHROUGH */ + case (ESCAPE_SPECIAL): + sz++; + break; + default: + break; + } + } + + assert(sz >= 0); + return(sz + strlen(cp)); +} + static int print_encode(struct html *h, const char *p, int norecurse) { @@ -693,50 +742,12 @@ void bufcat_su(struct html *h, const char *p, const struct roffsu *su) { double v; - const char *u; v = su->scale; + if (SCALE_MM == su->unit && 0.0 == (v /= 100.0)) + v = 1.0; - switch (su->unit) { - case (SCALE_CM): - u = "cm"; - break; - case (SCALE_IN): - u = "in"; - break; - case (SCALE_PC): - u = "pc"; - break; - case (SCALE_PT): - u = "pt"; - break; - case (SCALE_EM): - u = "em"; - break; - case (SCALE_MM): - if (0 == (v /= 100)) - v = 1; - u = "em"; - break; - case (SCALE_EN): - u = "ex"; - break; - case (SCALE_BU): - u = "ex"; - break; - case (SCALE_VS): - u = "em"; - break; - default: - u = "ex"; - break; - } - - /* - * XXX: the CSS spec isn't clear as to which types accept - * integer or real numbers, so we just make them all decimals. - */ - buffmt(h, "%s: %.2f%s;", p, v, u); + buffmt(h, "%s: %.2f%s;", p, v, roffscales[su->unit]); }