version 1.256, 2019/08/02 17:06:04 |
version 1.258, 2019/09/01 15:12:19 |
|
|
struct htmldata { |
struct htmldata { |
const char *name; |
const char *name; |
int flags; |
int flags; |
#define HTML_NOSTACK (1 << 0) |
#define HTML_INPHRASE (1 << 0) /* Can appear in phrasing context. */ |
#define HTML_AUTOCLOSE (1 << 1) |
#define HTML_TOPHRASE (1 << 1) /* Establishes phrasing context. */ |
#define HTML_NLBEFORE (1 << 2) |
#define HTML_NOSTACK (1 << 2) /* Does not have an end tag. */ |
#define HTML_NLBEGIN (1 << 3) |
#define HTML_NLBEFORE (1 << 3) /* Output line break before opening. */ |
#define HTML_NLEND (1 << 4) |
#define HTML_NLBEGIN (1 << 4) /* Output line break after opening. */ |
#define HTML_NLAFTER (1 << 5) |
#define HTML_NLEND (1 << 5) /* Output line break before closing. */ |
|
#define HTML_NLAFTER (1 << 6) /* Output line break after closing. */ |
#define HTML_NLAROUND (HTML_NLBEFORE | HTML_NLAFTER) |
#define HTML_NLAROUND (HTML_NLBEFORE | HTML_NLAFTER) |
#define HTML_NLINSIDE (HTML_NLBEGIN | HTML_NLEND) |
#define HTML_NLINSIDE (HTML_NLBEGIN | HTML_NLEND) |
#define HTML_NLALL (HTML_NLAROUND | HTML_NLINSIDE) |
#define HTML_NLALL (HTML_NLAROUND | HTML_NLINSIDE) |
#define HTML_INDENT (1 << 6) |
#define HTML_INDENT (1 << 7) /* Indent content by two spaces. */ |
#define HTML_NOINDENT (1 << 7) |
#define HTML_NOINDENT (1 << 8) /* Exception: never indent content. */ |
}; |
}; |
|
|
static const struct htmldata htmltags[TAG_MAX] = { |
static const struct htmldata htmltags[TAG_MAX] = { |
{"html", HTML_NLALL}, |
{"html", HTML_NLALL}, |
{"head", HTML_NLALL | HTML_INDENT}, |
{"head", HTML_NLALL | HTML_INDENT}, |
{"body", HTML_NLALL}, |
{"meta", HTML_NOSTACK | HTML_NLALL}, |
{"meta", HTML_NOSTACK | HTML_AUTOCLOSE | HTML_NLALL}, |
{"link", HTML_NOSTACK | HTML_NLALL}, |
|
{"style", HTML_NLALL | HTML_INDENT}, |
{"title", HTML_NLAROUND}, |
{"title", HTML_NLAROUND}, |
|
{"body", HTML_NLALL}, |
{"div", HTML_NLAROUND}, |
{"div", HTML_NLAROUND}, |
{"div", 0}, |
|
{"section", HTML_NLALL}, |
{"section", HTML_NLALL}, |
{"h1", HTML_NLAROUND}, |
|
{"h2", HTML_NLAROUND}, |
|
{"span", 0}, |
|
{"link", HTML_NOSTACK | HTML_AUTOCLOSE | HTML_NLALL}, |
|
{"br", HTML_NOSTACK | HTML_AUTOCLOSE | HTML_NLALL}, |
|
{"a", 0}, |
|
{"table", HTML_NLALL | HTML_INDENT}, |
{"table", HTML_NLALL | HTML_INDENT}, |
{"tr", HTML_NLALL | HTML_INDENT}, |
{"tr", HTML_NLALL | HTML_INDENT}, |
{"td", HTML_NLAROUND}, |
{"td", HTML_NLAROUND}, |
Line 79 static const struct htmldata htmltags[TAG_MAX] = { |
|
Line 75 static const struct htmldata htmltags[TAG_MAX] = { |
|
{"dl", HTML_NLALL | HTML_INDENT}, |
{"dl", HTML_NLALL | HTML_INDENT}, |
{"dt", HTML_NLAROUND}, |
{"dt", HTML_NLAROUND}, |
{"dd", HTML_NLAROUND | HTML_INDENT}, |
{"dd", HTML_NLAROUND | HTML_INDENT}, |
{"p", HTML_NLAROUND | HTML_INDENT}, |
{"h1", HTML_TOPHRASE | HTML_NLAROUND}, |
{"pre", HTML_NLALL | HTML_NOINDENT}, |
{"h2", HTML_TOPHRASE | HTML_NLAROUND}, |
{"var", 0}, |
{"p", HTML_TOPHRASE | HTML_NLAROUND | HTML_INDENT}, |
{"cite", 0}, |
{"pre", HTML_TOPHRASE | HTML_NLALL | HTML_NOINDENT}, |
{"b", 0}, |
{"a", HTML_INPHRASE | HTML_TOPHRASE}, |
{"i", 0}, |
{"b", HTML_INPHRASE | HTML_TOPHRASE}, |
{"code", 0}, |
{"cite", HTML_INPHRASE | HTML_TOPHRASE}, |
{"small", 0}, |
{"code", HTML_INPHRASE | HTML_TOPHRASE}, |
{"style", HTML_NLALL | HTML_INDENT}, |
{"i", HTML_INPHRASE | HTML_TOPHRASE}, |
{"math", HTML_NLALL | HTML_INDENT}, |
{"small", HTML_INPHRASE | HTML_TOPHRASE}, |
|
{"span", HTML_INPHRASE | HTML_TOPHRASE}, |
|
{"var", HTML_INPHRASE | HTML_TOPHRASE}, |
|
{"br", HTML_INPHRASE | HTML_NOSTACK | HTML_NLALL}, |
|
{"math", HTML_INPHRASE | HTML_NLALL | HTML_INDENT}, |
{"mrow", 0}, |
{"mrow", 0}, |
{"mi", 0}, |
{"mi", 0}, |
{"mn", 0}, |
{"mn", 0}, |
Line 584 print_otag(struct html *h, enum htmltag tag, const cha |
|
Line 584 print_otag(struct html *h, enum htmltag tag, const cha |
|
|
|
tflags = htmltags[tag].flags; |
tflags = htmltags[tag].flags; |
|
|
|
/* Flow content is not allowed in phrasing context. */ |
|
|
|
if ((tflags & HTML_INPHRASE) == 0) { |
|
for (t = h->tag; t != NULL; t = t->next) { |
|
if (t->closed) |
|
continue; |
|
assert((htmltags[t->tag].flags & HTML_TOPHRASE) == 0); |
|
break; |
|
} |
|
} |
|
|
/* Push this tag onto the stack of open scopes. */ |
/* Push this tag onto the stack of open scopes. */ |
|
|
if ((tflags & HTML_NOSTACK) == 0) { |
if ((tflags & HTML_NOSTACK) == 0) { |
Line 701 print_otag(struct html *h, enum htmltag tag, const cha |
|
Line 712 print_otag(struct html *h, enum htmltag tag, const cha |
|
|
|
/* Accommodate for "well-formed" singleton escaping. */ |
/* Accommodate for "well-formed" singleton escaping. */ |
|
|
if (HTML_AUTOCLOSE & htmltags[tag].flags) |
if (htmltags[tag].flags & HTML_NOSTACK) |
print_byte(h, '/'); |
print_byte(h, '/'); |
|
|
print_byte(h, '>'); |
print_byte(h, '>'); |