version 1.256, 2019/08/02 17:06:04 |
version 1.260, 2019/09/03 18:08:02 |
|
|
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 271 print_metaf(struct html *h) |
|
Line 271 print_metaf(struct html *h) |
|
void |
void |
html_close_paragraph(struct html *h) |
html_close_paragraph(struct html *h) |
{ |
{ |
struct tag *t; |
struct tag *this, *next; |
|
int flags; |
|
|
for (t = h->tag; t != NULL && t->closed == 0; t = t->next) { |
this = h->tag; |
switch(t->tag) { |
for (;;) { |
case TAG_P: |
next = this->next; |
case TAG_PRE: |
flags = htmltags[this->tag].flags; |
print_tagq(h, t); |
if (flags & (HTML_INPHRASE | HTML_TOPHRASE)) |
|
print_ctag(h, this); |
|
if ((flags & HTML_INPHRASE) == 0) |
break; |
break; |
case TAG_A: |
this = next; |
print_tagq(h, t); |
|
continue; |
|
default: |
|
continue; |
|
} |
|
break; |
|
} |
} |
} |
} |
|
|
Line 584 print_otag(struct html *h, enum htmltag tag, const cha |
|
Line 581 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; |
|
} |
|
|
|
/* |
|
* Always wrap phrasing elements in a paragraph |
|
* unless already contained in some flow container; |
|
* never put them directly into a section. |
|
*/ |
|
|
|
} else if (tflags & HTML_TOPHRASE && h->tag->tag == TAG_SECTION) |
|
print_otag(h, TAG_P, "c", "Pp"); |
|
|
/* 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 717 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, '>'); |
Line 788 print_gen_comment(struct html *h, struct roff_node *n) |
|
Line 804 print_gen_comment(struct html *h, struct roff_node *n) |
|
void |
void |
print_text(struct html *h, const char *word) |
print_text(struct html *h, const char *word) |
{ |
{ |
|
/* |
|
* Always wrap text in a paragraph unless already contained in |
|
* some flow container; never put it directly into a section. |
|
*/ |
|
|
|
if (h->tag->tag == TAG_SECTION) |
|
print_otag(h, TAG_P, "c", "Pp"); |
|
|
|
/* Output whitespace before this text? */ |
|
|
if (h->col && (h->flags & HTML_NOSPACE) == 0) { |
if (h->col && (h->flags & HTML_NOSPACE) == 0) { |
if ( ! (HTML_KEEP & h->flags)) { |
if ( ! (HTML_KEEP & h->flags)) { |
if (HTML_PREKEEP & h->flags) |
if (HTML_PREKEEP & h->flags) |
Line 796 print_text(struct html *h, const char *word) |
|
Line 822 print_text(struct html *h, const char *word) |
|
} else |
} else |
print_word(h, " "); |
print_word(h, " "); |
} |
} |
|
|
|
/* |
|
* Print the text, optionally surrounded by HTML whitespace, |
|
* optionally manually switching fonts before and after. |
|
*/ |
|
|
assert(h->metaf == NULL); |
assert(h->metaf == NULL); |
print_metaf(h); |
print_metaf(h); |