@@ -1878,6 +1878,227 @@ print_html_vertical(const printTableContent *cont, FILE *fout)
18781878}
18791879
18801880
1881+ /*************************/
1882+ /* ASCIIDOC */
1883+ /*************************/
1884+
1885+ static void
1886+ asciidoc_escaped_print (const char * in , FILE * fout )
1887+ {
1888+ const char * p ;
1889+ for (p = in ; * p ; p ++ )
1890+ {
1891+ switch (* p )
1892+ {
1893+ case '|' :
1894+ fputs ("\\|" , fout );
1895+ break ;
1896+ default :
1897+ fputc (* p , fout );
1898+ }
1899+ }
1900+ }
1901+
1902+ static void
1903+ print_asciidoc_text (const printTableContent * cont , FILE * fout )
1904+ {
1905+ bool opt_tuples_only = cont -> opt -> tuples_only ;
1906+ unsigned short opt_border = cont -> opt -> border ;
1907+ unsigned int i ;
1908+ const char * const * ptr ;
1909+
1910+ if (cancel_pressed )
1911+ return ;
1912+
1913+ if (cont -> opt -> start_table )
1914+ {
1915+ /* print table in new paragraph - enforce preliminary new line */
1916+ fputs ("\n" , fout );
1917+
1918+ /* print title */
1919+ if (!opt_tuples_only && cont -> title )
1920+ {
1921+ fputs ("." , fout );
1922+ fputs (cont -> title , fout );
1923+ fputs ("\n" , fout );
1924+ }
1925+
1926+ /* print table [] header definition */
1927+ fprintf (fout , "[%scols=\"" , !opt_tuples_only ? "options=\"header\"," : "" );
1928+ for (i = 0 ; i < cont -> ncolumns ; i ++ )
1929+ {
1930+ if (i != 0 )
1931+ fputs ("," , fout );
1932+ fprintf (fout , "%s" , cont -> aligns [(i ) % cont -> ncolumns ] == 'r' ? ">l" : "<l" );
1933+ }
1934+ fputs ("\"" , fout );
1935+ switch (opt_border )
1936+ {
1937+ case 0 :
1938+ fputs (",frame=\"none\",grid=\"none\"" , fout );
1939+ break ;
1940+ case 1 :
1941+ fputs (",frame=\"none\"" , fout );
1942+ break ;
1943+ case 2 :
1944+ fputs (",frame=\"all\",grid=\"all\"" , fout );
1945+ break ;
1946+ }
1947+ fputs ("]\n" , fout );
1948+ fputs ("|====\n" , fout );
1949+
1950+ /* print headers */
1951+ if (!opt_tuples_only )
1952+ {
1953+ for (ptr = cont -> headers ; * ptr ; ptr ++ )
1954+ {
1955+ if (ptr != cont -> headers )
1956+ fputs (" " , fout );
1957+ fputs ("^l|" , fout );
1958+ asciidoc_escaped_print (* ptr , fout );
1959+ }
1960+ fputs ("\n" , fout );
1961+ }
1962+ }
1963+
1964+ /* print cells */
1965+ for (i = 0 , ptr = cont -> cells ; * ptr ; i ++ , ptr ++ )
1966+ {
1967+ if (i % cont -> ncolumns == 0 )
1968+ {
1969+ if (cancel_pressed )
1970+ break ;
1971+ }
1972+
1973+ if (i % cont -> ncolumns != 0 )
1974+ fputs (" " , fout );
1975+ fputs ("|" , fout );
1976+
1977+ /* protect against needless spaces */
1978+ if ((* ptr )[strspn (* ptr , " \t" )] == '\0' )
1979+ {
1980+ if ((i + 1 ) % cont -> ncolumns != 0 )
1981+ fputs (" " , fout );
1982+ }
1983+ else
1984+ asciidoc_escaped_print (* ptr , fout );
1985+
1986+ if ((i + 1 ) % cont -> ncolumns == 0 )
1987+ fputs ("\n" , fout );
1988+ }
1989+
1990+ fputs ("|====\n" , fout );
1991+
1992+ if (cont -> opt -> stop_table )
1993+ {
1994+ printTableFooter * footers = footers_with_default (cont );
1995+
1996+ /* print footers */
1997+ if (!opt_tuples_only && footers != NULL && !cancel_pressed )
1998+ {
1999+ printTableFooter * f ;
2000+
2001+ fputs ("\n....\n" , fout );
2002+ for (f = footers ; f ; f = f -> next )
2003+ {
2004+ fputs (f -> data , fout );
2005+ fputs ("\n" , fout );
2006+ }
2007+ fputs ("....\n" , fout );
2008+ }
2009+ }
2010+ }
2011+
2012+ static void
2013+ print_asciidoc_vertical (const printTableContent * cont , FILE * fout )
2014+ {
2015+ bool opt_tuples_only = cont -> opt -> tuples_only ;
2016+ unsigned short opt_border = cont -> opt -> border ;
2017+ unsigned long record = cont -> opt -> prior_records + 1 ;
2018+ unsigned int i ;
2019+ const char * const * ptr ;
2020+
2021+ if (cancel_pressed )
2022+ return ;
2023+
2024+ if (cont -> opt -> start_table )
2025+ {
2026+ /* print table in new paragraph - enforce preliminary new line */
2027+ fputs ("\n" , fout );
2028+
2029+ /* print title */
2030+ if (!opt_tuples_only && cont -> title )
2031+ {
2032+ fputs ("." , fout );
2033+ fputs (cont -> title , fout );
2034+ fputs ("\n" , fout );
2035+ }
2036+
2037+ /* print table [] header definition */
2038+ fputs ("[cols=\"h,l\"" , fout );
2039+ switch (opt_border )
2040+ {
2041+ case 0 :
2042+ fputs (",frame=\"none\",grid=\"none\"" , fout );
2043+ break ;
2044+ case 1 :
2045+ fputs (",frame=\"none\"" , fout );
2046+ break ;
2047+ case 2 :
2048+ fputs (",frame=\"all\",grid=\"all\"" , fout );
2049+ break ;
2050+ }
2051+ fputs ("]\n" , fout );
2052+ fputs ("|====\n" , fout );
2053+ }
2054+
2055+ /* print records */
2056+ for (i = 0 , ptr = cont -> cells ; * ptr ; i ++ , ptr ++ )
2057+ {
2058+ if (i % cont -> ncolumns == 0 )
2059+ {
2060+ if (cancel_pressed )
2061+ break ;
2062+ if (!opt_tuples_only )
2063+ fprintf (fout ,
2064+ "2+^|Record %lu\n" ,
2065+ record ++ );
2066+ else
2067+ fputs ("2+|\n" , fout );
2068+ }
2069+
2070+ fputs ("<l|" , fout );
2071+ asciidoc_escaped_print (cont -> headers [i % cont -> ncolumns ], fout );
2072+
2073+ fprintf (fout , " %s|" , cont -> aligns [i % cont -> ncolumns ] == 'r' ? ">l" : "<l" );
2074+ /* is string only whitespace? */
2075+ if ((* ptr )[strspn (* ptr , " \t" )] == '\0' )
2076+ fputs (" " , fout );
2077+ else
2078+ asciidoc_escaped_print (* ptr , fout );
2079+ fputs ("\n" , fout );
2080+ }
2081+
2082+ fputs ("|====\n" , fout );
2083+
2084+ if (cont -> opt -> stop_table )
2085+ {
2086+ /* print footers */
2087+ if (!opt_tuples_only && cont -> footers != NULL && !cancel_pressed )
2088+ {
2089+ printTableFooter * f ;
2090+
2091+ fputs ("\n....\n" , fout );
2092+ for (f = cont -> footers ; f ; f = f -> next )
2093+ {
2094+ fputs (f -> data , fout );
2095+ fputs ("\n" , fout );
2096+ }
2097+ fputs ("....\n" , fout );
2098+ }
2099+ }
2100+ }
2101+
18812102/*************************/
18822103/* LaTeX */
18832104/*************************/
@@ -2872,6 +3093,12 @@ printTable(const printTableContent *cont, FILE *fout, FILE *flog)
28723093 else
28733094 print_html_text (cont , fout );
28743095 break ;
3096+ case PRINT_ASCIIDOC :
3097+ if (cont -> opt -> expanded == 1 )
3098+ print_asciidoc_vertical (cont , fout );
3099+ else
3100+ print_asciidoc_text (cont , fout );
3101+ break ;
28753102 case PRINT_LATEX :
28763103 if (cont -> opt -> expanded == 1 )
28773104 print_latex_vertical (cont , fout );
0 commit comments