aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-05-14 16:28:23 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-05-14 16:28:23 +0000
commite3ef897e17cf74a686ec213e362a869d4a9b77f0 (patch)
tree7e083906c57c2483457de701867f60b8ecbbcfa5
parentbc80934db614d28c7b53a0b013dd68c4e6234c7e (diff)
downloadmandoc-e3ef897e17cf74a686ec213e362a869d4a9b77f0.tar.gz
mandoc-e3ef897e17cf74a686ec213e362a869d4a9b77f0.tar.zst
mandoc-e3ef897e17cf74a686ec213e362a869d4a9b77f0.zip
Give -Thtml and -Txhtml the gift of recognising escapes when calculating
widths (e.g., `Bl -tag -width "\s[blahblah]bar"). This has long since been done for -Tascii but escaped noticed with -T[x]html.
-rw-r--r--html.c38
-rw-r--r--html.h3
-rw-r--r--mdoc_html.c12
3 files changed, 45 insertions, 8 deletions
diff --git a/html.c b/html.c
index b1ba0dd2..8fb81c51 100644
--- a/html.c
+++ b/html.c
@@ -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)
diff --git a/html.h b/html.h
index 89dd7c63..35fb6c67 100644
--- a/html.h
+++ b/html.h
@@ -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);