Re: Valid HTML/XHTML output for psql - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: Valid HTML/XHTML output for psql
Date
Msg-id 200306120752.h5C7qSD06244@candle.pha.pa.us
Whole thread Raw
In response to Valid HTML/XHTML output for psql  ("Greg Sabino Mullane" <greg@turnstep.com>)
List pgsql-patches
Patch applied.  Thanks.

---------------------------------------------------------------------------


Greg Sabino Mullane wrote:
[ There is text before PGP section. ]
>
[ PGP not available, raw data follows ]
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> NotDashEscaped: You need GnuPG to verify this message
>
>
> 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
> PGP Key: 0x14964AC8 200306011737
>
>
>
>
>
> Index: common.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/common.c,v
> retrieving revision 1.62
> diff -c -r1.62 common.c
> *** common.c    25 Mar 2003 02:44:36 -0000    1.62
> --- common.c    1 Jun 2003 20:34:41 -0000
> ***************
> *** 525,531 ****
>                       success = true;
>                       sprintf(buf, "%u", (unsigned int) PQoidValue(results));
>                       if (!QUIET())
> !                         fprintf(pset.queryFout, "%s\n", PQcmdStatus(results));
>                       SetVariable(pset.vars, "LASTOID", buf);
>                       break;
>                   }
> --- 525,542 ----
>                       success = true;
>                       sprintf(buf, "%u", (unsigned int) PQoidValue(results));
>                       if (!QUIET())
> !                         {
> !                             if (pset.popt.topt.format == PRINT_HTML)
> !                             {
> !                                 fputs("<p>", pset.queryFout);
> !                                 html_escaped_print(PQcmdStatus(results), pset.queryFout);
> !                                 fputs("</p>\n", pset.queryFout);
> !                             }
> !                             else
> !                             {
> !                                 fprintf(pset.queryFout, "%s\n", PQcmdStatus(results));
> !                             }
> !                         }
>                       SetVariable(pset.vars, "LASTOID", buf);
>                       break;
>                   }
> Index: print.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.c,v
> retrieving revision 1.37
> diff -c -r1.37 print.c
> *** print.c    4 Apr 2003 15:48:38 -0000    1.37
> --- print.c    1 Jun 2003 20:34:42 -0000
> ***************
> *** 577,583 ****
>   /**********************/
>
>
> ! static void
>   html_escaped_print(const char *in, FILE *fout)
>   {
>       const char *p;
> --- 577,583 ----
>   /**********************/
>
>
> ! void
>   html_escaped_print(const char *in, FILE *fout)
>   {
>       const char *p;
> ***************
> *** 595,601 ****
>                   fputs(">", fout);
>                   break;
>               case '\n':
> !                 fputs("<br>", fout);
>                   break;
>               default:
>                   fputc(*p, fout);
> --- 595,607 ----
>                   fputs(">", fout);
>                   break;
>               case '\n':
> !                 fputs("<br />\n", fout);
> !                 break;
> !             case '"':
> !                 fputs(""", fout);
> !                 break;
> !             case '\'':
> !                 fputs("'", fout);
>                   break;
>               default:
>                   fputc(*p, fout);
> ***************
> *** 615,621 ****
>       unsigned int i;
>       const char *const * ptr;
>
> !     fprintf(fout, "<table border=%d", opt_border);
>       if (opt_table_attr)
>           fprintf(fout, " %s", opt_table_attr);
>       fputs(">\n", fout);
> --- 621,627 ----
>       unsigned int i;
>       const char *const * ptr;
>
> !     fprintf(fout, "<table border=\"%d\"", opt_border);
>       if (opt_table_attr)
>           fprintf(fout, " %s", opt_table_attr);
>       fputs(">\n", fout);
> ***************
> *** 636,642 ****
>           col_count++;
>           if (!opt_barebones)
>           {
> !             fputs("    <th align=center>", fout);
>               html_escaped_print(*ptr, fout);
>               fputs("</th>\n", fout);
>           }
> --- 642,648 ----
>           col_count++;
>           if (!opt_barebones)
>           {
> !             fputs("    <th align=\"center\">", fout);
>               html_escaped_print(*ptr, fout);
>               fputs("</th>\n", fout);
>           }
> ***************
> *** 648,659 ****
>       for (i = 0, ptr = cells; *ptr; i++, ptr++)
>       {
>           if (i % col_count == 0)
> !             fputs("  <tr valign=top>\n", fout);
>
> !         fprintf(fout, "    <td align=%s>", 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("</td>\n", fout);
> --- 654,664 ----
>       for (i = 0, ptr = cells; *ptr; i++, ptr++)
>       {
>           if (i % col_count == 0)
> !             fputs("  <tr valign=\"top\">\n", fout);
>
> !         fprintf(fout, "    <td align=\"%s\">", 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("</td>\n", fout);
> ***************
> *** 666,678 ****
>
>       /* print footers */
>
> !     if (footers && !opt_barebones)
>           for (ptr = footers; *ptr; ptr++)
>           {
>               html_escaped_print(*ptr, fout);
> !             fputs("<br>\n", fout);
>           }
> !
>       fputc('\n', fout);
>   }
>
> --- 671,686 ----
>
>       /* print footers */
>
> !     if (!opt_barebones && footers && *footers)
> !     {
> !         fputs("<p>", fout);
>           for (ptr = footers; *ptr; ptr++)
>           {
>               html_escaped_print(*ptr, fout);
> !             fputs("<br />\n", fout);
>           }
> !         fputs("</p>", fout);
> !     }
>       fputc('\n', fout);
>   }
>
> ***************
> *** 690,696 ****
>       unsigned int record = 1;
>       const char *const * ptr;
>
> !     fprintf(fout, "<table border=%d", opt_border);
>       if (opt_table_attr)
>           fprintf(fout, " %s", opt_table_attr);
>       fputs(">\n", fout);
> --- 698,704 ----
>       unsigned int record = 1;
>       const char *const * ptr;
>
> !     fprintf(fout, "<table border=\"%d\"", opt_border);
>       if (opt_table_attr)
>           fprintf(fout, " %s", opt_table_attr);
>       fputs(">\n", fout);
> ***************
> *** 713,731 ****
>           if (i % col_count == 0)
>           {
>               if (!opt_barebones)
> !                 fprintf(fout, "\n  <tr><td colspan=2 align=center>Record %d</td></tr>\n", record++);
>               else
> !                 fputs("\n  <tr><td colspan=2> </td></tr>\n", fout);
>           }
> !         fputs("  <tr valign=top>\n"
>                 "    <th>", fout);
>           html_escaped_print(headers[i % col_count], fout);
>           fputs("</th>\n", fout);
>
> !         fprintf(fout, "    <td align=%s>", 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("</td>\n  </tr>\n", fout);
> --- 721,738 ----
>           if (i % col_count == 0)
>           {
>               if (!opt_barebones)
> !                 fprintf(fout, "\n  <tr><td colspan=\"2\" align=\"center\">Record %d</td></tr>\n", record++);
>               else
> !                 fputs("\n  <tr><td colspan=\"2\"> </td></tr>\n", fout);
>           }
> !         fputs("  <tr valign=\"top\">\n"
>                 "    <th>", fout);
>           html_escaped_print(headers[i % col_count], fout);
>           fputs("</th>\n", fout);
>
> !         fprintf(fout, "    <td align=\"%s\">", 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("</td>\n  </tr>\n", fout);
> ***************
> *** 734,746 ****
>       fputs("</table>\n", fout);
>
>       /* print footers */
> !     if (footers && !opt_barebones)
>           for (ptr = footers; *ptr; ptr++)
>           {
>               html_escaped_print(*ptr, fout);
> !             fputs("<br>\n", fout);
>           }
> !
>       fputc('\n', fout);
>   }
>
> --- 741,756 ----
>       fputs("</table>\n", fout);
>
>       /* print footers */
> !     if (!opt_barebones && footers && *footers)
> !     {
> !         fputs("<p>", fout);
>           for (ptr = footers; *ptr; ptr++)
>           {
>               html_escaped_print(*ptr, fout);
> !             fputs("<br />\n", fout);
>           }
> !         fputs("</p>", fout);
> !     }
>       fputc('\n', fout);
>   }
>
> ***************
> *** 1114,1119 ****
> --- 1124,1130 ----
>       char      **footers;
>       char       *align;
>       int            i;
> +
>
>       /* extract headers */
>
> Index: print.h
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/bin/psql/print.h,v
> retrieving revision 1.16
> diff -c -r1.16 print.h
> *** print.h    18 Mar 2003 22:15:44 -0000    1.16
> --- print.h    1 Jun 2003 20:34:43 -0000
> ***************
> *** 13,18 ****
> --- 13,19 ----
>
>   extern FILE *PageOutput(int lines, unsigned short int pager);
>
> + extern void html_escaped_print(const char *in, FILE *fout);
>
>   enum printFormat
>   {
>
>
> -----BEGIN PGP SIGNATURE-----
> Comment: http://www.turnstep.com/pgp.html
>
> iD8DBQE+2nNjvJuQZxSWSsgRAiuWAKCnpa1SzCe6A8i55EXBAIlS0KnspQCdGiWK
> H3bbC9FnvDMWQxYOi+vMRGY=
> =sLzN
> -----END PGP SIGNATURE-----
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>
[ Decrypting message... End of raw data. ]

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: ALTER SEQUENCE updates
Next
From: Bruce Momjian
Date:
Subject: Re: libpq.dll (Win32) for rel. 7.3.2 missing some exports