=================================================================== RCS file: /cvs/mandoc/html.c,v retrieving revision 1.123 retrieving revision 1.130 diff -u -p -r1.123 -r1.130 --- mandoc/html.c 2010/12/24 14:14:00 1.123 +++ mandoc/html.c 2011/03/22 10:13:01 1.130 @@ -1,6 +1,7 @@ -/* $Id: html.c,v 1.123 2010/12/24 14:14:00 kristaps Exp $ */ +/* $Id: html.c,v 1.130 2011/03/22 10:13:01 kristaps Exp $ */ /* - * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons + * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons + * Copyright (c) 2011 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -31,7 +32,6 @@ #include "mandoc.h" #include "out.h" -#include "chars.h" #include "html.h" #include "main.h" @@ -90,8 +90,10 @@ static const char *const htmlattrs[ATTR_MAX] = { "id", /* ATTR_ID */ "summary", /* ATTR_SUMMARY */ "align", /* ATTR_ALIGN */ + "colspan", /* ATTR_COLSPAN */ }; +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_res(struct html *, const char *, size_t); @@ -117,11 +119,7 @@ ml_alloc(char *outopts, enum htmltype type) toks[2] = "includes"; toks[3] = NULL; - h = calloc(1, sizeof(struct html)); - if (NULL == h) { - perror(NULL); - exit((int)MANDOCLEVEL_SYSERR); - } + h = mandoc_calloc(1, sizeof(struct html)); h->type = type; h->tags.head = NULL; @@ -211,7 +209,17 @@ print_gen_head(struct html *h) } } +/* ARGSUSED */ +static void +print_num(struct html *h, const char *p, size_t len) +{ + const char *rhs; + rhs = chars_num2char(p, len); + if (rhs) + putchar((int)*rhs); +} + static void print_spec(struct html *h, enum roffdeco d, const char *p, size_t len) { @@ -332,6 +340,9 @@ print_encode(struct html *h, const char *p, int norecu len = a2roffdeco(&deco, &seq, &sz); switch (deco) { + case (DECO_NUMBERED): + print_num(h, seq, sz); + break; case (DECO_RESERVED): print_res(h, seq, sz); break; @@ -384,11 +395,7 @@ print_otag(struct html *h, enum htmltag tag, /* Push this tags onto the stack of open scopes. */ if ( ! (HTML_NOSTACK & htmltags[tag].flags)) { - t = malloc(sizeof(struct tag)); - if (NULL == t) { - perror(NULL); - exit((int)MANDOCLEVEL_SYSERR); - } + t = mandoc_malloc(sizeof(struct tag)); t->tag = tag; t->next = h->tags.head; h->tags.head = t; @@ -506,29 +513,9 @@ void print_text(struct html *h, const char *word) { - if (word[0] && '\0' == word[1]) - switch (word[0]) { - case('.'): - /* FALLTHROUGH */ - case(','): - /* FALLTHROUGH */ - case(';'): - /* FALLTHROUGH */ - case(':'): - /* FALLTHROUGH */ - case('?'): - /* FALLTHROUGH */ - case('!'): - /* FALLTHROUGH */ - case(')'): - /* FALLTHROUGH */ - case(']'): - if ( ! (HTML_IGNDELIM & h->flags)) - h->flags |= HTML_NOSPACE; - break; - default: - break; - } + if (DELIM_CLOSE == mandoc_isdelim(word)) + if ( ! (HTML_IGNDELIM & h->flags)) + h->flags |= HTML_NOSPACE; if ( ! (HTML_NOSPACE & h->flags)) { /* Manage keeps! */ @@ -558,20 +545,8 @@ print_text(struct html *h, const char *word) h->flags &= ~HTML_IGNDELIM; - /* - * Note that we don't process the pipe: the parser sees it as - * punctuation, but we don't in terms of typography. - */ - if (word[0] && '\0' == word[1]) - switch (word[0]) { - case('('): - /* FALLTHROUGH */ - case('['): - h->flags |= HTML_NOSPACE; - break; - default: - break; - } + if (DELIM_OPEN == mandoc_isdelim(word)) + h->flags |= HTML_NOSPACE; } @@ -581,8 +556,14 @@ print_tagq(struct html *h, const struct tag *until) struct tag *tag; while ((tag = h->tags.head) != NULL) { + /* + * Remember to close out and nullify the current + * meta-font and table, if applicable. + */ if (tag == h->metaf) h->metaf = NULL; + if (tag == h->tblt) + h->tblt = NULL; print_ctag(h, tag->tag); h->tags.head = tag->next; free(tag); @@ -600,8 +581,14 @@ print_stagq(struct html *h, const struct tag *suntil) while ((tag = h->tags.head) != NULL) { if (suntil && tag == suntil) return; + /* + * Remember to close out and nullify the current + * meta-font and table, if applicable. + */ if (tag == h->metaf) h->metaf = NULL; + if (tag == h->tblt) + h->tblt = NULL; print_ctag(h, tag->tag); h->tags.head = tag->next; free(tag); @@ -771,20 +758,24 @@ html_idcat(char *dst, const char *src, int sz) { int ssz; - assert(sz); + assert(sz > 2); /* Cf. . */ - for ( ; *dst != '\0' && sz; dst++, sz--) - /* Jump to end. */ ; - - assert(sz > 2); - /* We can't start with a number (bah). */ - *dst++ = 'x'; - *dst = '\0'; - sz--; + if ('#' == *dst) { + dst++; + sz--; + } + if ('\0' == *dst) { + *dst++ = 'x'; + *dst = '\0'; + sz--; + } + + for ( ; *dst != '\0' && sz; dst++, sz--) + /* Jump to end. */ ; for ( ; *src != '\0' && sz > 1; src++) { ssz = snprintf(dst, (size_t)sz, "%.2x", *src);