Print this page
5051 import mdocml-1.12.3
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Approved by: TBD

*** 1,9 **** ! /* $Id: html.c,v 1.150 2011/10/05 21:35:17 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> ! * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * --- 1,9 ---- ! /* $Id: html.c,v 1.152 2013/08/08 20:07:47 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> ! * Copyright (c) 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. *
*** 233,242 **** --- 233,245 ---- font = HTMLFONT_ITALIC; break; case (ESCAPE_FONTBOLD): font = HTMLFONT_BOLD; break; + case (ESCAPE_FONTBI): + font = HTMLFONT_BI; + break; case (ESCAPE_FONT): /* FALLTHROUGH */ case (ESCAPE_FONTROMAN): font = HTMLFONT_NONE; break;
*** 251,271 **** } h->metal = h->metac; h->metac = font; ! if (HTMLFONT_NONE != font) ! h->metaf = HTMLFONT_BOLD == font ? ! print_otag(h, TAG_B, 0, NULL) : 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. --- 254,284 ---- } h->metal = h->metac; h->metac = font; ! switch (font) { ! case (HTMLFONT_ITALIC): ! h->metaf = print_otag(h, TAG_I, 0, NULL); ! break; ! case (HTMLFONT_BOLD): ! h->metaf = print_otag(h, TAG_B, 0, NULL); ! break; ! case (HTMLFONT_BI): ! h->metaf = print_otag(h, TAG_B, 0, NULL); print_otag(h, TAG_I, 0, NULL); + break; + default: + break; + } } int html_strlen(const char *cp) { ! size_t rsz; ! int skip, sz; /* * Account for escaped sequences within string length * calculations. This follows the logic in term_strlen() as we * must calculate the width of produced strings.
*** 272,301 **** * 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_UNICODE): /* FALLTHROUGH */ case (ESCAPE_NUMBERED): /* 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) { --- 285,329 ---- * Assume that characters are always width of "1". This is * hacky, but it gets the job done for approximation of widths. */ sz = 0; ! skip = 0; ! while (1) { ! rsz = strcspn(cp, "\\"); ! if (rsz) { ! cp += rsz; ! if (skip) { ! skip = 0; ! rsz--; ! } ! sz += rsz; ! } ! if ('\0' == *cp) ! break; ! cp++; ! switch (mandoc_escape(&cp, NULL, NULL)) { case (ESCAPE_ERROR): return(sz); case (ESCAPE_UNICODE): /* FALLTHROUGH */ case (ESCAPE_NUMBERED): /* FALLTHROUGH */ case (ESCAPE_SPECIAL): + if (skip) + skip = 0; + else sz++; break; + case (ESCAPE_SKIPCHAR): + skip = 1; + break; default: break; } } ! return(sz); } static int print_encode(struct html *h, const char *p, int norecurse) {
*** 306,315 **** --- 334,349 ---- static const char rejs[6] = { '\\', '<', '>', '&', ASCII_HYPH, '\0' }; nospace = 0; while ('\0' != *p) { + if (HTML_SKIPCHAR & h->flags && '\\' != *p) { + h->flags &= ~HTML_SKIPCHAR; + p++; + continue; + } + sz = strcspn(p, rejs); fwrite(p, 1, sz, stdout); p += (int)sz;
*** 336,345 **** --- 370,406 ---- esc = mandoc_escape(&p, &seq, &len); if (ESCAPE_ERROR == esc) break; switch (esc) { + case (ESCAPE_FONT): + /* FALLTHROUGH */ + case (ESCAPE_FONTPREV): + /* FALLTHROUGH */ + case (ESCAPE_FONTBOLD): + /* FALLTHROUGH */ + case (ESCAPE_FONTITALIC): + /* FALLTHROUGH */ + case (ESCAPE_FONTBI): + /* FALLTHROUGH */ + case (ESCAPE_FONTROMAN): + if (0 == norecurse) + print_metaf(h, esc); + continue; + case (ESCAPE_SKIPCHAR): + h->flags |= HTML_SKIPCHAR; + continue; + default: + break; + } + + if (h->flags & HTML_SKIPCHAR) { + h->flags &= ~HTML_SKIPCHAR; + continue; + } + + switch (esc) { case (ESCAPE_UNICODE): /* Skip passed "u" header. */ c = mchars_num2uc(seq + 1, len - 1); if ('\0' != c) printf("&#x%x;", c);
*** 354,376 **** if (c > 0) printf("&#%d;", c); else if (-1 == c && 1 == len) putchar((int)*seq); break; - case (ESCAPE_FONT): - /* FALLTHROUGH */ - case (ESCAPE_FONTPREV): - /* FALLTHROUGH */ - case (ESCAPE_FONTBOLD): - /* FALLTHROUGH */ - case (ESCAPE_FONTITALIC): - /* FALLTHROUGH */ - case (ESCAPE_FONTROMAN): - if (norecurse) - break; - print_metaf(h, esc); - break; case (ESCAPE_NOSPACE): if ('\0' == *p) nospace = 1; break; default: --- 415,424 ----
*** 509,522 **** } else printf("&#160;"); } assert(NULL == h->metaf); ! if (HTMLFONT_NONE != h->metac) ! h->metaf = HTMLFONT_BOLD == h->metac ? ! print_otag(h, TAG_B, 0, NULL) : print_otag(h, TAG_I, 0, NULL); assert(word); if ( ! print_encode(h, word, 0)) { if ( ! (h->flags & HTML_NONOSPACE)) h->flags &= ~HTML_NOSPACE; --- 557,580 ---- } else printf("&#160;"); } assert(NULL == h->metaf); ! switch (h->metac) { ! case (HTMLFONT_ITALIC): ! h->metaf = print_otag(h, TAG_I, 0, NULL); ! break; ! case (HTMLFONT_BOLD): ! h->metaf = print_otag(h, TAG_B, 0, NULL); ! break; ! case (HTMLFONT_BI): ! h->metaf = print_otag(h, TAG_B, 0, NULL); print_otag(h, TAG_I, 0, NULL); + break; + default: + break; + } assert(word); if ( ! print_encode(h, word, 0)) { if ( ! (h->flags & HTML_NONOSPACE)) h->flags &= ~HTML_NOSPACE;