From 27f3dea64833d68c1fa08c1e5d26176a579f69c8 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 11 Mar 2019 08:50:02 +0100 Subject: [PATCH] psql: Add documentation URL to \help output Add a link to the specific command's reference web page to the bottom of its \help output. Discussion: https://www.postgresql.org/message-id/flat/40179bd0-fa7d-4108-1991-a20ae9ad5667%402ndquadrant.com --- src/bin/psql/create_help.pl | 10 ++++++++-- src/bin/psql/help.c | 11 +++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl index 96cf3d37ef..d8e6671e68 100644 --- a/src/bin/psql/create_help.pl +++ b/src/bin/psql/create_help.pl @@ -64,6 +64,7 @@ struct _helpStruct { const char *cmd; /* the command name */ const char *help; /* the help associated with it */ + const char *docbook_id; /* DocBook XML id (for generating URL) */ void (*syntaxfunc)(PQExpBuffer); /* function that prints the syntax associated with it */ int nl_count; /* number of newlines in syntax (for pager) */ }; @@ -92,7 +93,7 @@ my %entries; foreach my $file (sort readdir DIR) { - my (@cmdnames, $cmddesc, $cmdsynopsis); + my ($cmdid, @cmdnames, $cmddesc, $cmdsynopsis); $file =~ /\.sgml$/ or next; open(my $fh, '<', "$docdir/$file") or next; @@ -104,6 +105,9 @@ foreach my $file (sort readdir DIR) m!\s*SQL - Language Statements\s*!i or next; + $filecontent =~ m!! + and $cmdid = $1; + # Collect multiple refnames LOOP: { @@ -116,7 +120,7 @@ foreach my $file (sort readdir DIR) $filecontent =~ m!\s*(.+?)\s*!is and $cmdsynopsis = $1; - if (@cmdnames && $cmddesc && $cmdsynopsis) + if (@cmdnames && $cmddesc && $cmdid && $cmdsynopsis) { s/\"/\\"/g foreach @cmdnames; @@ -144,6 +148,7 @@ foreach my $file (sort readdir DIR) foreach my $cmdname (@cmdnames) { $entries{$cmdname} = { + cmdid => $cmdid, cmddesc => $cmddesc, cmdsynopsis => $cmdsynopsis, params => \@params, @@ -186,6 +191,7 @@ foreach (sort keys %entries) $id =~ s/ /_/g; print $cfile_handle " { \"$_\", N_(\"$entries{$_}{cmddesc}\"), + \"$entries{$_}{cmdid}\", sql_help_$id, $entries{$_}{nl_count} }, diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 6bac9e47fd..6fc4ebab1e 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -623,16 +623,23 @@ helpSQL(const char *topic, unsigned short int pager) strcmp(topic, "*") == 0) { PQExpBufferData buffer; + char *url; initPQExpBuffer(&buffer); QL_HELP[i].syntaxfunc(&buffer); help_found = true; + url = psprintf("https://www.postgresql.org/docs/%s/%s.html", + strstr(PG_VERSION, "devel") ? "devel" : PG_MAJORVERSION, + QL_HELP[i].docbook_id); fprintf(output, _("Command: %s\n" "Description: %s\n" - "Syntax:\n%s\n\n"), + "Syntax:\n%s\n\n" + "URL: %s\n\n"), QL_HELP[i].cmd, _(QL_HELP[i].help), - buffer.data); + buffer.data, + url); + free(url); /* If we have an exact match, exit. Fixes \h SELECT */ if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0) break;