From f88b6897fb2359e45d69b78cf233849c6e5552da Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Wed, 15 Mar 2017 13:18:53 +0000 Subject: Mention the manual page name and section in the HTML page . Based on a patch from <Anton dot Lindqvist at gmail dot com>, but simplified and also covering apropos(1) search results. --- cgi.c | 83 +++++++++++++++++++++++++++++++++++++-------------------------- man.cgi.3 | 11 ++++++--- 2 files changed, 57 insertions(+), 37 deletions(-) diff --git a/cgi.c b/cgi.c index 05a861d4..68bdf6e7 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -/* $Id: cgi.c,v 1.149 2017/03/15 10:17:29 schwarze Exp $ */ +/* $Id: cgi.c,v 1.150 2017/03/15 13:18:53 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze <schwarze@usta.de> @@ -81,7 +81,7 @@ static void pg_search(const struct req *); static void pg_searchres(const struct req *, struct manpage *, size_t); static void pg_show(struct req *, const char *); -static void resp_begin_html(int, const char *); +static void resp_begin_html(int, const char *, const char *); static void resp_begin_http(int, const char *); static void resp_catman(const struct req *, const char *); static void resp_copy(const char *); @@ -346,8 +346,9 @@ resp_copy(const char *filename) } static void -resp_begin_html(int code, const char *msg) +resp_begin_html(int code, const char *msg, const char *file) { + char *cp; resp_begin_http(code, msg); @@ -357,10 +358,20 @@ resp_begin_html(int code, const char *msg) " <meta charset=\"UTF-8\"/>\n" " <link rel=\"stylesheet\" href=\"%s/mandoc.css\"" " type=\"text/css\" media=\"all\">\n" - " <title>%s\n" + " ", + CSS_DIR); + if (file != NULL) { + if ((cp = strrchr(file, '/')) != NULL) + file = cp + 1; + if ((cp = strrchr(file, '.')) != NULL) { + printf("%.*s(%s) - ", (int)(cp - file), file, cp + 1); + } else + printf("%s - ", file); + } + printf("%s\n" "\n" "\n", - CSS_DIR, CUSTOMIZE_TITLE); + CUSTOMIZE_TITLE); resp_copy(MAN_DIR "/header.html"); } @@ -493,7 +504,7 @@ static void pg_index(const struct req *req) { - resp_begin_html(200, NULL); + resp_begin_html(200, NULL, NULL); resp_searchform(req, FOCUS_QUERY); printf("

\n" "This web interface is documented in the\n" @@ -510,7 +521,7 @@ pg_index(const struct req *req) static void pg_noresult(const struct req *req, const char *msg) { - resp_begin_html(200, NULL); + resp_begin_html(200, NULL, NULL); resp_searchform(req, FOCUS_QUERY); puts("

"); puts(msg); @@ -522,7 +533,7 @@ static void pg_error_badrequest(const char *msg) { - resp_begin_html(400, "Bad Request"); + resp_begin_html(400, "Bad Request", NULL); puts("

Bad Request

\n" "

\n"); puts(msg); @@ -535,7 +546,7 @@ pg_error_badrequest(const char *msg) static void pg_error_internal(void) { - resp_begin_html(500, "Internal Server Error"); + resp_begin_html(500, "Internal Server Error", NULL); puts("

Internal Server Error

"); resp_end_html(); } @@ -591,36 +602,13 @@ pg_searchres(const struct req *req, struct manpage *r, size_t sz) return; } - resp_begin_html(200, NULL); - resp_searchform(req, - req->q.equal || sz == 1 ? FOCUS_NONE : FOCUS_QUERY); - - if (sz > 1) { - puts(""); - for (i = 0; i < sz; i++) { - printf(" \n" - " \n" - " \n" - " "); - } - puts("
" - "", - scriptname, *scriptname == '\0' ? "" : "/", - req->q.manpath, r[i].file); - html_print(r[i].names); - printf(""); - html_print(r[i].output); - puts("
"); - } - /* * In man(1) mode, show one of the pages * even if more than one is found. */ + iuse = 0; if (req->q.equal || sz == 1) { - puts("
"); - iuse = 0; priouse = 20; archpriouse = 3; for (i = 0; i < sz; i++) { @@ -653,6 +641,33 @@ pg_searchres(const struct req *req, struct manpage *r, size_t sz) priouse = prio; iuse = i; } + resp_begin_html(200, NULL, r[iuse].file); + } else + resp_begin_html(200, NULL, NULL); + + resp_searchform(req, + req->q.equal || sz == 1 ? FOCUS_NONE : FOCUS_QUERY); + + if (sz > 1) { + puts(""); + for (i = 0; i < sz; i++) { + printf(" \n" + " \n" + " \n" + " "); + } + puts("
" + "", + scriptname, *scriptname == '\0' ? "" : "/", + req->q.manpath, r[i].file); + html_print(r[i].names); + printf(""); + html_print(r[i].output); + puts("
"); + } + + if (req->q.equal || sz == 1) { + puts("
"); resp_show(req, r[iuse].file); } @@ -904,7 +919,7 @@ pg_show(struct req *req, const char *fullpath) return; } - resp_begin_html(200, NULL); + resp_begin_html(200, NULL, file); resp_searchform(req, FOCUS_NONE); resp_show(req, file); resp_end_html(); diff --git a/man.cgi.3 b/man.cgi.3 index 472d4119..e83248cc 100644 --- a/man.cgi.3 +++ b/man.cgi.3 @@ -1,6 +1,6 @@ -.\" $Id: man.cgi.3,v 1.3 2017/03/15 10:17:29 schwarze Exp $ +.\" $Id: man.cgi.3,v 1.4 2017/03/15 13:18:53 schwarze Exp $ .\" -.\" Copyright (c) 2016 Ingo Schwarze +.\" Copyright (c) 2016, 2017 Ingo Schwarze .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -237,13 +237,18 @@ and are used. The highest level result generators are: .Bl -tag -width 1n -.It Ft void Fn resp_begin_html "int code" "const char *msg" +.It Ft void Fn resp_begin_html "int code" "const char *msg" "const char *file" This generator calls .Fn resp_begin_http to print the HTTP headers, then prints the HTML header up to the opening tag of the element, then copies the file .Pa header.html to the output, if it exists and is readable. +If +.Fa file +is not +.Dv NULL , +it is used for the element. .It Ft void Fn resp_searchform "const struct req *req" "enum focus focus" This generator prints a search form, filling it with data from the provided request object. -- cgit v1.2.3