[tex4ht-commits] [SCM] tex4ht updated: r1261 - trunk/lit

Michal Hoftich INVALID.NOREPLY at gnu.org.ua
Fri Dec 9 17:06:10 CET 2022


Author: michal_h21
Date: 2022-12-09 16:06:10 +0000 (Fri, 09 Dec 2022)
New Revision: 1261

Modified:
   trunk/lit/ChangeLog
   trunk/lit/mktex4ht-cnf.tex
   trunk/lit/tex4ht-4ht.tex
   trunk/lit/tex4ht-html4.tex
Log:
Added support for the tabularray package

Modified: trunk/lit/ChangeLog
===================================================================
--- trunk/lit/ChangeLog	2022-12-04 17:01:50 UTC (rev 1260)
+++ trunk/lit/ChangeLog	2022-12-09 16:06:10 UTC (rev 1261)
@@ -1,3 +1,10 @@
+2022-12-09  Michal Hoftich  <michal.h21 at gmail.com>
+
+	* tex4ht-4ht.tex (tabularray.4ht),
+	* tex4ht-html4.tex (html4.4ht): added support for the Tabularray
+	package.
+	https://puszcza.gnu.org.ua/bugs/?584
+
 2022-12-04  Karl Berry  <karl at freefriends.org>
 
 	* tex4ht-4ht.tex (footnotebackref-hooks.4ht, glossaries.4ht):

Modified: trunk/lit/mktex4ht-cnf.tex
===================================================================
--- trunk/lit/mktex4ht-cnf.tex	2022-12-04 17:01:50 UTC (rev 1260)
+++ trunk/lit/mktex4ht-cnf.tex	2022-12-09 16:06:10 UTC (rev 1261)
@@ -51,6 +51,7 @@
 \AddFile{9}{tabu}
 \AddFile{7}{arydshln}
 \AddFile{9}{threeparttable}
+\AddFile{9}{tabularray}
 \AddFile{9}{mdwtab}
 \AddFile{9}{multirow}
 \AddFile{8}{theorem}

Modified: trunk/lit/tex4ht-4ht.tex
===================================================================
--- trunk/lit/tex4ht-4ht.tex	2022-12-04 17:01:50 UTC (rev 1260)
+++ trunk/lit/tex4ht-4ht.tex	2022-12-09 16:06:10 UTC (rev 1261)
@@ -10962,6 +10962,180 @@
 >>> \AddFile{9}{threeparttable}
 
 %%%%%%%%%%%%%%%%%%%%%%%%
+\Section{tabularray}
+%%%%%%%%%%%%%%%%%%%%%%%%
+
+\<tabularray.4ht\><<< 
+% tabularray.4ht (|version), generated from |jobname.tex 
+% Copyright 2022 TeX Users Group 
+|<TeX4ht license text|> 
+|<tabularray definitions|>
+|<tabularray table and rows|>
+|<tabularray lines|>
+|<tabularray cell|>
+\Hinput{tabularray} 
+\endinput
+>>> \AddFile{9}{tabularray}
+
+\<tabularray definitions\><<<
+\NewConfigure{tabularray}{8}
+\NewConfigure{tabularrayignoredcell}{2}
+\NewConfigure{tabularrayattributes}[1]{\concat:config\CellAttributes{#1\space}}
+\NewConfigure{tabularraystyles}[1]{\concat:config\CellStyle{#1}}
+\NewConfigure{tabularraycolumnwidth}{1}
+
+\ExplSyntaxOn
+\NewConfigure{tabularrayhalign}[2]{%
+  \cs_set:cpn{tabularray_halign:#1}{#2}
+}
+
+\NewConfigure{tabularrayvalign}[2]{%
+  \cs_set:cpn{tabularray_valign:#1}{#2}
+}
+\ExplSyntaxOff
+>>>
+
+Insert basic tags for table and rows
+
+\<tabularray table and rows\><<<
+\ExplSyntaxOn
+\long\def\:tempa#1#2#3#4{%
+  % insert <table>...</table>
+  \a:tabularray\o:__tblr_environ_code:nnnn:{#1}{#2}{#3}{#4}\b:tabularray
+}
+\HLet\__tblr_environ_code:nnnn\:tempa
+
+\long\def\:tempa#1{\xdef\HRow{\@arabic\c at rownum}\c:tabularray\o:__tblr_build_row:N:{#1}\d:tabularray}
+\HLet\__tblr_build_row:N\:tempa
+\ExplSyntaxOff
+>>>
+
+Tabularray uses hrules in many places, it is not practical to redefine all commands that contain them,
+se we disable underscores that are produced for rules using special.
+
+\<tabularray lines\><<<
+% disable rules
+\ht:special{t4ht at _}
+>>>
+
+We detect borders for each cell using these functions. They can be then set using CSS.
+
+Tabularray supports multiple rules between rows and cells, but these would be too difficult to support
+using CSS, so we don't try that.
+
+\<tabularray lines\><<<
+\ExplSyntaxOn
+% #1 row number, #2 column, #3 hline number (there can be multiple), #4 css property to be set
+\def\:tblr:hlinestyle#1#2#3#4{
+  % get line height
+  \tl_set:Nx \l__tblr_h_tl{ \__tblr_spec_item:ne { hline } { [#1](#3) / @hline-height } }
+  % get dash style
+  \def\@tblr at dash{} % remove "dash" word from the variable for correct CSS string
+  \tl_set:Nx \l__tblr_f_tl{\__tblr_spec_item:ne { hline } { [#1][#2](#3) / @dash }}
+  % create CSS only when a dash style is set 
+  \tl_if_empty:NF\l__tblr_f_tl{
+    \typeout{******** hline print:~#1,#2,#3,#4~ \__tblr_spec_item:ne { hline } { [#1][#2](#3) / @dash }}
+    % get hline color
+    \tl_set:Nx \l__tblr_g_tl { \__tblr_spec_item:ne { hline } { [#1][#2](#3) / fg } }
+    \def\:hlinecolor{\#000000}
+    % convert color to CSS value if color is set
+    \tl_if_empty:NF\l__tblr_g_tl{\get:xcolorcss{\l__tblr_g_tl}\:hlinecolor}
+    % \Configure{tabularraystyles} doesn't expand attributes, so we need to expand it here
+    % otherwise, we would get wrong color and hline style in the last row, because this macro is called twice here
+    \cs_set:cx{#4:}{#4:\dim_to_decimal_in_unit:nn{\l__tblr_h_tl*2}{1px}px~\l__tblr_f_tl\space~\:hlinecolor;}
+    \Configure{tabularraystyles}{\csname#4:\endcsname}
+  }
+}
+
+\def\:tblr:vlinestyle#1#2#3#4{
+  \tl_set:Nx \l__tblr_t_tl{ \__tblr_spec_item:ne { vline } { [#2](#3) / @vline-width } }
+  \def\@tblr at dash{} % remove "dash" word from the variable for correct CSS string
+  \tl_set:Nx \l__tblr_f_tl{\__tblr_spec_item:ne { vline } { [#1][#2](#3) / @dash }}
+  \tl_if_empty:NF\l__tblr_f_tl{
+    \tl_set:Nx \l__tblr_g_tl { \__tblr_spec_item:ne { vline } { [#1][#2](#3) / fg } }
+    \def\:hlinecolor{\#000000}
+    % convert color to CSS value if color is set
+    \tl_if_empty:NF\l__tblr_g_tl{\get:xcolorcss{\l__tblr_g_tl}\:hlinecolor}
+    % \Configure{tabularraystyles} doesn't expand attributes, so we need to expand it here
+    % otherwise, we would get wrong color and hline style in the last row, because this macro is called twice here
+    \cs_set:cx{#4:}{#4:\dim_to_decimal_in_unit:nn{\l__tblr_t_tl*2}{1px}px~\l__tblr_f_tl\space~\:hlinecolor;}
+    \Configure{tabularraystyles}{\csname#4:\endcsname}
+  }
+}
+\ExplSyntaxOff
+>>>
+
+The code for cell is a bit complicated. We need to construct CSS properties
+for horizontal and vertical alignment, background color and rules. 
+
+\<tabularray cell\><<<
+\ExplSyntaxOn
+\long\def\:tempa#1#2{%
+% find columns that are covered by rowspan and colspan
+  \xdef\HCol{\@arabic\c at colnum}
+  \xdef\HRow{\@arabic\c at rownum}
+  \xdef\HMultispan{\l__tblr_cell_colspan_tl}
+  \xdef\HRowspan{\l__tblr_cell_rowspan_tl}
+  \let\CellAttributes\@empty
+  \let\CellStyle\@empty
+  % calculate ignored cells, if the current cell uses colspan or rowspan
+  \int_step_inline:nnn{\c at rownum }{\c at rownum - 1 + \l__tblr_cell_rowspan_tl}{
+    \int_step_inline:nnn{\c at colnum }{\c at colnum - 1  + \l__tblr_cell_colspan_tl}{
+      % the loop always matches the current cell, we must ignore it
+      \str_if_eq:eeF{\HCol.\HRow}{####1.##1}{%
+        \cs_gset:cpn{ignoredcell-####1-##1}{}
+      }
+    }
+  }
+  \cs_if_exist_use:c{tabularray_halign:\g__tblr_cell_halign_tl}
+  \cs_if_exist_use:c{tabularray_valign:\g__tblr_cell_valign_tl}
+  % the vertical aligment can be set also in \g__tblr_cell_middle_tl, so we should try it as well
+  \cs_if_exist_use:c{tabularray_valign:\g__tblr_cell_middle_tl}
+  % calculate column width
+  \dim_compare:nNnT {\__tblr_data_item:nen{column}{\HCol}{@col-width}} > {0pt}{
+    \__tblr_get_table_width:% initialize \tablewidth
+    \edef\HColWidth{\fp_eval:n{\__tblr_data_item:nen{column}{\HCol}{@col-width}/\tablewidth*100}\%}
+    % save table width, preferably in CSS
+    \a:tabularraycolumnwidth%
+  }
+  % there can be multiple hlines for each cell, but we only suport the first one, because of limitations of CSS
+  \:tblr:hlinestyle{#1}{#2}{1}{border-top}
+  \int_compare:nNnT{\HRow + \HRowspan - 1} = {\c at rowcount}{% 
+    % draw hline below the last row
+    \:tblr:hlinestyle{\int_eval:n{\c at rownum + 1}}{#2}{1}{border-bottom}
+  }
+  % the same is true for vlines
+  \:tblr:vlinestyle{#1}{#2}{1}{border-left}
+  \int_compare:nNnT{\HCol + \HMultispan - 1} = {\c at colcount}{%
+    % draw hline below the last row
+    \:tblr:vlinestyle{#1}{\int_eval:n{\c at colnum + 1}}{1}{border-right}
+  }
+  % support for the background color
+  \tl_set:Nx \l__tblr_b_tl
+  { \__tblr_data_item:neen { cell } {#1} {#2} { background } }
+  % save background color to the list of CSS, if it is set
+  \tl_if_empty:NF \l__tblr_b_tl{
+    \get:xcolorcss{\l__tblr_b_tl}\:bgcolor
+    \Configure{tabularraystyles}{background-color: \:bgcolor;}
+  }
+  % We can use something like \Configure{tabularrayattributes}{rowspan="\HRowspan"} in \Configure{tabularray}
+  % to declare correct attributes for joined cells
+  \int_compare:nNnT {\HRowspan} > {1}{\g:tabularray}
+  \int_compare:nNnT {\HMultispan} > {1}{\h:tabularray}
+  \cs_if_exist:cTF{ignoredcell-\the\c at colnum-\the\c at rownum}{%
+    \a:tabularrayignoredcell\e:tabularray\o:__tblr_build_cell_content:NN:{#1}{#2}\f:tabularray\b:tabularrayignoredcell
+  }{%
+    \e:tabularray\o:__tblr_build_cell_content:NN:{#1}{#2}\f:tabularray
+  }
+  % the ignored cell is global, so we must undefine it after the thes
+  \cs_undefine:c{ignoredcell-\the\c at colnum-\the\c at rownum}%
+}
+\HLet\__tblr_build_cell_content:NN\:tempa
+
+\ExplSyntaxOff
+>>>
+
+%%%%%%%%%%%%%%%%%%%%%%%%
 \Section{mdwtab}
 %%%%%%%%%%%%%%%%%%%%%%%%
 

Modified: trunk/lit/tex4ht-html4.tex
===================================================================
--- trunk/lit/tex4ht-html4.tex	2022-12-04 17:01:50 UTC (rev 1260)
+++ trunk/lit/tex4ht-html4.tex	2022-12-09 16:06:10 UTC (rev 1261)
@@ -2246,6 +2246,45 @@
 >>>
 %%%%%%%%%%%%%
 
+\subsection{Tabularray}
+
+\<configure html4 tabularray\><<<
+\Configure{tabularray}{
+  \ifvmode\IgnorePar\fi\EndP
+  \gHAdvance\Next:TableNo by 1 \global\let\TableNo=\Next:TableNo%
+  \HCode{<table class="tabularray \@currenvir" id="tbl-\TableNo">}
+}{\ifvmode\IgnorePar\fi\EndP\HCode{</table>}}
+{\HCode{<tr id="row-\TableNo\HRow-">}}{\HCode{</tr>}}
+{\HCode{<td id="cell\TableNo-\HRow-\HCol" style="\CellStyle" \CellAttributes>}}{\HCode{</td>}}
+{\Configure{tabularrayattributes}{rowspan="\HRowspan"}}
+{\Configure{tabularrayattributes}{colspan="\HMultispan"}}{}
+
+% cells hidden by cell and row spans. they shouldn't be included in HTML, so we hide them using comments
+\Configure{tabularrayignoredcell}{\HCode{<!-- ignored cell: }}{\HCode{ -->}}
+
+% this is a default alignment, so we can ignore it, to save some space in the generated files
+% \Configure{tabularrayhalign}{l}{\Configure{tabularraystyles}{text-align:left;}}
+\Configure{tabularrayhalign}{r}{\Configure{tabularraystyles}{text-align:right;}}
+\Configure{tabularrayhalign}{c}{\Configure{tabularraystyles}{text-align:center;}}
+\Configure{tabularrayhalign}{j}{\Configure{tabularraystyles}{text-align:justify;}}
+
+% this is a default alignment, so we can ignore it, to save some space in the generated files
+% \Configure{tabularrayvalign}{m}{\Configure{tabularraystyles}{vertical-align:middle;}}
+\Configure{tabularrayvalign}{h}{\Configure{tabularraystyles}{vertical-align:top;}}
+\Configure{tabularrayvalign}{p}{\Configure{tabularraystyles}{vertical-align:top;}}
+\Configure{tabularrayvalign}{f}{\Configure{tabularraystyles}{vertical-align:bottom;}}
+% the vertical alignment of the following two is not correct, but CSS doesn't support the correct one
+\Configure{tabularrayvalign}{t}{\Configure{tabularraystyles}{vertical-align:top;}}
+\Configure{tabularrayvalign}{b}{\Configure{tabularraystyles}{vertical-align:bottom;}}
+
+% Save column width only on the first row
+\Configure{tabularraycolumnwidth}{\ifnum\HRow=1\Css{\#tbl-\TableNo\space td:nth-child(\HCol){width:\HColWidth;}}\fi}
+\Css{table.tabularray{table-layout: fixed;border-collapse:collapse;margin:0.3em 0;}}
+>>>
+
+
+
+
 %%%%%%%%%%%%%
 \subsection{Mdwtab}
 %%%%%%%%%%%%%



More information about the tex4ht-commits mailing list.