Attached is a patch that enhances the output of psql's HTML mode.
authorBruce Momjian
Thu, 12 Jun 2003 07:52:51 +0000 (07:52 +0000)
committerBruce Momjian
Thu, 12 Jun 2003 07:52:51 +0000 (07:52 +0000)
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 [email protected]

src/bin/psql/common.c
src/bin/psql/print.c
src/bin/psql/print.h

index ba6e2954481c73e50b638b61b65ed3fff1b1f0ae..3769f671d168857c7dec310b6cc56c9765869bc6 100644 (file)
@@ -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;
                }
index 24c4614d1c4f99b4d8ecc22cddf6f6e0dccd0e1a..35d9aa0bc21906f66c91a07620c858e755b69abf 100644 (file)
@@ -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, "%d", opt_border);
+   fprintf(fout, "\"%d\"", opt_border);
    if (opt_table_attr)
        fprintf(fout, " %s", opt_table_attr);
    fputs(">\n", fout);
@@ -636,7 +642,7 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
        col_count++;
        if (!opt_barebones)
        {
-           fputs("    center>", fout);
+           fputs("    \"center\">", fout);
            html_escaped_print(*ptr, fout);
            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("  top>\n", fout);
+           fputs("  \"top\">\n", fout);
 
-       fprintf(fout, "    ", 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);
@@ -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, "%d", opt_border);
+   fprintf(fout, "\"%d\"", opt_border);
    if (opt_table_attr)
        fprintf(fout, " %s", opt_table_attr);
    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  2 align=center>Record %d\n", record++);
+               fprintf(fout, "\n  \"2\" align=\"center\">Record %d\n", record++);
            else
-               fputs("\n  2> \n", fout);
+               fputs("\n  \"2\"> \n", fout);
        }
-       fputs("  top>\n"
+       fputs("  \"top\">\n"
              "    ", fout);
        html_escaped_print(headers[i % col_count], fout);
        fputs("\n", fout);
 
-       fprintf(fout, "    ", 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  \n", fout);
@@ -734,13 +741,16 @@ const char *opt_align, bool opt_barebones, unsigned short int opt_border,
    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);
index e0ce3401d383b00bcb450ec2fb0533ab13e95069..a70e7858bbe741abb137968254ac81e82f185338 100644 (file)
@@ -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
 {