aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-12-24 00:46:49 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-12-24 00:46:49 +0000
commitd1f1f8d600d26e5bb01736ad53269bed555043d5 (patch)
tree4d80d982f1229b979fa15a355b785ba7fb5aac8b
parent188534b2a99bf10e95000577793cb759e21d5a78 (diff)
downloadmandoc-d1f1f8d600d26e5bb01736ad53269bed555043d5.tar.gz
mandoc-d1f1f8d600d26e5bb01736ad53269bed555043d5.tar.zst
mandoc-d1f1f8d600d26e5bb01736ad53269bed555043d5.zip
Drastically fix -T[x]html's handling of font-escape mode changes (i.e.,
using \fI or \fP). Now, using these modes will cause a font to be rendered for each word; furthermore, setting mode within a word will do the correct thing. Second, make -man use real font tags (B, I, SMALL) to set its font instead of using font modes and fix up the pre-macro unsetting of the current mode. This fixes how roff.7 wasn't validating (<P> closing out a font mode) and has been checked against gcc.1 (more will come). I considered failure to validate OUR manual to be a show-stopper for the up-coming release.
-rw-r--r--example.style.css9
-rw-r--r--html.c52
-rw-r--r--html.h10
-rw-r--r--man_html.c53
4 files changed, 58 insertions, 66 deletions
diff --git a/example.style.css b/example.style.css
index a39ec402..567fd0ba 100644
--- a/example.style.css
+++ b/example.style.css
@@ -1,4 +1,4 @@
-/* $Id: example.style.css,v 1.38 2010/12/22 11:15:16 kristaps Exp $ */
+/* $Id: example.style.css,v 1.39 2010/12/24 00:46:49 kristaps Exp $ */
/*
* This default style-sheet mimics the appearance of the traditional
@@ -35,12 +35,11 @@ td { vertical-align: top; }
/* General font modes. */
-.italic { font-style: italic; font-weight: normal; } /* Italic: BI, IB, I, (implicit). */
+i { } /* Italic: BI, IB, I, (implicit). */
.emph { font-style: italic; font-weight: normal; } /* Emphasis: Em, Bl -emphasis. */
-.bold { font-style: normal; font-weight: bold; } /* Bold: SB, BI, IB, BR, RB, B, (implicit). */
+b { } /* Bold: SB, BI, IB, BR, RB, B, (implicit). */
.symb { font-style: normal; font-weight: bold; } /* Symbolic: Sy, Ms, Bf -symbolic. */
-.roman { font-style: normal; font-weight: normal; } /* Roman: (implicit). */
-.small { font-style: normal; font-weight: normal; font-size: smaller; } /* Small: SB, SM. */
+small { } /* Small: SB, SM. */
/* Block modes. */
diff --git a/html.c b/html.c
index d99bd58f..df7940ba 100644
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/* $Id: html.c,v 1.121 2010/12/22 11:15:16 kristaps Exp $ */
+/* $Id: html.c,v 1.122 2010/12/24 00:46:49 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -74,12 +74,7 @@ static const struct htmldata htmltags[TAG_MAX] = {
{"i", 0 }, /* TAG_I */
{"u", 0 }, /* TAG_U */
{"code", 0 }, /* TAG_CODE */
-};
-
-static const char *const htmlfonts[HTMLFONT_MAX] = {
- "roman",
- "bold",
- "italic"
+ {"small", 0 }, /* TAG_SMALL */
};
static const char *const htmlattrs[ATTR_MAX] = {
@@ -257,25 +252,6 @@ print_res(struct html *h, const char *p, size_t len)
}
-struct tag *
-print_ofont(struct html *h, enum htmlfont font)
-{
- struct htmlpair tag;
-
- h->metal = h->metac;
- h->metac = font;
-
- /* FIXME: DECO_ROMAN should just close out preexisting. */
-
- if (h->metaf && h->tags.head == h->metaf)
- print_tagq(h, h->metaf);
-
- PAIR_CLASS_INIT(&tag, htmlfonts[font]);
- h->metaf = print_otag(h, TAG_SPAN, 1, &tag);
- return(h->metaf);
-}
-
-
static void
print_metaf(struct html *h, enum roffdeco deco)
{
@@ -299,7 +275,18 @@ print_metaf(struct html *h, enum roffdeco deco)
/* NOTREACHED */
}
- (void)print_ofont(h, font);
+ if (h->metaf) {
+ print_tagq(h, h->metaf);
+ h->metaf = NULL;
+ }
+
+ 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);
}
@@ -554,11 +541,22 @@ print_text(struct html *h, const char *word)
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;
+ if (h->metaf) {
+ print_tagq(h, h->metaf);
+ h->metaf = NULL;
+ }
+
h->flags &= ~HTML_IGNDELIM;
/*
diff --git a/html.h b/html.h
index 2d11280b..63575902 100644
--- a/html.h
+++ b/html.h
@@ -1,4 +1,4 @@
-/* $Id: html.h,v 1.34 2010/12/22 11:15:16 kristaps Exp $ */
+/* $Id: html.h,v 1.35 2010/12/24 00:46:49 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -50,6 +50,7 @@ enum htmltag {
TAG_I,
TAG_U,
TAG_CODE,
+ TAG_SMALL,
TAG_MAX
};
@@ -123,9 +124,9 @@ struct html {
char *style;
char buf[BUFSIZ];
size_t buflen;
- struct tag *metaf;
- enum htmlfont metal;
- enum htmlfont metac;
+ struct tag *metaf; /* current open font scope */
+ enum htmlfont metal; /* last used font */
+ enum htmlfont metac; /* current font mode */
enum htmltype type;
};
@@ -133,7 +134,6 @@ struct roffsu;
void print_gen_decls(struct html *);
void print_gen_head(struct html *);
-struct tag *print_ofont(struct html *, enum htmlfont);
struct tag *print_otag(struct html *, enum htmltag,
int, const struct htmlpair *);
void print_tagq(struct html *, const struct tag *);
diff --git a/man_html.c b/man_html.c
index 39fdf89b..4bcdf3dc 100644
--- a/man_html.c
+++ b/man_html.c
@@ -1,4 +1,4 @@
-/* $Id: man_html.c,v 1.56 2010/12/22 09:51:27 kristaps Exp $ */
+/* $Id: man_html.c,v 1.57 2010/12/24 00:46:49 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -209,11 +209,9 @@ print_man_node(MAN_ARGS)
* scope. Assert that the metafont is on the top of the
* stack (it's never nested).
*/
- if (h->metaf) {
- assert(h->metaf == t);
- print_tagq(h, h->metaf);
- assert(NULL == h->metaf);
- t = h->tags.head;
+ if (HTMLFONT_NONE != h->metac) {
+ h->metal = h->metac;
+ h->metac = HTMLFONT_NONE;
}
if (mans[n->tok].pre)
child = (*mans[n->tok].pre)(m, n, mh, h);
@@ -409,29 +407,30 @@ static int
man_alt_pre(MAN_ARGS)
{
const struct man_node *nn;
- struct tag *t;
- int i;
- enum htmlfont fp;
+ int i;
+ enum htmltag fp;
+ struct tag *t;
for (i = 0, nn = n->child; nn; nn = nn->next, i++) {
+ t = NULL;
switch (n->tok) {
case (MAN_BI):
- fp = i % 2 ? HTMLFONT_ITALIC : HTMLFONT_BOLD;
+ fp = i % 2 ? TAG_I : TAG_B;
break;
case (MAN_IB):
- fp = i % 2 ? HTMLFONT_BOLD : HTMLFONT_ITALIC;
+ fp = i % 2 ? TAG_B : TAG_I;
break;
case (MAN_RI):
- fp = i % 2 ? HTMLFONT_ITALIC : HTMLFONT_NONE;
+ fp = i % 2 ? TAG_I : TAG_MAX;
break;
case (MAN_IR):
- fp = i % 2 ? HTMLFONT_NONE : HTMLFONT_ITALIC;
+ fp = i % 2 ? TAG_MAX : TAG_I;
break;
case (MAN_BR):
- fp = i % 2 ? HTMLFONT_NONE : HTMLFONT_BOLD;
+ fp = i % 2 ? TAG_MAX : TAG_B;
break;
case (MAN_RB):
- fp = i % 2 ? HTMLFONT_BOLD : HTMLFONT_NONE;
+ fp = i % 2 ? TAG_B : TAG_MAX;
break;
default:
abort();
@@ -441,14 +440,13 @@ man_alt_pre(MAN_ARGS)
if (i)
h->flags |= HTML_NOSPACE;
- /*
- * Open and close the scope with each argument, so that
- * internal \f escapes, which are common, are also
- * closed out with the scope.
- */
- t = print_ofont(h, fp);
+ if (TAG_MAX != fp)
+ t = print_otag(h, fp, 0, NULL);
+
print_man_node(m, nn, mh, h);
- print_tagq(h, t);
+
+ if (t)
+ print_tagq(h, t);
}
return(0);
@@ -459,13 +457,10 @@ man_alt_pre(MAN_ARGS)
static int
man_SM_pre(MAN_ARGS)
{
- struct htmlpair tag;
- /* FIXME: print_ofont(). */
- PAIR_CLASS_INIT(&tag, "small");
- print_otag(h, TAG_SPAN, 1, &tag);
+ print_otag(h, TAG_SMALL, 0, NULL);
if (MAN_SB == n->tok)
- print_ofont(h, HTMLFONT_BOLD);
+ print_otag(h, TAG_B, 0, NULL);
return(1);
}
@@ -630,7 +625,7 @@ static int
man_B_pre(MAN_ARGS)
{
- print_ofont(h, HTMLFONT_BOLD);
+ print_otag(h, TAG_B, 0, NULL);
return(1);
}
@@ -640,7 +635,7 @@ static int
man_I_pre(MAN_ARGS)
{
- print_ofont(h, HTMLFONT_ITALIC);
+ print_otag(h, TAG_I, 0, NULL);
return(1);
}