From ef2ba427171d59ad9af78af48c52fa24b2131589 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Thu, 12 Jun 2003 07:52:51 +0000 Subject: [PATCH] Attached is a patch that enhances the output of psql's HTML mode. The output now validates as HTML 4.01 Strict, XHTML 1.0 strict, and XHTML 1.1 (assuming you wrap it in a valid html/body document). It also wraps the output of PGRES_COMMAND_OK if the HTML tag is on, for full compliance: this is why html_escaped_print has to be externalized. Greg Sabino Mullane greg@turnstep.com --- src/bin/psql/common.c | 15 +++++++++-- src/bin/psql/print.c | 59 +++++++++++++++++++++++++------------------ src/bin/psql/print.h | 3 ++- 3 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index ba6e295448..3769f671d1 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.62 2003/03/25 02:44:36 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.63 2003/06/12 07:52:51 momjian Exp $ */ #include "postgres_fe.h" #include "common.h" @@ -525,7 +525,18 @@ PrintQueryResults(PGresult *results, success = true; sprintf(buf, "%u", (unsigned int) PQoidValue(results)); if (!QUIET()) - fprintf(pset.queryFout, "%s\n", PQcmdStatus(results)); + { + if (pset.popt.topt.format == PRINT_HTML) + { + fputs("

", pset.queryFout); + html_escaped_print(PQcmdStatus(results), pset.queryFout); + fputs("

\n", pset.queryFout); + } + else + { + fprintf(pset.queryFout, "%s\n", PQcmdStatus(results)); + } + } SetVariable(pset.vars, "LASTOID", buf); break; } diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c index 24c4614d1c..35d9aa0bc2 100644 --- a/src/bin/psql/print.c +++ b/src/bin/psql/print.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.37 2003/04/04 15:48:38 tgl Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.38 2003/06/12 07:52:51 momjian Exp $ */ #include "postgres_fe.h" #include "common.h" @@ -577,7 +577,7 @@ print_aligned_vertical(const char *title, const char *const * headers, /**********************/ -static void +void html_escaped_print(const char *in, FILE *fout) { const char *p; @@ -595,7 +595,13 @@ html_escaped_print(const char *in, FILE *fout) fputs(">", fout); break; case '\n': - fputs("
", fout); + fputs("
\n", fout); + break; + case '"': + fputs(""", fout); + break; + case '\'': + fputs("'", fout); break; default: fputc(*p, fout); @@ -615,7 +621,7 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border, unsigned int i; const char *const * ptr; - fprintf(fout, "\n", fout); @@ -636,7 +642,7 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border, col_count++; if (!opt_barebones) { - fputs(" \n", fout); } @@ -648,12 +654,11 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border, for (i = 0, ptr = cells; *ptr; i++, ptr++) { if (i % col_count == 0) - fputs(" \n", fout); + fputs(" \n", fout); - fprintf(fout, " \n", fout); @@ -666,13 +671,16 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border, /* print footers */ - if (footers && !opt_barebones) + if (!opt_barebones && footers && *footers) + { + fputs("

", fout); for (ptr = footers; *ptr; ptr++) { html_escaped_print(*ptr, fout); - fputs("
\n", fout); + fputs("
\n", fout); } - + fputs("

", fout); + } fputc('\n', fout); } @@ -690,7 +698,7 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border, unsigned int record = 1; const char *const * ptr; - fprintf(fout, "
", fout); + fputs(" ", fout); html_escaped_print(*ptr, fout); fputs("
", opt_align[(i) % col_count] == 'r' ? "right" : "left"); - if ((*ptr)[strspn(*ptr, " \t")] == '\0') /* is string only - * whitespace? */ - fputs(" ", fout); + fprintf(fout, " ", opt_align[(i) % col_count] == 'r' ? "right" : "left"); + if ((*ptr)[strspn(*ptr, " \t")] == '\0') /* is string only whitespace? */ + fputs("  ", fout); else html_escaped_print(*ptr, fout); fputs("
\n", fout); @@ -713,19 +721,18 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border, if (i % col_count == 0) { if (!opt_barebones) - fprintf(fout, "\n \n", record++); + fprintf(fout, "\n \n", record++); else - fputs("\n \n", fout); + fputs("\n \n", fout); } - fputs(" \n" + fputs(" \n" " \n", fout); - fprintf(fout, " \n \n", fout); @@ -734,13 +741,16 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border, fputs("
Record %d
Record %d
 
 
", fout); html_escaped_print(headers[i % col_count], fout); fputs("", opt_align[i % col_count] == 'r' ? "right" : "left"); - if ((*ptr)[strspn(*ptr, " \t")] == '\0') /* is string only - * whitespace? */ - fputs(" ", fout); + fprintf(fout, " ", opt_align[i % col_count] == 'r' ? "right" : "left"); + if ((*ptr)[strspn(*ptr, " \t")] == '\0') /* is string only whitespace? */ + fputs("  ", fout); else html_escaped_print(*ptr, fout); fputs("
\n", fout); /* print footers */ - if (footers && !opt_barebones) + if (!opt_barebones && footers && *footers) + { + fputs("

", fout); for (ptr = footers; *ptr; ptr++) { html_escaped_print(*ptr, fout); - fputs("
\n", fout); + fputs("
\n", fout); } - + fputs("

", fout); + } fputc('\n', fout); } @@ -1115,6 +1125,7 @@ printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout) char *align; int i; + /* extract headers */ nfields = PQnfields(result); diff --git a/src/bin/psql/print.h b/src/bin/psql/print.h index e0ce3401d3..a70e7858bb 100644 --- a/src/bin/psql/print.h +++ b/src/bin/psql/print.h @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/print.h,v 1.16 2003/03/18 22:15:44 petere Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/print.h,v 1.17 2003/06/12 07:52:51 momjian Exp $ */ #ifndef PRINT_H #define PRINT_H @@ -13,6 +13,7 @@ extern FILE *PageOutput(int lines, unsigned short int pager); +extern void html_escaped_print(const char *in, FILE *fout); enum printFormat {