summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--example.style.css6
-rw-r--r--html.c8
-rw-r--r--html.h8
-rw-r--r--man_html.c33
-rw-r--r--mandoc.16
-rw-r--r--mdoc_html.c31
6 files changed, 53 insertions, 39 deletions
diff --git a/example.style.css b/example.style.css
index 1b1e44dd..ee306309 100644
--- a/example.style.css
+++ b/example.style.css
@@ -9,8 +9,10 @@
* See mdoc(7) and man(7) for macro explanations.
*/
-html { min-width: 580px; width: 580px; }
-body { font-family: monospace; }
+div.mandoc { min-width: 78ex;
+ width: 78ex;
+ font-family: monospace; } /* This is the outer node of all mandoc -T[x]html documents. */
+
h1 { margin-bottom: 0ex; font-size: inherit; margin-left: -4ex; } /* Section header (Sh, SH). */
h2 { margin-bottom: 0ex; font-size: inherit; margin-left: -2ex; } /* Sub-section header (Ss, SS). */
table { width: 100%; margin-top: 0ex; margin-bottom: 0ex; } /* All tables. */
diff --git a/html.c b/html.c
index 346380c2..fe8a3ba8 100644
--- a/html.c
+++ b/html.c
@@ -118,13 +118,14 @@ static void *
ml_alloc(char *outopts, enum htmltype type)
{
struct html *h;
- const char *toks[4];
+ const char *toks[5];
char *v;
toks[0] = "style";
toks[1] = "man";
toks[2] = "includes";
- toks[3] = NULL;
+ toks[3] = "fragment";
+ toks[4] = NULL;
h = mandoc_calloc(1, sizeof(struct html));
@@ -143,6 +144,9 @@ ml_alloc(char *outopts, enum htmltype type)
case (2):
h->base_includes = v;
break;
+ case (3):
+ h->oflags |= HTML_FRAGMENT;
+ break;
default:
break;
}
diff --git a/html.h b/html.h
index bf622ade..7c95e2dc 100644
--- a/html.h
+++ b/html.h
@@ -104,7 +104,7 @@ struct htmlpair {
#define PAIR_STYLE_INIT(p, h) PAIR_INIT(p, ATTR_STYLE, (h)->buf)
#define PAIR_SUMMARY_INIT(p, v) PAIR_INIT(p, ATTR_SUMMARY, v)
-enum htmltype {
+enum htmltype {
HTML_HTML_4_01_STRICT,
HTML_XHTML_1_0_STRICT
};
@@ -125,11 +125,13 @@ struct html {
char *base_includes; /* base for include href */
char *style; /* style-sheet URI */
char buf[BUFSIZ]; /* see bufcat and friends */
- size_t buflen;
+ size_t buflen;
struct tag *metaf; /* current open font scope */
enum htmlfont metal; /* last used font */
enum htmlfont metac; /* current font mode */
- enum htmltype type;
+ enum htmltype type; /* output media type */
+ int oflags; /* output options */
+#define HTML_FRAGMENT (1 << 0) /* don't emit HTML/HEAD/BODY */
};
void print_gen_decls(struct html *);
diff --git a/man_html.c b/man_html.c
index 681cd9df..050bc84a 100644
--- a/man_html.c
+++ b/man_html.c
@@ -141,33 +141,32 @@ print_bvspace(struct html *h, const struct man_node *n)
void
html_man(void *arg, const struct man *m)
{
- struct html *h;
- struct tag *t;
struct mhtml mh;
- h = (struct html *)arg;
-
- print_gen_decls(h);
-
memset(&mh, 0, sizeof(struct mhtml));
-
- t = print_otag(h, TAG_HTML, 0, NULL);
- print_man(man_meta(m), man_node(m), &mh, h);
- print_tagq(h, t);
-
- printf("\n");
+ print_man(man_meta(m), man_node(m), &mh, (struct html *)arg);
+ putchar('\n');
}
static void
print_man(MAN_ARGS)
{
- struct tag *t;
+ struct tag *t, *tt;
+ struct htmlpair tag;
- t = print_otag(h, TAG_HEAD, 0, NULL);
- print_man_head(m, n, mh, h);
- print_tagq(h, t);
+ PAIR_CLASS_INIT(&tag, "mandoc");
+
+ if ( ! (HTML_FRAGMENT & h->oflags)) {
+ print_gen_decls(h);
+ t = print_otag(h, TAG_HTML, 0, NULL);
+ tt = print_otag(h, TAG_HEAD, 0, NULL);
+ print_man_head(m, n, mh, h);
+ print_tagq(h, tt);
+ print_otag(h, TAG_BODY, 0, NULL);
+ print_otag(h, TAG_DIV, 1, &tag);
+ } else
+ t = print_otag(h, TAG_DIV, 1, &tag);
- t = print_otag(h, TAG_BODY, 0, NULL);
print_man_nodelist(m, n, mh, h);
print_tagq(h, t);
}
diff --git a/mandoc.1 b/mandoc.1
index 57b36ed5..8f842e96 100644
--- a/mandoc.1
+++ b/mandoc.1
@@ -259,6 +259,12 @@ The following
.Fl O
arguments are accepted:
.Bl -tag -width Ds
+.It Cm fragment
+Do not emit doctype, html, and body elements.
+The
+.Cm style
+argument shall be unused.
+This is useful when embedding manual content within existing documents.
.It Cm includes Ns = Ns Ar fmt
The string
.Ar fmt ,
diff --git a/mdoc_html.c b/mdoc_html.c
index 966e2c44..b51adc45 100644
--- a/mdoc_html.c
+++ b/mdoc_html.c
@@ -262,17 +262,9 @@ static const char * const lists[LIST_MAX] = {
void
html_mdoc(void *arg, const struct mdoc *m)
{
- struct html *h;
- struct tag *t;
-
- h = (struct html *)arg;
-
- print_gen_decls(h);
- t = print_otag(h, TAG_HTML, 0, NULL);
- print_mdoc(mdoc_meta(m), mdoc_node(m), h);
- print_tagq(h, t);
- printf("\n");
+ print_mdoc(mdoc_meta(m), mdoc_node(m), (struct html *)arg);
+ putchar('\n');
}
@@ -360,13 +352,22 @@ a2offs(const char *p, struct roffsu *su)
static void
print_mdoc(MDOC_ARGS)
{
- struct tag *t;
+ struct tag *t, *tt;
+ struct htmlpair tag;
- t = print_otag(h, TAG_HEAD, 0, NULL);
- print_mdoc_head(m, n, h);
- print_tagq(h, t);
+ PAIR_CLASS_INIT(&tag, "mandoc");
+
+ if ( ! (HTML_FRAGMENT & h->oflags)) {
+ print_gen_decls(h);
+ t = print_otag(h, TAG_HTML, 0, NULL);
+ tt = print_otag(h, TAG_HEAD, 0, NULL);
+ print_mdoc_head(m, n, h);
+ print_tagq(h, tt);
+ print_otag(h, TAG_BODY, 0, NULL);
+ print_otag(h, TAG_DIV, 1, &tag);
+ } else
+ t = print_otag(h, TAG_DIV, 1, &tag);
- t = print_otag(h, TAG_BODY, 0, NULL);
print_mdoc_nodelist(m, n, h);
print_tagq(h, t);
}