diff options
-rw-r--r-- | html.c | 38 | ||||
-rw-r--r-- | html.h | 3 | ||||
-rw-r--r-- | mdoc_html.c | 12 |
3 files changed, 45 insertions, 8 deletions
@@ -1,4 +1,4 @@ -/* $Id: html.c,v 1.137 2011/04/30 22:24:31 kristaps Exp $ */ +/* $Id: html.c,v 1.138 2011/05/14 16:28:23 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org> @@ -31,6 +31,7 @@ #include <unistd.h> #include "mandoc.h" +#include "libmandoc.h" #include "out.h" #include "html.h" #include "main.h" @@ -294,6 +295,41 @@ 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_PREDEF): + sz++; + break; + 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) @@ -1,4 +1,4 @@ -/* $Id: html.h,v 1.41 2011/04/29 22:18:12 kristaps Exp $ */ +/* $Id: html.h,v 1.42 2011/05/14 16:28:23 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv> * @@ -155,6 +155,7 @@ void bufncat(struct html *, const char *, size_t); void bufinit(struct html *); void html_idcat(char *, const char *, int); +int html_strlen(const char *); __END_DECLS diff --git a/mdoc_html.c b/mdoc_html.c index 652e8536..73cf1182 100644 --- a/mdoc_html.c +++ b/mdoc_html.c @@ -1,4 +1,4 @@ -/* $Id: mdoc_html.c,v 1.165 2011/04/23 09:10:50 kristaps Exp $ */ +/* $Id: mdoc_html.c,v 1.166 2011/05/14 16:28:23 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * @@ -288,7 +288,7 @@ a2width(const char *p, struct roffsu *su) if ( ! a2roffsu(p, su, SCALE_MAX)) { su->unit = SCALE_BU; - su->scale = (int)strlen(p); + su->scale = html_strlen(p); } } @@ -355,7 +355,7 @@ a2offs(const char *p, struct roffsu *su) SCALE_HS_INIT(su, INDENT * 2); else if ( ! a2roffsu(p, su, SCALE_MAX)) { su->unit = SCALE_BU; - su->scale = (int)strlen(p); + su->scale = html_strlen(p); } } @@ -703,7 +703,7 @@ mdoc_nm_pre(MDOC_ARGS) { struct htmlpair tag; struct roffsu su; - size_t len; + int len; switch (n->type) { case (MDOC_ELEM): @@ -731,10 +731,10 @@ mdoc_nm_pre(MDOC_ARGS) for (len = 0, n = n->child; n; n = n->next) if (MDOC_TEXT == n->type) - len += strlen(n->string); + len += html_strlen(n->string); if (0 == len && m->name) - len = strlen(m->name); + len = html_strlen(m->name); SCALE_HS_INIT(&su, (double)len); bufcat_su(h, "width", &su); |