* mdocml: Port ctags-style, less(1) :t internal searching from terminal
@ 2017-03-13 20:22 schwarze
0 siblings, 0 replies; only message in thread
From: schwarze @ 2017-03-13 20:22 UTC (permalink / raw)
To: source
Log Message:
-----------
Port ctags-style, less(1) :t internal searching from terminal output
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.
Modified Files:
--------------
mdocml:
mandoc.css
mdoc_html.c
Revision Data
-------------
Index: mdoc_html.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_html.c,v
retrieving revision 1.274
retrieving revision 1.275
diff -Lmdoc_html.c -Lmdoc_html.c -u -p -r1.274 -r1.275
--- mdoc_html.c
+++ mdoc_html.c
@@ -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;
}
Index: mandoc.css
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mandoc.css,v
retrieving revision 1.17
retrieving revision 1.18
diff -Lmandoc.css -Lmandoc.css -u -p -r1.17 -r1.18
--- mandoc.css
+++ mandoc.css
@@ -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;
--
To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2017-03-13 20:22 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-13 20:22 mdocml: Port ctags-style, less(1) :t internal searching from terminal schwarze
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).