summaryrefslogtreecommitdiffstats
path: root/html.c
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
commit121fc3d4eff42f9400d7e165b83c068757148a7b (patch)
tree542cf79d7a2a3064093e486984d4bca92800daa0 /html.c
parent060aa662da1355a03d3193d7e0dcd9b0bbc33ccc (diff)
downloadmandoc-121fc3d4eff42f9400d7e165b83c068757148a7b.tar.gz
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.
Diffstat (limited to 'html.c')
-rw-r--r--html.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/html.c b/html.c
index 7cc081ab..199fd0c9 100644
--- a/html.c
+++ b/html.c
@@ -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)