=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/html.c,v retrieving revision 1.5 retrieving revision 1.6 diff -c -r1.5 -r1.6 *** src/usr.bin/mandoc/html.c 2009/12/24 02:08:14 1.5 --- src/usr.bin/mandoc/html.c 2010/02/18 02:11:25 1.6 *************** *** 1,4 **** ! /* $Id: html.c,v 1.5 2009/12/24 02:08:14 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * --- 1,4 ---- ! /* $Id: html.c,v 1.6 2010/02/18 02:11:25 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * *************** *** 32,69 **** #define UNCONST(a) ((void *)(uintptr_t)(const void *)(a)) - #define DOCTYPE "-//W3C//DTD HTML 4.01//EN" - #define DTD "http://www.w3.org/TR/html4/strict.dtd" - struct htmldata { const char *name; int flags; #define HTML_CLRLINE (1 << 0) #define HTML_NOSTACK (1 << 1) }; static const struct htmldata htmltags[TAG_MAX] = { {"html", HTML_CLRLINE}, /* TAG_HTML */ {"head", HTML_CLRLINE}, /* TAG_HEAD */ {"body", HTML_CLRLINE}, /* TAG_BODY */ ! {"meta", HTML_CLRLINE | HTML_NOSTACK}, /* TAG_META */ {"title", HTML_CLRLINE}, /* TAG_TITLE */ {"div", HTML_CLRLINE}, /* TAG_DIV */ {"h1", 0}, /* TAG_H1 */ {"h2", 0}, /* TAG_H2 */ - {"p", HTML_CLRLINE}, /* TAG_P */ {"span", 0}, /* TAG_SPAN */ {"link", HTML_CLRLINE | HTML_NOSTACK}, /* TAG_LINK */ ! {"br", HTML_CLRLINE | HTML_NOSTACK}, /* TAG_LINK */ {"a", 0}, /* TAG_A */ {"table", HTML_CLRLINE}, /* TAG_TABLE */ ! {"col", HTML_CLRLINE | HTML_NOSTACK}, /* TAG_COL */ {"tr", HTML_CLRLINE}, /* TAG_TR */ {"td", HTML_CLRLINE}, /* TAG_TD */ {"li", HTML_CLRLINE}, /* TAG_LI */ {"ul", HTML_CLRLINE}, /* TAG_UL */ {"ol", HTML_CLRLINE}, /* TAG_OL */ - {"base", HTML_CLRLINE | HTML_NOSTACK}, /* TAG_BASE */ }; static const char *const htmlfonts[HTMLFONT_MAX] = { --- 32,65 ---- #define UNCONST(a) ((void *)(uintptr_t)(const void *)(a)) struct htmldata { const char *name; int flags; #define HTML_CLRLINE (1 << 0) #define HTML_NOSTACK (1 << 1) + #define HTML_AUTOCLOSE (1 << 2) /* Tag has auto-closure. */ }; static const struct htmldata htmltags[TAG_MAX] = { {"html", HTML_CLRLINE}, /* TAG_HTML */ {"head", HTML_CLRLINE}, /* TAG_HEAD */ {"body", HTML_CLRLINE}, /* TAG_BODY */ ! {"meta", HTML_CLRLINE | HTML_NOSTACK | HTML_AUTOCLOSE}, /* TAG_META */ {"title", HTML_CLRLINE}, /* TAG_TITLE */ {"div", HTML_CLRLINE}, /* TAG_DIV */ {"h1", 0}, /* TAG_H1 */ {"h2", 0}, /* TAG_H2 */ {"span", 0}, /* TAG_SPAN */ {"link", HTML_CLRLINE | HTML_NOSTACK}, /* TAG_LINK */ ! {"br", HTML_CLRLINE | HTML_NOSTACK | HTML_AUTOCLOSE}, /* TAG_BR */ {"a", 0}, /* TAG_A */ {"table", HTML_CLRLINE}, /* TAG_TABLE */ ! {"col", HTML_CLRLINE | HTML_NOSTACK | HTML_AUTOCLOSE}, /* TAG_COL */ {"tr", HTML_CLRLINE}, /* TAG_TR */ {"td", HTML_CLRLINE}, /* TAG_TD */ {"li", HTML_CLRLINE}, /* TAG_LI */ {"ul", HTML_CLRLINE}, /* TAG_UL */ {"ol", HTML_CLRLINE}, /* TAG_OL */ }; static const char *const htmlfonts[HTMLFONT_MAX] = { *************** *** 93,104 **** 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 int print_encode(struct html *, const char *, int); static void print_metaf(struct html *, enum roffdeco); ! void * ! html_alloc(char *outopts) { struct html *h; const char *toks[4]; --- 89,105 ---- 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_attr(struct html *, + const char *, const char *); + static void *ml_alloc(char *, enum htmltype); ! static void * ! ml_alloc(char *outopts, enum htmltype type) { struct html *h; const char *toks[4]; *************** *** 115,120 **** --- 116,122 ---- exit(EXIT_FAILURE); } + h->type = type; h->tags.head = NULL; h->ords.head = NULL; h->symtab = chars_init(CHARS_HTML); *************** *** 137,143 **** --- 139,160 ---- return(h); } + void * + html_alloc(char *outopts) + { + return(ml_alloc(outopts, HTML_HTML_4_01_STRICT)); + } + + + void * + xhtml_alloc(char *outopts) + { + + return(ml_alloc(outopts, HTML_XHTML_1_0_STRICT)); + } + + void html_free(void *p) { *************** *** 333,338 **** --- 350,364 ---- } + static void + print_attr(struct html *h, const char *key, const char *val) + { + printf(" %s=\"", key); + (void)print_encode(h, val, 1); + putchar('\"'); + } + + struct tag * print_otag(struct html *h, enum htmltag tag, int sz, const struct htmlpair *p) *************** *** 340,345 **** --- 366,373 ---- int i; struct tag *t; + /* Push this tags onto the stack of open scopes. */ + if ( ! (HTML_NOSTACK & htmltags[tag].flags)) { t = malloc(sizeof(struct tag)); if (NULL == t) { *************** *** 356,368 **** if ( ! (HTML_CLRLINE & htmltags[tag].flags)) putchar(' '); printf("<%s", htmltags[tag].name); ! for (i = 0; i < sz; i++) { ! printf(" %s=\"", htmlattrs[p[i].key]); ! assert(p->val); ! (void)print_encode(h, p[i].val, 1); ! putchar('\"'); } putchar('>'); h->flags |= HTML_NOSPACE; --- 384,414 ---- if ( ! (HTML_CLRLINE & htmltags[tag].flags)) putchar(' '); + /* Print out the tag name and attributes. */ + printf("<%s", htmltags[tag].name); ! for (i = 0; i < sz; i++) ! print_attr(h, htmlattrs[p[i].key], p[i].val); ! ! /* Add non-overridable attributes. */ ! ! if (TAG_HTML == tag && HTML_XHTML_1_0_STRICT == h->type) { ! print_attr(h, "xmlns", "http://www.w3.org/1999/xhtml"); ! print_attr(h, "xml:lang", "en"); ! print_attr(h, "lang", "en"); } + + /* Accomodate for XML "well-formed" singleton escaping. */ + + if (HTML_AUTOCLOSE & htmltags[tag].flags) + switch (h->type) { + case (HTML_XHTML_1_0_STRICT): + putchar('/'); + break; + default: + break; + } + putchar('>'); h->flags |= HTML_NOSPACE; *************** *** 382,393 **** } - /* ARGSUSED */ void ! print_gen_doctype(struct html *h) { ! ! printf("", DOCTYPE, DTD); } --- 428,485 ---- } void ! print_gen_decls(struct html *h) { ! ! print_xmltype(h); ! print_doctype(h); ! } ! ! ! static void ! print_xmltype(struct html *h) ! { ! const char *decl; ! ! switch (h->type) { ! case (HTML_XHTML_1_0_STRICT): ! decl = ""; ! break; ! default: ! decl = NULL; ! break; ! } ! ! if (NULL == decl) ! return; ! ! printf("%s\n", decl); ! } ! ! ! static void ! print_doctype(struct html *h) ! { ! const char *doctype; ! const char *dtd; ! const char *name; ! ! switch (h->type) { ! case (HTML_HTML_4_01_STRICT): ! name = "HTML"; ! doctype = "-//W3C//DTD HTML 4.01//EN"; ! dtd = "http://www.w3.org/TR/html4/strict.dtd"; ! break; ! default: ! name = "html"; ! doctype = "-//W3C//DTD XHTML 1.0 Strict//EN"; ! dtd = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"; ! break; ! } ! ! printf("\n", ! name, doctype, dtd); }