summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/luaprogtable/luaprogtable.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/latex/luaprogtable/luaprogtable.sty')
-rw-r--r--macros/luatex/latex/luaprogtable/luaprogtable.sty237
1 files changed, 237 insertions, 0 deletions
diff --git a/macros/luatex/latex/luaprogtable/luaprogtable.sty b/macros/luatex/latex/luaprogtable/luaprogtable.sty
new file mode 100644
index 0000000000..d05a633c21
--- /dev/null
+++ b/macros/luatex/latex/luaprogtable/luaprogtable.sty
@@ -0,0 +1,237 @@
+\RequirePackage{expl3}
+\RequirePackage{xparse}
+\RequirePackage{luatexbase}
+\RequirePackage{iftex}
+
+\RequireLuaTeX
+
+\ProvidesExplPackage {luaprogtable}{08/06/2020}{1.0}{Programmatic table interface}
+
+\makeatletter
+\savecatcodetable 20996
+
+\directlua{
+ require~"luaprogtable.lua"
+}
+
+\tl_new:N \g__luaprogtable_tmpa_tl
+\tl_new:N \g__luaprogtable_tmpb_tl
+\tl_new:N \g__luaprogtable_tmpc_tl
+
+\str_new:N \g__luaprogtable_tmpa_str
+\str_new:N \g__luaprogtable_tmpb_str
+\str_new:N \g__luaprogtable_tmpc_str
+
+\int_new:N \g__luaprogtable_tmpa_int
+\int_new:N \g__luaprogtable_tmpb_int
+\int_new:N \g__luaprogtable_tmpc_int
+
+\cs_set:Npn \__luaprogtable_lua_table_item:nn #1#2 {
+ ["#1"]="#2"
+}
+
+\seq_new:N \g__luaprogtable_prop_item_seq
+
+\cs_set:Npn \__luaprogtable_add_lua_table_item:nn #1#2 {
+ \str_gset:Nx \g__luaprogtable_tmpa_str {\luaescapestring{\tl_to_str:n {#1}}}
+ \str_gset:Nx \g__luaprogtable_tmpb_str {\luaescapestring{\tl_to_str:n {#2}}}
+ \seq_gput_right:Nx \g__luaprogtable_prop_item_seq {
+ \exp_args:NVV \__luaprogtable_lua_table_item:nn \g__luaprogtable_tmpa_str \g__luaprogtable_tmpb_str
+ }
+}
+
+\str_new:N \g__luaprogtable_lua_table_str
+
+\cs_set:Npn \__luaprogtable_prop_to_lua_table:N #1 {
+ \seq_gclear:N \g__luaprogtable_prop_item_seq
+ \prop_map_function:NN #1 \__luaprogtable_add_lua_table_item:nn
+ \str_gclear:N \g__luaprogtable_lua_table_str
+ \str_gput_right:NV \g__luaprogtable_lua_table_str \c_left_brace_str
+ \str_gput_right:Nx \g__luaprogtable_lua_table_str {\seq_use:Nn \g__luaprogtable_prop_item_seq {,~}}
+ \str_gput_right:NV \g__luaprogtable_lua_table_str \c_right_brace_str
+}
+
+\prop_new:N \g__luaprogtable_new_prop
+\keys_define:nn { __luaprogtable_new }
+{
+ backend .prop_gput:N = \g__luaprogtable_new_prop,
+ ncols .prop_gput:N = \g__luaprogtable_new_prop,
+ nrows .prop_gput:N = \g__luaprogtable_new_prop,
+ default~before~line .prop_gput:N = \g__luaprogtable_new_prop,
+ default~after~line .prop_gput:N = \g__luaprogtable_new_prop,
+ default~after~spacing .prop_gput:N = \g__luaprogtable_new_prop,
+ input~method .prop_gput:N = \g__luaprogtable_new_prop
+}
+
+\str_new:N \g__luaprogtable_lua_cur_table_str
+\DeclareDocumentCommand{\LPTSetCurrentTable}{m}{
+ \directlua{
+ local _test_table = _lpt_get_table("\luaescapestring{#1}")
+ }
+ \str_gset:Nx \g__luaprogtable_lua_cur_table_str {\luaescapestring{#1}}
+}
+
+\newcommand{\LPTGetCurrentTable}{
+ \str_use:N \g__luaprogtable_lua_cur_table_str
+}
+
+\DeclareDocumentCommand{\LPTNewTable}{mmmO{}}{
+ \prop_gclear:N \g__luaprogtable_new_prop
+ \prop_gput:Nnn \g__luaprogtable_new_prop {backend} {tabular}
+ \prop_gput:Nnn \g__luaprogtable_new_prop {nrows} {0}
+ \prop_gput:Nnn \g__luaprogtable_new_prop {default~before~line} {}
+ \prop_gput:Nnn \g__luaprogtable_new_prop {default~after~line} {}
+ \prop_gput:Nnn \g__luaprogtable_new_prop {default~after~spacing} {}
+ \prop_gput:Nnn \g__luaprogtable_new_prop {input~method} {stringbuffer}
+
+ \keys_set:nn { __luaprogtable_new } {#4}
+
+ \prop_gput:Nnn \g__luaprogtable_new_prop {table~name} {#1}
+ \prop_gput:Nnn \g__luaprogtable_new_prop {ncols} {#2}
+ \prop_gput:Nnn \g__luaprogtable_new_prop {table~preamble} {#3}
+ \prop_gput:Nnn \g__luaprogtable_new_prop {default~value} {}
+
+ \__luaprogtable_prop_to_lua_table:N \g__luaprogtable_new_prop
+
+ \directlua{
+ local~_tmp_table = \str_use:N \g__luaprogtable_lua_table_str;
+ lpt_new_table(_tmp_table);
+ }
+}
+
+\newcommand{\LPTUseTable}{
+ \directlua{
+ lpt_use_table("\LPTGetCurrentTable");
+ }
+}
+
+\DeclareDocumentEnvironment{lptview}{m}{
+ \directlua{
+ _lpt_register_verbatim([[\string\end{lptview}]])
+ }
+}{
+ % now that verbatim material is passed to lua, call corresponding handler
+ \directlua{
+ lpt_table_view("\LPTGetCurrentTable", "\luaescapestring{#1}")
+ }
+}
+
+\DeclareDocumentEnvironment{lptfill}{m}{
+ \directlua{
+ _lpt_register_verbatim([[\string\end{lptfill}]])
+ }
+}{
+ \directlua{
+ lpt_table_fill("\LPTGetCurrentTable", "\luaescapestring{#1}")
+ }
+}
+
+\DeclareDocumentCommand{\LPTFill}{mm}{
+ \directlua{
+ lpt_table_fill("\LPTGetCurrentTable", "\luaescapestring{#1}", "\luaescapestring{\tl_to_str:n {#2}}")
+ }
+}
+
+\prop_new:N \g__luaprogtable_row_prop
+\keys_define:nn { __luaprogtable_row }
+{
+ before~line .prop_gput:N = \g__luaprogtable_row_prop,
+ after~line .prop_gput:N = \g__luaprogtable_row_prop,
+ after~spacing .prop_gput:N = \g__luaprogtable_row_prop
+}
+
+\DeclareDocumentCommand{\LPTSetRowProp}{mm}{
+ \prop_gclear:N \g__luaprogtable_row_prop
+ \keys_set:nn { __luaprogtable_row } {#2}
+
+ \__luaprogtable_prop_to_lua_table:N \g__luaprogtable_row_prop
+ \directlua{
+ local~_tmp_table = \str_use:N \g__luaprogtable_lua_table_str;
+ lpt_set_row_prop("\LPTGetCurrentTable", "\luaescapestring{#1}", _tmp_table)
+ }
+}
+
+\DeclareDocumentCommand{\LPTAddRow}{O{}}{
+ \prop_gclear:N \g__luaprogtable_row_prop
+ \keys_set:nn { __luaprogtable_row } {#1}
+
+ \__luaprogtable_prop_to_lua_table:N \g__luaprogtable_row_prop
+ \directlua{
+ local~_tmp_table = \str_use:N \g__luaprogtable_lua_table_str;
+ lpt_add_row("\LPTGetCurrentTable", _tmp_table)
+ }
+}
+
+\DeclareDocumentCommand{\LPTSetCell}{mO{1,1}m}{
+ \directlua{
+ local~_table = _lpt_get_table("\LPTGetCurrentTable");
+ local~_index = _table:fix_cell_index("\luaescapestring{#1}");
+ local~_shape = _lpt_parse_shape("\luaescapestring{#2}");
+ _table:set_cell(_index[1], _index[2], "\luaescapestring{ \tl_to_str:n {#3} }", _shape)
+ }
+}
+
+\newcommand{\LPTGetTableShape}{
+ \directlua{
+ lpt_get_table_shape("\LPTGetCurrentTable")
+ }
+}
+
+\ExplSyntaxOff
+
+\newcommand{\LPTGetTableNames}{%
+ \directlua{
+ local _names = {}
+ for key, val in pairs(lpt_info) do
+ table.insert(_names, key)
+ end
+ table.sort(_names)
+ local _ret = table.concat(_names, ",")
+ tex.print(_ret)
+ }%
+}
+
+\newcommand{\LPTGetCellData}[1]{%
+ \directlua{
+ local _table = _lpt_get_table("\LPTGetCurrentTable");
+ local _index = _table:fix_cell_index("\luaescapestring{#1}");
+ local _cell = _table:get_cell(_index[1], _index[2]);
+ tex.print([[\string\unexpanded{]] .. _cell.data .. "}")
+ }%
+}
+
+\newcommand{\LPTGetCellMetaIndex}[2]{%
+ \directlua{
+ local _table = _lpt_get_table("\LPTGetCurrentTable");
+ local _index = _table:fix_cell_index("\luaescapestring{#2}");
+ local _cell = _table:get_cell(_index[1], _index[2]);
+ local _field = "\luaescapestring{#1}"
+ local _ret = rawget(_cell, _field)
+ if _ret == nil then
+ tex.print(20996, [[\string\c_novalue_tl]])
+ else
+ tex.print("{".. tostring(_ret[1]) .. "}{".. tostring(_ret[2]) .. "}")
+ end
+ }%
+}
+
+\newcommand{\LPTGetCellShape}[1]{%
+ \LPTGetCellMetaIndex{shape}{#1}%
+}
+
+\newcommand{\LPTGetCellParent}[1]{%
+ \LPTGetCellMetaIndex{parent}{#1}%
+}
+
+\newcommand{\LPTDeleteTable}[1]{
+ \directlua{
+ local _name = "\luaescapestring{#1}"
+ local _table = _lpt_get_table(_name)
+ lpt_info[_name] = nil
+ }
+}
+
+
+\makeatother
+
+\endinput \ No newline at end of file