% Kale Ewasiuk (kalekje@gmail.com)
% 2022-02-27
% Copyright (C) 2021-2022 Kale Ewasiuk
%
% Permission is hereby granted, free of charge, to any person obtaining a copy
% of this software and associated documentation files (the "Software"), to deal
% in the Software without restriction, including without limitation the rights
% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
% copies of the Software, and to permit persons to whom the Software is
% furnished to do so, subject to the following conditions:
%
% The above copyright notice and this permission notice shall be included in
% all copies or substantial portions of the Software.
%
% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
% ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
% TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
% PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT
% SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
% ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
% ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
% OR OTHER DEALINGS IN THE SOFTWARE.

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{lutabulartools}[2022-02-27]

\RequirePackage{booktabs}
\RequirePackage{multirow}
\RequirePackage{makecell}
\RequirePackage{xparse}
\RequirePackage{array}
\RequirePackage{xcolor}
\RequirePackage{colortbl}
\RequirePackage{luacode}
\RequirePackage[pl,extras]{penlight} % NEEDED

\luadirect{lutabt = require('lutabulartools')}


\newcolumntype{\ltt@ltrim}{@{}}
\newcolumntype{\ltt@rtrim}{@{}}
\DeclareOption{notrim}{
  \newcolumntype{\ltt@ltrim}{}
  \newcolumntype{\ltt@rtrim}{}
}



%% adapted from
% https://tex.stackexchange.com/questions/182953/add-midrule-every-5-lines-automatically
%% https://tex.stackexchange.com/questions/145084/what-is-the-function-of-noalign

\def\midruleXstep{5}
\def\midruleXrule{\gmidrule}

\newcounter{midruleX}
\newcommand*{\midruleX}{%
  \aftergroup\aftergroup\aftergroup\midruleXaux
}
\newif\ifmidruleX

\newcommand*{\midruleXaux}{%
  \noalign{%
    \stepcounter{midruleX}%
    \ifnum\value{midruleX}=\midruleXstep %
      \global\midruleXtrue
      \resetmidruleX%
    \else
      \global\midruleXfalse
    \fi
  }
  \ifmidruleX\midruleXrule\fi
}
\newcommand*{\resetmidruleX}{\setcounter{midruleX}{0}}  %%% todo maybe put noalign in here

\resetmidruleX




%%%%

%%% gray midrule and gray cmidrule
\aboverulesep=0.0ex
\belowrulesep=0.5ex
\providecommand{\gmidrule}{\arrayrulecolor{lightgray}\specialrule{\lightrulewidth}{0.5\aboverulesep}{0.5\belowrulesep}\arrayrulecolor{black}}
\cmidrulewidth=\lightrulewidth

%%% use gcmidrule for a gray "c" midrule
% Copy \cmidrule from
%  http://mirrors.ctan.org/macros/latex/contrib/booktabs/booktabs.dtx
% and modify it for insertion of \arrayrulecolor{lightgray} at the start,
% and \arrayrulecolor{black} at the end

\def\oldgcmidrule{\arrayrulecolor{lightgray}% Switch colour to lightgray
    \noalign{\ifnum0=`}\fi
    \@ifnextchar[{\@gcmidrule}{\@gcmidrule[\cmidrulewidth]}}
\def\@gcmidrule[#1]{\@ifnextchar({\@@gcmidrule[#1]}{\@@gcmidrule[#1]()}}
\def\@@gcmidrule[#1](#2)#3{\@@@gcmidrule[#3]{#1}{#2}}
\def\@@@gcmidrule[#1-#2]#3#4{\global\@cmidla#1\relax
    \global\advance\@cmidla\m@ne
    \ifnum\@cmidla>0\global\let\@gtempa\@cmidrulea\else
    \global\let\@gtempa\@cmidruleb\fi
    \global\@cmidlb#2\relax
    \global\advance\@cmidlb-\@cmidla
    \global\@thisrulewidth=#3
    \@setrulekerning{#4}
    \ifnum\@lastruleclass=\z@\vskip 0.5\aboverulesep\fi
    \ifnum0=`{\fi}\@gtempa
    \noalign{\ifnum0=`}\fi\futurenonspacelet\@tempa\@xgcmidrule}
\def\@xgcmidrule{%
   \ifx\@tempa\gcmidrule
       \vskip-\@thisrulewidth
       \global\@lastruleclass=\@ne
   \else \ifx\@tempa\morecmidrules
       \vskip \cmidrulesep
       \global\@lastruleclass=\@ne\else
       \vskip 0.5\belowrulesep
       \global\@lastruleclass=\z@
   \fi\fi
   \ifnum0=`{\fi}
  \arrayrulecolor{black}}% Switch colour back to black


%%%

\let\oldcmidrule\cmidrule % improve cmidrule. Can reference column number from back with a +, eg, {3+-2+} means third to second last
\RenewExpandableDocumentCommand{\cmidrule}{ O{} D(){} m }{%
    \luadirect{lutabt.make1cmidrule( \luastringN{#1},
                            \luastring{#2},
                            \luastring{#3},
                            'oldcmidrule')
    }%
}

\NewExpandableDocumentCommand{\cmidrules}{ O{} D(){} m }{%  supports comma in {}
    \luadirect{lutabt.makecmidrules( \luastringN{#1},
                            \luastring{#2},
                            \luastring{#3},
                            'cmidrule')
    }%
}

\NewExpandableDocumentCommand{\gcmidrule}{ O{} D(){} m }{%
    \luadirect{lutabt.make1cmidrule( \luastringN{#1},
                                \luastring{#2},
                                \luastring{#3},
                                'oldgcmidrule')
    }%
}

\NewExpandableDocumentCommand{\gcmidrules}{ O{} D(){} m }{%  supports comma in {}, rl can be passed as well
    \luadirect{lutabt.makecmidrules( \luastringN{#1},
                                    \luastring{#2},
                                    \luastring{#3},
                                    'gcmidrule')
    }%
}



\let\oldtabular\tabular
\RenewExpandableDocumentCommand{\tabular}{ O{c} m }{%
  \luadirect{lutabt.set_col_spec(\luastringN{#2})}%
  \oldtabular[#1]{\ltt@ltrim#2\ltt@rtrim}%
}

\expandafter\let\expandafter\oldtabulars\csname tabular*\endcsname
\expandafter\let\expandafter\endoldtabulars\csname endtabular*\endcsname
\RenewDocumentEnvironment{tabular*}{ m O{c} m }{%
  \luadirect{lutabt.set_col_spec(\luastringN{#3})}%
  \begin{oldtabulars}{#1}[#2]{\ltt@ltrim#3\ltt@rtrim}%
}{%
  \end{oldtabulars}%
}
%%% NOTE tabularx uses tabular*, NO NEED TO CHANGE TABULARX!


%s0,spec,mcspec,pre,content
% Magic Cell
\NewExpandableDocumentCommand{\MC}{ s O{} D(){} D<>{} m }{%
% Magic cell *wraps with {} but automatically checks for SI column,
                    % [column spec] (mult-column spec override)  <pre-cell stuff>  {cell content}
\luadirect{lutabt.MagicCell(
    \luastring{#1},
    \luastring{#2},
    \luastringN{#3},
    \luastringN{#4},
    \luastringN{#5}
)}}


\NewDocumentCommand{\setMCrepl}{m m}{\luadirect{
  lutabt.col_replaces.#1 = '#2'
}}
\NewDocumentCommand{\setMChordef}{ m m}{\luadirect{
  lutabt.col_hor_repl.#1 = '#2'
}}
\NewDocumentCommand{\setMCverdef}{ m m}{\luadirect{
  lutabt.col_ver_repl.#1 = '#2'
}}
\NewDocumentCommand{\addMCsicol}{ m }{\luadirect{
  lutabt.SI_cols[\string##lutabt.SI_cols+1] = '#1'
}}



\ProcessOptions







%%%  OLD STUFF,
%% before I had a fall-back for counting columns (just calculate current column on last column once)
%%   and kept track of row numbers. I felt that this wasn't needed, so I've removed.
%\newcommand{\TabColNum}{\luadirect{tex.print(lutabt.get_TabColNum())}} % prints the current column number of tabular
%\newcommand{\NumTabCols}{\luadirect{tex.print(lutabt.NumTabCols)}} % prints the total num columns of tabular
%\newcounter{RowNumCnt}
%\setcounter{RowNumCnt}{1}
%  \setcounter{RowNumCnt}{1}%
%  \luadirect{lutabt.NumTabColsMX = 0}% fall back if calc doesnt work for some reason
%  \setcounter{RowNumCnt}{1}%
%  \luadirect{lutabt.NumTabColsMX = 0}% fall back if calc doesnt work for some reason
%\DeclareOption{notrimx}{
%  \global\newcolumntype{\ltt@ltrim}{!{\stepcounter{RowNumCnt}}}
%%  \global\newcolumntype{\ltt@rtrim}{!{\luadirect{lutabt.get_TabColNum()}}}
%}
%\DeclareOption{trimx}{
%  \newcolumntype{\ltt@ltrim}{@{\stepcounter{RowNumCnt}}}
%%  \newcolumntype{\ltt@rtrim}{@{\luadirect{lutabt.get_TabColNum()}}}
%}
