]> git.cameronkatri.com Git - mandoc.git/commitdiff
Port ctags-style, less(1) :t internal searching from terminal output
authorIngo Schwarze <schwarze@openbsd.org>
Mon, 13 Mar 2017 20:22:18 +0000 (20:22 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Mon, 13 Mar 2017 20:22:18 +0000 (20:22 +0000)
to HTML output.  For certain macros appearing at the beginning of .It
heads, write HTML id="..." attributes such that deep linking works.
Write HTML <a> attributes such that you can easily copy out link
targets with the mouse.  Try: http://man.openbsd.org/vmctl.8#create

Feature suggested by <guettliml at Thomas dash Guettler dot de>,
some details of the design and implementation by me.

mandoc.css
mdoc_html.c

index bc4d98281a8df3c4ea912ffcfe9d3fb41aef6b13..0dab6e8874aa5d1e9a8a4fd2dccf6913a1f8922c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mandoc.css,v 1.17 2017/02/05 21:00:43 schwarze Exp $ */
+/* $Id: mandoc.css,v 1.18 2017/03/13 20:22:18 schwarze Exp $ */
 /*
  * Standard style sheet for mandoc(1) -Thtml and man.cgi(8).
  */
@@ -14,6 +14,11 @@ ul, ol, dl { margin-top: 0em;
                margin-bottom: 0em; }
 li, dt {       margin-top: 1em; }
 
+a.selflink {   border-bottom: thin dotted;
+               color: inherit;
+               font: inherit;
+               text-decoration: inherit; }
+
 /* Search form and search results. */
 
 fieldset {     border: thin solid silver;
index 6d0d89bf50664bfc2c17a0cd5c3d3ed7d8de602e..07583538371fe3d84d47e37c794d98691242621a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_html.c,v 1.274 2017/03/13 19:01:38 schwarze Exp $ */
+/*     $Id: mdoc_html.c,v 1.275 2017/03/13 20:22:18 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -48,6 +48,7 @@ struct        htmlmdoc {
        void            (*post)(MDOC_ARGS);
 };
 
+static char             *cond_id(const struct roff_node *);
 static char             *make_id(const struct roff_node *);
 static void              print_mdoc_head(MDOC_ARGS);
 static void              print_mdoc_node(MDOC_ARGS);
@@ -498,6 +499,22 @@ make_id(const struct roff_node *n)
        return buf;
 }
 
+static char *
+cond_id(const struct roff_node *n)
+{
+       if (n->child != NULL &&
+           n->child->type == ROFFT_TEXT &&
+           (n->prev == NULL ||
+            (n->prev->type == ROFFT_TEXT &&
+             strcmp(n->prev->string, "|") == 0)) &&
+           (n->parent->tok == MDOC_It ||
+            (n->parent->tok == MDOC_Xo &&
+             n->parent->parent->prev == NULL &&
+             n->parent->parent->parent->tok == MDOC_It)))
+               return make_id(n);
+       return NULL;
+}
+
 static int
 mdoc_sh_pre(MDOC_ARGS)
 {
@@ -507,6 +524,7 @@ mdoc_sh_pre(MDOC_ARGS)
        case ROFFT_HEAD:
                id = make_id(n);
                print_otag(h, TAG_H1, "cTi", "Sh", id);
+               print_otag(h, TAG_A, "chR", "selflink", id);
                free(id);
                break;
        case ROFFT_BODY:
@@ -529,6 +547,7 @@ mdoc_ss_pre(MDOC_ARGS)
 
        id = make_id(n);
        print_otag(h, TAG_H2, "cTi", "Ss", id);
+       print_otag(h, TAG_A, "chR", "selflink", id);
        free(id);
        return 1;
 }
@@ -536,9 +555,14 @@ mdoc_ss_pre(MDOC_ARGS)
 static int
 mdoc_fl_pre(MDOC_ARGS)
 {
-       print_otag(h, TAG_B, "cT", "Fl");
-       print_text(h, "\\-");
+       char    *id;
+
+       if ((id = cond_id(n)) != NULL)
+               print_otag(h, TAG_A, "chR", "selflink", id);
+       print_otag(h, TAG_B, "cTi", "Fl", id);
+       free(id);
 
+       print_text(h, "\\-");
        if (!(n->child == NULL &&
            (n->next == NULL ||
             n->next->type == ROFFT_TEXT ||
@@ -551,7 +575,12 @@ mdoc_fl_pre(MDOC_ARGS)
 static int
 mdoc_cm_pre(MDOC_ARGS)
 {
-       print_otag(h, TAG_B, "cT", "Cm");
+       char    *id;
+
+       if ((id = cond_id(n)) != NULL)
+               print_otag(h, TAG_A, "chR", "selflink", id);
+       print_otag(h, TAG_B, "cTi", "Cm", id);
+       free(id);
        return 1;
 }
 
@@ -1068,21 +1097,42 @@ mdoc_cd_pre(MDOC_ARGS)
 static int
 mdoc_dv_pre(MDOC_ARGS)
 {
-       print_otag(h, TAG_CODE, "cT", "Dv");
+       char    *id;
+
+       if ((id = cond_id(n)) != NULL)
+               print_otag(h, TAG_A, "chR", "selflink", id);
+       print_otag(h, TAG_CODE, "cTi", "Dv", id);
+       free(id);
        return 1;
 }
 
 static int
 mdoc_ev_pre(MDOC_ARGS)
 {
-       print_otag(h, TAG_CODE, "cT", "Ev");
+       char    *id;
+
+       if ((id = cond_id(n)) != NULL)
+               print_otag(h, TAG_A, "chR", "selflink", id);
+       print_otag(h, TAG_CODE, "cTi", "Ev", id);
+       free(id);
        return 1;
 }
 
 static int
 mdoc_er_pre(MDOC_ARGS)
 {
-       print_otag(h, TAG_CODE, "cT", "Er");
+       char    *id;
+
+       id = n->sec == SEC_ERRORS &&
+           (n->parent->tok == MDOC_It ||
+            (n->parent->tok == MDOC_Bq &&
+             n->parent->parent->parent->tok == MDOC_It)) ?
+           make_id(n) : NULL;
+
+       if (id != NULL)
+               print_otag(h, TAG_A, "chR", "selflink", id);
+       print_otag(h, TAG_CODE, "cTi", "Er", id);
+       free(id);
        return 1;
 }
 
@@ -1436,7 +1486,12 @@ mdoc_in_pre(MDOC_ARGS)
 static int
 mdoc_ic_pre(MDOC_ARGS)
 {
-       print_otag(h, TAG_B, "cT", "Ic");
+       char    *id;
+
+       if ((id = cond_id(n)) != NULL)
+               print_otag(h, TAG_A, "chR", "selflink", id);
+       print_otag(h, TAG_B, "cTi", "Ic", id);
+       free(id);
        return 1;
 }
 
@@ -1488,7 +1543,12 @@ mdoc_bf_pre(MDOC_ARGS)
 static int
 mdoc_ms_pre(MDOC_ARGS)
 {
-       print_otag(h, TAG_B, "cT", "Ms");
+       char *id;
+
+       if ((id = cond_id(n)) != NULL)
+               print_otag(h, TAG_A, "chR", "selflink", id);
+       print_otag(h, TAG_B, "cTi", "Ms", id);
+       free(id);
        return 1;
 }
 
@@ -1524,14 +1584,24 @@ mdoc_rs_pre(MDOC_ARGS)
 static int
 mdoc_no_pre(MDOC_ARGS)
 {
-       print_otag(h, TAG_SPAN, "c", "No");
+       char *id;
+
+       if ((id = cond_id(n)) != NULL)
+               print_otag(h, TAG_A, "chR", "selflink", id);
+       print_otag(h, TAG_SPAN, "ci", "No", id);
+       free(id);
        return 1;
 }
 
 static int
 mdoc_li_pre(MDOC_ARGS)
 {
-       print_otag(h, TAG_CODE, "c", "Li");
+       char    *id;
+
+       if ((id = cond_id(n)) != NULL)
+               print_otag(h, TAG_A, "chR", "selflink", id);
+       print_otag(h, TAG_CODE, "ci", "Li", id);
+       free(id);
        return 1;
 }