=================================================================== RCS file: /cvs/mandoc/html.c,v retrieving revision 1.129 retrieving revision 1.136 diff -u -p -r1.129 -r1.136 --- mandoc/html.c 2011/03/17 09:16:38 1.129 +++ mandoc/html.c 2011/04/30 22:14:42 1.136 @@ -1,4 +1,4 @@ -/* $Id: html.c,v 1.129 2011/03/17 09:16:38 kristaps Exp $ */ +/* $Id: html.c,v 1.136 2011/04/30 22:14:42 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2011 Ingo Schwarze @@ -32,7 +32,6 @@ #include "mandoc.h" #include "out.h" -#include "chars.h" #include "html.h" #include "main.h" @@ -95,14 +94,13 @@ static const char *const htmlattrs[ATTR_MAX] = { }; static void print_num(struct html *, const char *, size_t); -static void print_spec(struct html *, enum roffdeco, - const char *, size_t); +static void print_spec(struct html *, const char *, size_t); static void print_res(struct html *, const char *, size_t); static void print_ctag(struct html *, enum htmltag); static void print_doctype(struct html *); static void print_xmltype(struct html *); static int print_encode(struct html *, const char *, int); -static void print_metaf(struct html *, enum roffdeco); +static void print_metaf(struct html *, enum mandoc_esc); static void print_attr(struct html *, const char *, const char *); static void *ml_alloc(char *, enum htmltype); @@ -124,7 +122,7 @@ ml_alloc(char *outopts, enum htmltype type) h->type = type; h->tags.head = NULL; - h->symtab = chars_init(CHARS_HTML); + h->symtab = mchars_alloc(); while (outopts && *outopts) switch (getsubopt(&outopts, UNCONST(toks), &v)) { @@ -174,7 +172,7 @@ html_free(void *p) } if (h->symtab) - chars_free(h->symtab); + mchars_free(h->symtab); free(h); } @@ -216,28 +214,28 @@ print_num(struct html *h, const char *p, size_t len) { const char *rhs; - rhs = chars_num2char(p, len); + rhs = mchars_num2char(p, len); if (rhs) putchar((int)*rhs); } static void -print_spec(struct html *h, enum roffdeco d, const char *p, size_t len) +print_spec(struct html *h, const char *p, size_t len) { int cp; const char *rhs; size_t sz; - if ((cp = chars_spec2cp(h->symtab, p, len)) > 0) { + if ((cp = mchars_spec2cp(h->symtab, p, len)) > 0) { printf("&#%d;", cp); return; - } else if (-1 == cp && DECO_SSPECIAL == d) { + } else if (-1 == cp && 1 == len) { fwrite(p, 1, len, stdout); return; } else if (-1 == cp) return; - if (NULL != (rhs = chars_spec2str(h->symtab, p, len, &sz))) + if (NULL != (rhs = mchars_spec2str(h->symtab, p, len, &sz))) fwrite(rhs, 1, sz, stdout); } @@ -249,33 +247,33 @@ print_res(struct html *h, const char *p, size_t len) const char *rhs; size_t sz; - if ((cp = chars_res2cp(h->symtab, p, len)) > 0) { + if ((cp = mchars_res2cp(h->symtab, p, len)) > 0) { printf("&#%d;", cp); return; } else if (-1 == cp) return; - if (NULL != (rhs = chars_res2str(h->symtab, p, len, &sz))) + if (NULL != (rhs = mchars_res2str(h->symtab, p, len, &sz))) fwrite(rhs, 1, sz, stdout); } static void -print_metaf(struct html *h, enum roffdeco deco) +print_metaf(struct html *h, enum mandoc_esc deco) { enum htmlfont font; switch (deco) { - case (DECO_PREVIOUS): + case (ESCAPE_FONTPREV): font = h->metal; break; - case (DECO_ITALIC): + case (ESCAPE_FONTITALIC): font = HTMLFONT_ITALIC; break; - case (DECO_BOLD): + case (ESCAPE_FONTBOLD): font = HTMLFONT_BOLD; break; - case (DECO_ROMAN): + case (ESCAPE_FONTROMAN): font = HTMLFONT_NONE; break; default: @@ -304,73 +302,69 @@ print_encode(struct html *h, const char *p, int norecu size_t sz; int len, nospace; const char *seq; - enum roffdeco deco; + enum mandoc_esc esc; static const char rejs[6] = { '\\', '<', '>', '&', ASCII_HYPH, '\0' }; nospace = 0; - for (; *p; p++) { + while ('\0' != *p) { sz = strcspn(p, rejs); fwrite(p, 1, sz, stdout); - p += /* LINTED */ - sz; + p += (int)sz; - if ('<' == *p) { + if ('\0' == *p) + break; + + switch (*p++) { + case ('<'): printf("<"); continue; - } else if ('>' == *p) { + case ('>'): printf(">"); continue; - } else if ('&' == *p) { + case ('&'): printf("&"); continue; - } else if (ASCII_HYPH == *p) { - /* - * Note: "soft hyphens" aren't graphically - * displayed when not breaking the text; we want - * them to be displayed. - */ - /*printf("­");*/ + case (ASCII_HYPH): putchar('-'); continue; - } else if ('\0' == *p) + default: break; + } - seq = ++p; - len = a2roffdeco(&deco, &seq, &sz); + esc = mandoc_escape(&p, &seq, &len); + if (ESCAPE_ERROR == esc) + break; - switch (deco) { - case (DECO_NUMBERED): - print_num(h, seq, sz); + switch (esc) { + case (ESCAPE_NUMBERED): + print_num(h, seq, len); break; - case (DECO_RESERVED): - print_res(h, seq, sz); + case (ESCAPE_PREDEF): + print_res(h, seq, len); break; - case (DECO_SSPECIAL): - /* FALLTHROUGH */ - case (DECO_SPECIAL): - print_spec(h, deco, seq, sz); + case (ESCAPE_SPECIAL): + print_spec(h, seq, len); break; - case (DECO_PREVIOUS): + case (ESCAPE_FONTPREV): /* FALLTHROUGH */ - case (DECO_BOLD): + case (ESCAPE_FONTBOLD): /* FALLTHROUGH */ - case (DECO_ITALIC): + case (ESCAPE_FONTITALIC): /* FALLTHROUGH */ - case (DECO_ROMAN): + case (ESCAPE_FONTROMAN): if (norecurse) break; - print_metaf(h, deco); + print_metaf(h, esc); break; + case (ESCAPE_NOSPACE): + if ('\0' == *p) + nospace = 1; + break; default: break; } - - p += len - 1; - - if (DECO_NOSPACE == deco && '\0' == *(p + 1)) - nospace = 1; } return(nospace); @@ -433,7 +427,7 @@ print_otag(struct html *h, enum htmltag tag, print_attr(h, "lang", "en"); } - /* Accomodate for XML "well-formed" singleton escaping. */ + /* Accommodate for XML "well-formed" singleton escaping. */ if (HTML_AUTOCLOSE & htmltags[tag].flags) switch (h->type) { @@ -509,15 +503,10 @@ print_doctype(struct html *h) name, doctype, dtd); } - void print_text(struct html *h, const char *word) { - if (DELIM_CLOSE == mandoc_isdelim(word)) - if ( ! (HTML_IGNDELIM & h->flags)) - h->flags |= HTML_NOSPACE; - if ( ! (HTML_NOSPACE & h->flags)) { /* Manage keeps! */ if ( ! (HTML_KEEP & h->flags)) { @@ -545,9 +534,6 @@ print_text(struct html *h, const char *word) } h->flags &= ~HTML_IGNDELIM; - - if (DELIM_OPEN == mandoc_isdelim(word)) - h->flags |= HTML_NOSPACE; }