2015-12-19 6:55 GMT+01:00 Pavel Stehule <pavel.steh...@gmail.com>:

>
>
> 2015-12-18 21:21 GMT+01:00 Daniel Verite <dan...@manitou-mail.org>:
>
>>         Pavel Stehule wrote:
>>
>> > The symbol 'X' in two column mode should be centred - now it is aligned
>> to
>> > left, what is not nice
>>
>> Currently print.c does not support centered alignment, only left and
>> right.
>> Should we add it, it would have to work for all output formats
>> (except obviously for "unaligned"):
>> - aligned
>> - wrapped
>> - html
>> - latex
>> - latex-longtable
>> - troff-ms
>> - asciidoc
>>
>> Because of this, I believe that adding support for a 'c' alignment
>> might be a significant patch by itself, and that it should be considered
>> separately.
>>
>
> ok
>
>
>>
>> I agree that if it existed, the crosstabview command should use it
>> as you mention, but I'm not volunteering to implement it myself, at
>> least not in the short term.
>>
>
> I'll look how much work it is
>

attached patch allows align to center.

everywhere where left/right align was allowed, the center align is allowed

Regards

Pavel


>
> Regards
>
> Pavel
>
>
>>
>> Best regards,
>> --
>> Daniel Vérité
>> PostgreSQL-powered mailer: http://www.manitou-mail.org
>> Twitter: @DanielVerite
>>
>
>
diff --git a/src/bin/psql/crosstabview.c b/src/bin/psql/crosstabview.c
new file mode 100644
index 6d13b57..c9e11c2
*** a/src/bin/psql/crosstabview.c
--- b/src/bin/psql/crosstabview.c
*************** printCrosstab(const PGresult *results,
*** 203,209 ****
         * alignment is determined by PQftype(). Otherwise the contents are
         * made-up strings, so the alignment is 'l'
         */
!       if (PQnfields(results) == 3)
        {
                int colnum;                             /* column placed inside 
the grid */
                /*
--- 203,213 ----
         * alignment is determined by PQftype(). Otherwise the contents are
         * made-up strings, so the alignment is 'l'
         */
!       if (PQnfields(results) == 2)
!       {
!               col_align = 'c';
!       }
!       else if (PQnfields(results) == 3)
        {
                int colnum;                             /* column placed inside 
the grid */
                /*
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
new file mode 100644
index b2f8c2b..6e2cc6e
*** a/src/bin/psql/print.c
--- b/src/bin/psql/print.c
*************** print_aligned_text(const printTableConte
*** 1042,1059 ****
                                        {
                                                /* spaces first */
                                                fprintf(fout, "%*s", 
width_wrap[j] - chars_to_output, "");
-                                               fputnbytes(fout,
-                                                                (char *) 
(this_line->ptr + bytes_output[j]),
-                                                                  
bytes_to_output);
                                        }
!                                       else    /* Left aligned cell */
                                        {
!                                               /* spaces second */
!                                               fputnbytes(fout,
!                                                                (char *) 
(this_line->ptr + bytes_output[j]),
!                                                                  
bytes_to_output);
                                        }
  
                                        bytes_output[j] += bytes_to_output;
  
                                        /* Do we have more text to wrap? */
--- 1042,1059 ----
                                        {
                                                /* spaces first */
                                                fprintf(fout, "%*s", 
width_wrap[j] - chars_to_output, "");
                                        }
!                                       else if (cont->aligns[j] == 'c') /* 
Center aligned cell */
                                        {
!                                               /* spaces first */
!                                               fprintf(fout, "%*s",
!                                                        (width_wrap[j] - 
chars_to_output) / 2, "");
                                        }
  
+                                       fputnbytes(fout,
+                                                        (char *) 
(this_line->ptr + bytes_output[j]),
+                                                          bytes_to_output);
+ 
                                        bytes_output[j] += bytes_to_output;
  
                                        /* Do we have more text to wrap? */
*************** print_aligned_text(const printTableConte
*** 1083,1095 ****
                                 * If left-aligned, pad out remaining space if 
needed (not
                                 * last column, and/or wrap marks required).
                                 */
!                               if (cont->aligns[j] != 'r')             /* Left 
aligned cell */
                                {
!                                       if (finalspaces ||
!                                               wrap[j] == PRINT_LINE_WRAP_WRAP 
||
!                                               wrap[j] == 
PRINT_LINE_WRAP_NEWLINE)
                                                fprintf(fout, "%*s",
!                                                               width_wrap[j] - 
chars_to_output, "");
                                }
  
                                /* Print right-hand wrap or newline mark */
--- 1083,1104 ----
                                 * If left-aligned, pad out remaining space if 
needed (not
                                 * last column, and/or wrap marks required).
                                 */
!                               if (finalspaces ||
!                                       wrap[j] == PRINT_LINE_WRAP_WRAP ||
!                                       wrap[j] == PRINT_LINE_WRAP_NEWLINE)
                                {
!                                       if (cont->aligns[j] == 'c')
!                                       {
!                                               /* last spaces */
                                                fprintf(fout, "%*s",
!                                                                   
width_wrap[j] - chars_to_output 
!                                                                - 
((width_wrap[j] - chars_to_output) / 2 ), "");
!                                       }
!                                       else if (cont->aligns[j] == 'l')
!                                       {
!                                               /* last spaces */
!                                               fprintf(fout, "%*s", 
width_wrap[j] - chars_to_output, "");
!                                       }
                                }
  
                                /* Print right-hand wrap or newline mark */
*************** html_escaped_print(const char *in, FILE
*** 1778,1783 ****
--- 1787,1805 ----
        }
  }
  
+ /*
+  * Returns align value in html format
+  */
+ static const char *
+ format_html_align_attr(char align)
+ {
+       if (align == 'r')
+               return "right";
+       else if (align == 'c')
+               return "center";
+       else
+               return "left";
+ }
  
  static void
  print_html_text(const printTableContent *cont, FILE *fout)
*************** print_html_text(const printTableContent
*** 1830,1836 ****
                        fputs("  <tr valign=\"top\">\n", fout);
                }
  
!               fprintf(fout, "    <td align=\"%s\">", cont->aligns[(i) % 
cont->ncolumns] == 'r' ? "right" : "left");
                /* is string only whitespace? */
                if ((*ptr)[strspn(*ptr, " \t")] == '\0')
                        fputs("&nbsp; ", fout);
--- 1852,1860 ----
                        fputs("  <tr valign=\"top\">\n", fout);
                }
  
!               fprintf(fout, "    <td align=\"%s\">",
!                           format_html_align_attr(cont->aligns[(i) % 
cont->ncolumns]));
! 
                /* is string only whitespace? */
                if ((*ptr)[strspn(*ptr, " \t")] == '\0')
                        fputs("&nbsp; ", fout);
*************** print_html_vertical(const printTableCont
*** 1916,1922 ****
                html_escaped_print(cont->headers[i % cont->ncolumns], fout);
                fputs("</th>\n", fout);
  
!               fprintf(fout, "    <td align=\"%s\">", cont->aligns[i % 
cont->ncolumns] == 'r' ? "right" : "left");
                /* is string only whitespace? */
                if ((*ptr)[strspn(*ptr, " \t")] == '\0')
                        fputs("&nbsp; ", fout);
--- 1940,1950 ----
                html_escaped_print(cont->headers[i % cont->ncolumns], fout);
                fputs("</th>\n", fout);
  
! 
! 
!               fprintf(fout, "    <td align=\"%s\">", 
!                           format_html_align_attr(cont->aligns[i % 
cont->ncolumns]));
! 
                /* is string only whitespace? */
                if ((*ptr)[strspn(*ptr, " \t")] == '\0')
                        fputs("&nbsp; ", fout);
*************** asciidoc_escaped_print(const char *in, F
*** 1971,1976 ****
--- 1999,2015 ----
        }
  }
  
+ static const char *
+ format_asciidoc_align_attr(char align)
+ {
+       if (align == 'r')
+               return ">l";
+       else if (align == 'c')
+               return "^l";
+       else
+               return "<l";
+ }
+ 
  static void
  print_asciidoc_text(const printTableContent *cont, FILE *fout)
  {
*************** print_asciidoc_text(const printTableCont
*** 2001,2007 ****
                {
                        if (i != 0)
                                fputs(",", fout);
!                       fprintf(fout, "%s", cont->aligns[(i) % cont->ncolumns] 
== 'r' ? ">l" : "<l");
                }
                fputs("\"", fout);
                switch (opt_border)
--- 2040,2047 ----
                {
                        if (i != 0)
                                fputs(",", fout);
!                       fprintf(fout, "%s",
!                                   format_asciidoc_align_attr(cont->aligns[(i) 
% cont->ncolumns]));
                }
                fputs("\"", fout);
                switch (opt_border)
*************** print_asciidoc_vertical(const printTable
*** 2142,2148 ****
                fputs("<l|", fout);
                asciidoc_escaped_print(cont->headers[i % cont->ncolumns], fout);
  
!               fprintf(fout, " %s|", cont->aligns[i % cont->ncolumns] == 'r' ? 
">l" : "<l");
                /* is string only whitespace? */
                if ((*ptr)[strspn(*ptr, " \t")] == '\0')
                        fputs(" ", fout);
--- 2182,2190 ----
                fputs("<l|", fout);
                asciidoc_escaped_print(cont->headers[i % cont->ncolumns], fout);
  
!               fprintf(fout, " %s|",
!                                   format_asciidoc_align_attr(cont->aligns[(i) 
% cont->ncolumns]));
! 
                /* is string only whitespace? */
                if ((*ptr)[strspn(*ptr, " \t")] == '\0')
                        fputs(" ", fout);
*************** print_latex_longtable_text(const printTa
*** 2343,2349 ****
  
                for (i = 0; i < cont->ncolumns; i++)
                {
!                       /* longtable supports either a width (p) or an 
alignment (l/r) */
                        /* Are we left-justified and was a proportional width 
specified? */
                        if (*(cont->aligns + i) == 'l' && opt_table_attr)
                        {
--- 2385,2391 ----
  
                for (i = 0; i < cont->ncolumns; i++)
                {
!                       /* longtable supports either a width (p) or an 
alignment (l/c/r) */
                        /* Are we left-justified and was a proportional width 
specified? */
                        if (*(cont->aligns + i) == 'l' && opt_table_attr)
                        {
*************** printTableInit(printTableContent *const
*** 2950,2957 ****
   * If translate is true, the function will pass the header through gettext.
   * Otherwise, the header will not be translated.
   *
!  * align is either 'l' or 'r', and specifies the alignment for cells in this
!  * column.
   */
  void
  printTableAddHeader(printTableContent *const content, char *header,
--- 2992,2999 ----
   * If translate is true, the function will pass the header through gettext.
   * Otherwise, the header will not be translated.
   *
!  * align is either 'l' or 'c' or'r', and specifies the alignment for cells
!  * in this column.
   */
  void
  printTableAddHeader(printTableContent *const content, char *header,
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to