Improve accessibility of man.cgi(8) in various respects,
authorschwarze <schwarze@openbsd.org>
Mon, 4 Jul 2022 16:20:09 +0000 (16:20 +0000)
committerschwarze <schwarze@openbsd.org>
Mon, 4 Jul 2022 16:20:09 +0000 (16:20 +0000)
in particular adding <header>, <main>, and <nav> elements
and role and aria-label attributes in several places.
Patch from Anna Vyalkova <cyber at sysrq dot in>,
minimally tweaked by me.

usr.bin/mandoc/cgi.c

index 71d0fa3..a23cdfc 100644 (file)
@@ -1,7 +1,8 @@
-/* $OpenBSD: cgi.c,v 1.115 2021/10/24 21:24:16 deraadt Exp $ */
+/* $OpenBSD: cgi.c,v 1.116 2022/07/04 16:20:09 schwarze Exp $ */
 /*
  * Copyright (c) 2014-2019, 2021 Ingo Schwarze <schwarze@usta.de>
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2022 Anna Vyalkova <cyber@sysrq.in>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -427,7 +428,8 @@ resp_searchform(const struct req *req, enum focus focus)
 {
        int              i;
 
-       printf("<form action=\"/%s\" method=\"get\" "
+       printf("<header>\n"
+              "<form role=\"search\" action=\"/%s\" method=\"get\" "
               "autocomplete=\"off\" autocapitalize=\"none\">\n"
               "  <fieldset>\n"
               "    <legend>Manual Page Search Parameters</legend>\n",
@@ -453,7 +455,7 @@ resp_searchform(const struct req *req, enum focus focus)
 
        /* Write section selector. */
 
-       puts("    <select name=\"sec\">");
+       puts("    <select name=\"sec\" aria-label=\"manual section\">");
        for (i = 0; i < sec_MAX; i++) {
                printf("      <option value=\"%s\"", sec_numbers[i]);
                if (NULL != req->q.sec &&
@@ -465,7 +467,7 @@ resp_searchform(const struct req *req, enum focus focus)
 
        /* Write architecture selector. */
 
-       printf( "    <select name=\"arch\">\n"
+       printf( "    <select name=\"arch\" aria-label=\"CPU architecture\">\n"
                "      <option value=\"default\"");
        if (NULL == req->q.arch)
                printf(" selected=\"selected\"");
@@ -495,7 +497,8 @@ resp_searchform(const struct req *req, enum focus focus)
        }
 
        puts("  </fieldset>\n"
-            "</form>");
+            "</form>\n"
+            "</header>");
 }
 
 static int
@@ -553,13 +556,17 @@ pg_index(const struct req *req)
 
        resp_begin_html(200, NULL, NULL);
        resp_searchform(req, FOCUS_QUERY);
-       printf("<p>\n"
+       printf("<main>\n"
+              "<p role=\"doc-notice\" aria-label=\"usage\">\n"
               "This web interface is documented in the\n"
-              "<a class=\"Xr\" href=\"/%s%sman.cgi.8\">man.cgi(8)</a>\n"
+              "<a class=\"Xr\" href=\"/%s%sman.cgi.8\""
+              " aria-label=\"man dot CGI, section 8\">man.cgi(8)</a>\n"
               "manual, and the\n"
-              "<a class=\"Xr\" href=\"/%s%sapropos.1\">apropos(1)</a>\n"
+              "<a class=\"Xr\" href=\"/%s%sapropos.1\""
+              " aria-label=\"apropos, section 1\">apropos(1)</a>\n"
               "manual explains the query syntax.\n"
-              "</p>\n",
+              "</p>\n"
+              "</main>\n",
               scriptname, *scriptname == '\0' ? "" : "/",
               scriptname, *scriptname == '\0' ? "" : "/");
        resp_end_html();
@@ -571,9 +578,11 @@ pg_noresult(const struct req *req, int code, const char *http_msg,
 {
        resp_begin_html(code, http_msg, NULL);
        resp_searchform(req, FOCUS_QUERY);
-       puts("<p>");
+       puts("<main>");
+       puts("<p role=\"doc-notice\" aria-label=\"no result\">");
        puts(user_msg);
        puts("</p>");
+       puts("</main>");
        resp_end_html();
 }
 
@@ -582,12 +591,14 @@ pg_error_badrequest(const char *msg)
 {
 
        resp_begin_html(400, "Bad Request", NULL);
-       puts("<h1>Bad Request</h1>\n"
-            "<p>\n");
+       puts("<main>\n"
+            "<h1>Bad Request</h1>\n"
+            "<p role=\"doc-notice\" aria-label=\"Bad Request\">");
        puts(msg);
        printf("Try again from the\n"
               "<a href=\"/%s\">main page</a>.\n"
-              "</p>", scriptname);
+              "</p>\n"
+              "</main>", scriptname);
        resp_end_html();
 }
 
@@ -595,7 +606,7 @@ static void
 pg_error_internal(void)
 {
        resp_begin_html(500, "Internal Server Error", NULL);
-       puts("<p>Internal Server Error</p>");
+       puts("<main><p role=\"doc-notice\">Internal Server Error</p></main>");
        resp_end_html();
 }
 
@@ -700,6 +711,7 @@ pg_searchres(const struct req *req, struct manpage *r, size_t sz)
            req->q.equal || sz == 1 ? FOCUS_NONE : FOCUS_QUERY);
 
        if (sz > 1) {
+               puts("<nav>");
                puts("<table class=\"results\">");
                for (i = 0; i < sz; i++) {
                        printf("  <tr>\n"
@@ -718,6 +730,7 @@ pg_searchres(const struct req *req, struct manpage *r, size_t sz)
                             "  </tr>");
                }
                puts("</table>");
+               puts("</nav>");
        }
 
        if (req->q.equal || sz == 1) {
@@ -739,7 +752,9 @@ resp_catman(const struct req *req, const char *file)
        int              italic, bold;
 
        if ((f = fopen(file, "r")) == NULL) {
-               puts("<p>You specified an invalid manual file.</p>");
+               puts("<p role=\"doc-notice\">\n"
+                    "  You specified an invalid manual file.\n"
+                    "</p>");
                return;
        }
 
@@ -876,7 +891,9 @@ resp_format(const struct req *req, const char *file)
        int              usepath;
 
        if (-1 == (fd = open(file, O_RDONLY))) {
-               puts("<p>You specified an invalid manual file.</p>");
+               puts("<p role=\"doc-notice\">\n"
+                    "  You specified an invalid manual file.\n"
+                    "</p>");
                return;
        }