% Kale Ewasiuk (kalekje@gmail.com)
% 2023-08-27
% Copyright (C) 2021-2023 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.

\ProvidesPackage{penlightplus}[2023-08-27]

\RequirePackage{luacode}
\RequirePackage{luakeys}
\RequirePackage[import]{penlight}
\RequirePackage{etoolbox}

\DeclareOption{globals}{\luadirect{__PL_GLOBALS__ = true}}
\DeclareOption{pl}{\directlua{pl = penlight}}
\ProcessOptions*\relax

\luadirect{require'penlightplus'}




\global\newcommand{\writePDFmetadata}{\luadirect{penlight.tex.writePDFmetadata()}}

\NewDocumentCommand{\writePDFmetadatakv}{ s m }{
\IfBooleanTF{#1}{% if *, overwrite everything
  \luadirect{
    __PDFmetadata__ = penlight.luakeys.parse(\luastring{#2})
      penlight.tex.writePDFmetadata()
  }}{
    \luadirect{
    __PDFmetadata__ = __PDFmetadata__ or {}
    penlight.tablex.update(__PDFmetadata__, penlight.luakeys.parse(\luastring{#2}))
    penlight.tex.writePDFmetadata()
  }}
}


\gdef\luastringT#1{\luastring{\unexpanded\expandafter\expandafter\expandafter{#1}}}  % expand luastring twice
\global\let\luastringF\luastring  % fully expanded luastring

% allow control over expansion of arguments to a latex function
\NewDocumentCommand{\MakeluastringCommands}{O{} m }{% #1 the desired commands #2 defaults
  \luadirect{penlight.tex.aliasluastring(\luastring{#2},\luastring{#1})}%
}

\NewDocumentCommand{\splitToComma}{ O{nn} m m }{%
  \MakeluastringCommands[nn]{#1}%
  \luadirect{penlight.tex.split2comma(\plluastringA{#2},\plluastringB{#3})}%
}

\NewDocumentCommand{\splitToItems}{ O{NN} m m }{%
  \MakeluastringCommands[nn]{#1}%
  \luadirect{penlight.tex.split2items(\plluastringA{#2},\plluastringB{#3})}%
}








%%%%

\newtoggle{luaexpr}\togglefalse{luaexpr}

\begin{luacode*}
  function toggle_luaexpr(expr)
    if expr then
      tex.sprint('\\toggletrue{luaexpr}')
    else
      tex.sprint('\\togglefalse{luaexpr}')
    end
  end
\end{luacode*}

\NewDocumentCommand{\ifluax}{m m O{}}{%
  \luadirect{toggle_luaexpr(#1)}%
  \iftoggle{luaexpr}{#2}{#3}%
  \togglefalse{luaexpr}% safety set to false
}

\NewDocumentCommand{\ifluaxv}{m m O{}}{\ifluax{penlight.hasval(#1)}{#2}[#3]}


%   testing ifluax
%  {-->\ifluax{1 == 2}{\LARGE TRUE}[\tiny FALSE]<--test\\
%  -->\ifluax{abc == nil}{\LARGE TRUE}[\tiny FALSE]<--test}


%%%

\NewDocumentCommand{\newtbl}{m}{\luadirect{
  penlight.tbls[\luastring{#1}] = {}
  penlight.tbls._recent = penlight.tbls[\luastring{#1}]
}}

\NewDocumentCommand{\tblfrkv}{m m O{}}{ \luadirect{
  penlight.tbls[\luastring{#1}] = penlight.luakeys.parse(\luastring{#2}, penlight.luakeys.parse(\luastring{#3}))
  penlight.tbls._recent = penlight.tbls[\luastring{#1}]
}}

\NewDocumentCommand{\chgtbl}{ m }{ \luadirect{
  penlight.tbls._recent = penlight.tbls[\luastring{#1}]
}}

\NewDocumentCommand{\gettbl}{m}{\luadirect{
  penlight.get_tbl_item(\luastring{#1}, true)
}}

\NewDocumentCommand{\settbl}{m m}{\luadirect{
  penlight.set_tbl_item(\luastring{#1}, \luastring{#2})
}}

\NewDocumentCommand{\deftbl}{ m m }{\luadirect{% define a table, use * to make definition
  token.set_macro(\luastring{#2}, tostring(penlight.get_tbl_item(\luastring{#1})))
}}

\NewDocumentCommand{\gdeftbl}{ m m }{\luadirect{% define a table, use * to make global definition
  token.set_macro(\luastring{#2}, tostring(penlight.get_tbl_item(\luastring{#1})), 'global')
}}

\NewDocumentCommand{\iftbl}{m m O{}}{\ifluax{penlight.get_tbl_item(\luastring{#1})}{#2}[#3]}

\NewDocumentCommand{\iftblv}{m m O{}}{\ifluaxv{penlight.get_tbl_item(\luastring{#1})}{#2}[#3]}



%\NewDocumentCommand{\tblupd}{ m m}{\luadirect{
%  penlight.tablex.update(penlight.tbls[\luastring{#1}], penlight.tbls[\luastring{#2}])
%}}
%
%\NewDocumentCommand{\tblupdkv}{ m m }{\luadirect{
%  penlight.tablex.update(penlight.tbls[\luastring{#1}], penlight.luakeys.parse(\luastring{#2}))
%}}

%
%% todo need a get table function. If blank is passed, the last table referenced is used.
%\NewDocumentCommand{\tblfrkvII}{ m m m }{\luadirect{
%  _G[\luastring{#1}] = penlight.tablex.update(penlight.luakeys.parse(\luastring{#2}), luakeys.parse(\luastring{#3}))
%}}

%\NewDocumentCommand{\tbldo}{m m O{} }{\luadirect{
%  % tex.sprint(tostring(_G[\luastring{#1}][#2]))
%  % todo allow one to use pl tablex function here,
%  % {tbl}{update}[arg1][arg2]
%  penlight.tablex[\luastring[#1]](_G[\luastring{}], _G[\luastring{}])
%}}




%%%%%%%%5

%\begin{luacode*}
%  function set_dim(name, len)
%    tex.sprint('\\global\\let\\'..name..'\\relax') -- reset length
%    tex.sprint('\\global\\newlength{\\'..name..'}') -- make new len
%    tex.setglue(name, tex.sp(len))
%  end
%\end{luacode*}
