]> git.cameronkatri.com Git - mandoc.git/commitdiff
Added the -oincludes=FMT option.
authorKristaps Dzonsons <kristaps@bsd.lv>
Sat, 3 Oct 2009 15:26:26 +0000 (15:26 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Sat, 3 Oct 2009 15:26:26 +0000 (15:26 +0000)
The `In' handler now decorates with a hyperlink.
If no -oman= or -oincludes= is stipulated, no link is printed (but the text is still style-decorated).

example.style.css
html.c
html.h
mandoc.1
mdoc_html.c

index 1867d4fe6c183c072aea90cb2a631eff0bafd41b..cbb279cb0d826455b65fd073a696dd716e1e8060 100644 (file)
@@ -54,6 +54,7 @@ span.utility  { font-weight: bold; } /* Name of utility (Ex). */
 span.var       { font-weight: bold; } /* Variables (Rv). */
 
 a.link-ext     { } /* Off-site link (Lk). */
+a.link-includes        { } /* Include-file link (In). */
 a.link-mail    { } /* Mailto links (Mt). */
 a.link-man     { } /* Manual links (Xr). */
 a.link-sec     { } /* Section links (Sx). */
diff --git a/html.c b/html.c
index ae7c50b8d2a8677dcaf4abef0159acc58cd3fed5..45b40be81c94a0cfde72a36699f6514f91c8624b 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/*     $Id: html.c,v 1.53 2009/10/03 15:08:09 kristaps Exp $ */
+/*     $Id: html.c,v 1.54 2009/10/03 15:26:26 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -73,6 +73,7 @@ static        const char       *const htmlattrs[ATTR_MAX] = {
        "style",
        "width",
        "valign",
+       "target",
 };
 
 #ifdef __linux__
@@ -87,7 +88,8 @@ html_alloc(char *outopts)
 
        toks[0] = "style";
        toks[1] = "man";
-       toks[2] = NULL;
+       toks[2] = "includes";
+       toks[3] = NULL;
 
        if (NULL == (h = calloc(1, sizeof(struct html))))
                return(NULL);
@@ -100,8 +102,6 @@ html_alloc(char *outopts)
                return(NULL);
        }
 
-       h->base_man = "%N.%S.html";
-
        while (outopts && *outopts)
                switch (getsubopt(&outopts, toks, &v)) {
                case (0):
@@ -110,6 +110,9 @@ html_alloc(char *outopts)
                case (1):
                        h->base_man = v;
                        break;
+               case (2):
+                       h->base_includes = v;
+                       break;
                default:
                        break;
                }
diff --git a/html.h b/html.h
index 555aac271e823cfc1343cbb5f8ab8ab2605bc3bb..6d7faa35feacd366b97879f8e1774d0807d3436b 100644 (file)
--- a/html.h
+++ b/html.h
@@ -1,4 +1,4 @@
-/*     $Id: html.h,v 1.8 2009/10/03 15:08:09 kristaps Exp $ */
+/*     $Id: html.h,v 1.9 2009/10/03 15:26:26 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -56,6 +56,7 @@ enum  htmlattr {
        ATTR_STYLE,
        ATTR_WIDTH,
        ATTR_VALIGN,
+       ATTR_TARGET,
        ATTR_MAX
 };
 
@@ -88,6 +89,7 @@ struct        html {
        void             *symtab;
        char             *base;
        char             *base_man;
+       char             *base_includes;
        char             *style;
        char              buf[BUFSIZ];
        size_t            buflen;
index b91d086e29e8595b019359337ed06fd678233f38..c81018fc4286a84df8ed035e4a1f0fb3b940e7fa 100644 (file)
--- a/mandoc.1
+++ b/mandoc.1
@@ -1,4 +1,4 @@
-.\"    $Id: mandoc.1,v 1.39 2009/10/03 15:08:09 kristaps Exp $
+.\"    $Id: mandoc.1,v 1.40 2009/10/03 15:26:26 kristaps Exp $
 .\"
 .\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
 .\"
@@ -260,6 +260,17 @@ The file
 .Ar style.css
 is used for an external style-sheet.  This must be a valid absolute or
 relative URI.
+.It Fl o Ns Ar includes=fmt
+The string
+.Ar fmt ,
+for example, 
+.Ar ../src/%I.html ,
+is used as a template for linked header files (usually via the
+.Sq \&In
+macro).  Instances of
+.Sq %I
+are replaced with the include filename.  The default is not to present a
+hyperlink.
 .It Fl o Ns Ar man=fmt
 The string
 .Ar fmt ,
@@ -267,8 +278,13 @@ for example,
 .Ar ../html%S/%N.%S.html ,
 is used as a template for linked manuals (usually via the
 .Sq \&Xr
-macro).  The default is
-.Ar %N.%S.html .
+macro).  Instances of
+.Sq %N
+and
+.Sq %S
+are replaced with the linked manual's name and section, respectively.
+If no section is included, section 1 is assumed.  The default is not to
+present a hyperlink.
 .El
 .
 .Sh EXAMPLES
index 7b254bf823469f70a6b89f57f765830b37d9bd20..5fd7f91977cb87caa2986ad38efce4f809068de1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_html.c,v 1.16 2009/10/03 15:08:09 kristaps Exp $ */
+/*     $Id: mdoc_html.c,v 1.17 2009/10/03 15:26:26 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -56,6 +56,7 @@ static        int               a2list(const struct mdoc_node *);
 
 static void              buffmt_man(struct html *, 
                                const char *, const char *);
+static void              buffmt_includes(struct html *, const char *);
 static void              buffmt(struct html *, const char *, ...);
 static void              bufcat(struct html *, const char *);
 static void              bufncat(struct html *, const char *, size_t);
@@ -325,6 +326,29 @@ bufncat(struct html *h, const char *p, size_t sz)
 }
 
 
+static void
+buffmt_includes(struct html *h, const char *name)
+{
+       const char      *p, *pp;
+
+       pp = h->base_includes;
+       while ((p = strchr(pp, '%'))) {
+               bufncat(h, pp, p - pp);
+               switch (*(p + 1)) {
+               case('I'):
+                       bufcat(h, name);
+                       break;
+               default:
+                       bufncat(h, p, 2);
+                       break;
+               }
+               pp = p + 2;
+       }
+       if (pp)
+               bufcat(h, pp);
+}
+
+
 static void
 buffmt_man(struct html *h, 
                const char *name, const char *sec)
@@ -332,9 +356,6 @@ buffmt_man(struct html *h,
        const char      *p, *pp;
 
        pp = h->base_man;
-
-       /* FIXME: URL-encode contents. */
-
        while ((p = strchr(pp, '%'))) {
                bufncat(h, pp, p - pp);
                switch (*(p + 1)) {
@@ -829,16 +850,20 @@ mdoc_xr_pre(MDOC_ARGS)
 {
        struct htmlpair          tag[2];
        const struct mdoc_node  *nn;
+       int                      i;
 
-       buffmt_man(h, n->child->string, 
-                       n->child->next ? 
-                       n->child->next->string : NULL);
+       i = 0;
+       tag[i].key = ATTR_CLASS;
+       tag[i++].val = "link-man";
+
+       if (h->base_man) {
+               buffmt_man(h, n->child->string, n->child->next ? 
+                               n->child->next->string : NULL);
+               tag[i].key = ATTR_HREF;
+               tag[i++].val = h->buf;
+       }
 
-       tag[0].key = ATTR_CLASS;
-       tag[0].val = "link-man";
-       tag[1].key = ATTR_HREF;
-       tag[1].val = h->buf;
-       print_otag(h, TAG_A, 2, tag);
+       print_otag(h, TAG_A, i, tag);
 
        nn = n->child;
        print_text(h, nn->string);
@@ -1350,7 +1375,7 @@ mdoc_d1_pre(MDOC_ARGS)
 static int
 mdoc_sx_pre(MDOC_ARGS)
 {
-       struct htmlpair          tag[2];
+       struct htmlpair          tag[3];
        const struct mdoc_node  *nn;
 
        bufcat(h, "#");
@@ -1364,8 +1389,10 @@ mdoc_sx_pre(MDOC_ARGS)
        tag[0].val = h->buf;
        tag[1].key = ATTR_CLASS;
        tag[1].val = "link-sec";
+       tag[2].key = ATTR_TARGET;
+       tag[2].val = "_self";
 
-       print_otag(h, TAG_A, 2, tag);
+       print_otag(h, TAG_A, 3, tag);
        return(1);
 }
 
@@ -1896,21 +1923,23 @@ static int
 mdoc_in_pre(MDOC_ARGS)
 {
        const struct mdoc_node  *nn;
-       struct htmlpair          tag;
+       struct htmlpair          tag[2];
+       struct tag              *t;
+       int                      i;
 
        if (SEC_SYNOPSIS == n->sec) {
                if (n->next && MDOC_In != n->next->tok) {
-                       tag.key = ATTR_STYLE;
-                       tag.val = "margin-bottom: 1em;";
-                       print_otag(h, TAG_DIV, 1, &tag);
+                       tag[0].key = ATTR_STYLE;
+                       tag[0].val = "margin-bottom: 1em;";
+                       print_otag(h, TAG_DIV, 1, tag);
                } else
                        print_otag(h, TAG_DIV, 0, NULL);
        }
 
-       tag.key = ATTR_CLASS;
-       tag.val = "includes";
+       tag[0].key = ATTR_CLASS;
+       tag[0].val = "includes";
 
-       print_otag(h, TAG_SPAN, 1, &tag);
+       print_otag(h, TAG_SPAN, 1, tag);
 
        if (SEC_SYNOPSIS == n->sec)
                print_text(h, "#include");
@@ -1920,8 +1949,20 @@ mdoc_in_pre(MDOC_ARGS)
 
        /* XXX -- see warning in termp_in_post(). */
 
-       for (nn = n->child; nn; nn = nn->next)
+       for (nn = n->child; nn; nn = nn->next) {
+               assert(MDOC_TEXT == nn->type);
+               i = 0;
+               tag[i].key = ATTR_CLASS;
+               tag[i++].val = "link-includes";
+               if (h->base_includes) {
+                       buffmt_includes(h, nn->string);
+                       tag[i].key = ATTR_HREF;
+                       tag[i++].val = h->buf;
+               }
+               t = print_otag(h, TAG_A, i, tag);
                print_mdoc_node(m, nn, h);
+               print_tagq(h, t);
+       }
 
        h->flags |= HTML_NOSPACE;
        print_text(h, ">");