Skip to content

Commit

Permalink
.prop_(g)put:N key property (fixes #444)
Browse files Browse the repository at this point in the history
  • Loading branch information
josephwright committed Feb 1, 2019
1 parent 4454eb0 commit 536c97d
Show file tree
Hide file tree
Showing 14 changed files with 210 additions and 20 deletions.
1 change: 1 addition & 0 deletions l3kernel/CHANGELOG.md
Expand Up @@ -11,6 +11,7 @@ this project uses date-based 'snapshot' version identifiers.

- Support for return of whole path by \cs{keys_set_known:nnN}-like
function \cs{keys_set_known:nnnN} (see #508)
- `.prop_(g)put:N` key property (see #444)

### Fixed

Expand Down
72 changes: 62 additions & 10 deletions l3kernel/l3keys.dtx
Expand Up @@ -382,6 +382,17 @@
% Choices are discussed in detail in section~\ref{sec:l3keys:choice}.
% \end{function}
%
% \begin{function}[added = 2019-01-31]
% {.prop_put:N, .prop_put:c, .prop_gput:N, .prop_gput:c}
% \begin{syntax}
% \meta{key} .prop_put:N = \meta{property list}
% \end{syntax}
% Defines \meta{key} to put the \meta{value} onto the \meta{property list}
% stored under the \meta{key}.
% If the variable does not exist, it
% is created globally at the point that the key is set up.
% \end{function}
%
% \begin{function}{.skip_set:N, .skip_set:c, .skip_gset:N, .skip_gset:c}
% \begin{syntax}
% \meta{key} .skip_set:N = \meta{skip}
Expand Down Expand Up @@ -1272,10 +1283,12 @@
% \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_tmp_bool}
% \begin{variable}{\l_@@_tmp_bool, \l_@@_tmpa_tl, \l_@@_tmpb_tl}
% Scratch space.
% \begin{macrocode}
\bool_new:N \l_@@_tmp_bool
\tl_new:N \l_@@_tmpa_tl
\tl_new:N \l_@@_tmpb_tl
% \end{macrocode}
% \end{variable}
%
Expand Down Expand Up @@ -1641,6 +1654,28 @@
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@@_prop_put:Nn, \@@_prop_put:cn}
% Much the same as other variables, but needs a dedicated auxiliary.
% \begin{macrocode}
\cs_new_protected:Npn \@@_prop_put:Nn #1#2
{
\prop_if_exist:NF #1 { \prop_new:N #1 }
\exp_after:wN \@@_find_key_module:NNw
\exp_after:wN \l_@@_tmpa_tl
\exp_after:wN \l_@@_tmpb_tl
\l_keys_path_tl / \q_stop
\@@_cmd_set:nx { \l_keys_path_tl }
{
\exp_not:c { prop_ #2 put:Nnn }
\exp_not:N #1
{ \l_@@_tmpb_tl }
\exp_not:n { {##1} }
}
}
\cs_generate_variant:Nn \@@_prop_put:Nn { c }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_undefine:}
% Undefining a key has to be done without \cs{cs_undefine:c} as that
% function acts globally.
Expand Down Expand Up @@ -1962,6 +1997,20 @@
% \end{macro}
% \end{macro}
%
% \begin{macro}{.prop_put:N, .prop_put:c, .prop_gput:N, .prop_gput:c}
% Setting a variable is very easy: just pass the data along.
% \begin{macrocode}
\cs_new_protected:cpn { \c_@@_props_root_tl .prop_put:N } #1
{ \@@_prop_put:Nn #1 { } }
\cs_new_protected:cpn { \c_@@_props_root_tl .prop_put:c } #1
{ \@@_prop_put:cn {#1} { } }
\cs_new_protected:cpn { \c_@@_props_root_tl .prop_gput:N } #1
{ \@@_prop_put:Nn #1 { g } }
\cs_new_protected:cpn { \c_@@_props_root_tl .prop_gput:c } #1
{ \@@_prop_put:cn {#1} { g } }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{.skip_set:N, .skip_set:c}
% \begin{macro}{.skip_gset:N, .skip_gset:c}
% Setting a variable is very easy: just pass the data along.
Expand Down Expand Up @@ -2251,7 +2300,7 @@
%
% \begin{macro}{\@@_set_keyval:n, \@@_set_keyval:nn}
% \begin{macro}{\@@_set_keyval:nnn, \@@_set_keyval:onn}
% \begin{macro}{\@@_find_key_module:w}
% \begin{macro}{\@@_find_key_module:NNw}
% \begin{macro}{\@@_set_selective:}
% A shared system once again. First, set the current path and add a
% default if needed. There are then checks to see if the a value is
Expand Down Expand Up @@ -2284,25 +2333,28 @@
\@@_trim_spaces:n {#2}
}
\tl_clear:N \l_@@_module_tl
\exp_after:wN \@@_find_key_module:w \l_keys_path_tl / \q_stop
\exp_after:wN \@@_find_key_module:NNw
\exp_after:wN \l_@@_module_tl
\exp_after:wN \l_keys_key_tl
\l_keys_path_tl / \q_stop
\@@_value_or_default:n {#3}
\bool_if:NTF \l_@@_selective_bool
{ \@@_set_selective: }
{ \@@_execute: }
\tl_set:Nn \l_@@_module_tl {#1}
}
\cs_generate_variant:Nn \@@_set_keyval:nnn { o }
\cs_new_protected:Npn \@@_find_key_module:w #1 / #2 \q_stop
\cs_new_protected:Npn \@@_find_key_module:NNw #1#2#3 / #4 \q_stop
{
\tl_if_blank:nTF {#2}
{ \tl_set:Nn \l_keys_key_tl {#1} }
\tl_if_blank:nTF {#4}
{ \tl_set:Nn #2 {#3} }
{
\tl_put_right:Nx \l_@@_module_tl
\tl_put_right:Nx #1
{
\tl_if_empty:NF \l_@@_module_tl { / }
#1
\tl_if_empty:NF #1 { / }
#3
}
\@@_find_key_module:w #2 \q_stop
\@@_find_key_module:NNw #1#2 #4 \q_stop
}
}
% \end{macrocode}
Expand Down
10 changes: 9 additions & 1 deletion l3kernel/testfiles/m3expl001.luatex.tlg
Expand Up @@ -3231,6 +3231,8 @@ Defining \l__keys_selective_seq on line ...
Defining \l__keys_unused_clist on line ...
Defining \l_keys_value_tl on line ...
Defining \l__keys_tmp_bool on line ...
Defining \l__keys_tmpa_tl on line ...
Defining \l__keys_tmpb_tl on line ...
Defining \keys_define:nn on line ...
Defining \__keys_define:nnn on line ...
Defining \__keys_define:onn on line ...
Expand Down Expand Up @@ -3263,6 +3265,8 @@ Defining \__keys_inherit:n on line ...
Defining \__keys_initialise:n on line ...
Defining \__keys_meta_make:n on line ...
Defining \__keys_meta_make:nn on line ...
Defining \__keys_prop_put:Nn on line ...
Defining \__keys_prop_put:cn on line ...
Defining \__keys_undefine: on line ...
Defining \__keys_value_requirement:nn on line ...
Defining \__keys_validate_forbidden: on line ...
Expand Down Expand Up @@ -3317,6 +3321,10 @@ Defining \key prop > .multichoices:nn on line ...
Defining \key prop > .multichoices:Vn on line ...
Defining \key prop > .multichoices:on on line ...
Defining \key prop > .multichoices:xn on line ...
Defining \key prop > .prop_put:N on line ...
Defining \key prop > .prop_put:c on line ...
Defining \key prop > .prop_gput:N on line ...
Defining \key prop > .prop_gput:c on line ...
Defining \key prop > .skip_set:N on line ...
Defining \key prop > .skip_set:c on line ...
Defining \key prop > .skip_gset:N on line ...
Expand Down Expand Up @@ -3378,7 +3386,7 @@ Defining \__keys_set_keyval:n on line ...
Defining \__keys_set_keyval:nn on line ...
Defining \__keys_set_keyval:nnn on line ...
Defining \__keys_set_keyval:onn on line ...
Defining \__keys_find_key_module:w on line ...
Defining \__keys_find_key_module:NNw on line ...
Defining \__keys_set_selective: on line ...
Defining \__keys_check_groups: on line ...
Defining \__keys_value_or_default:n on line ...
Expand Down
10 changes: 9 additions & 1 deletion l3kernel/testfiles/m3expl001.ptex.tlg
Expand Up @@ -3524,6 +3524,8 @@ Defining \l__keys_selective_seq on line ...
Defining \l__keys_unused_clist on line ...
Defining \l_keys_value_tl on line ...
Defining \l__keys_tmp_bool on line ...
Defining \l__keys_tmpa_tl on line ...
Defining \l__keys_tmpb_tl on line ...
Defining \keys_define:nn on line ...
Defining \__keys_define:nnn on line ...
Defining \__keys_define:onn on line ...
Expand Down Expand Up @@ -3556,6 +3558,8 @@ Defining \__keys_inherit:n on line ...
Defining \__keys_initialise:n on line ...
Defining \__keys_meta_make:n on line ...
Defining \__keys_meta_make:nn on line ...
Defining \__keys_prop_put:Nn on line ...
Defining \__keys_prop_put:cn on line ...
Defining \__keys_undefine: on line ...
Defining \__keys_value_requirement:nn on line ...
Defining \__keys_validate_forbidden: on line ...
Expand Down Expand Up @@ -3610,6 +3614,10 @@ Defining \key prop > .multichoices:nn on line ...
Defining \key prop > .multichoices:Vn on line ...
Defining \key prop > .multichoices:on on line ...
Defining \key prop > .multichoices:xn on line ...
Defining \key prop > .prop_put:N on line ...
Defining \key prop > .prop_put:c on line ...
Defining \key prop > .prop_gput:N on line ...
Defining \key prop > .prop_gput:c on line ...
Defining \key prop > .skip_set:N on line ...
Defining \key prop > .skip_set:c on line ...
Defining \key prop > .skip_gset:N on line ...
Expand Down Expand Up @@ -3671,7 +3679,7 @@ Defining \__keys_set_keyval:n on line ...
Defining \__keys_set_keyval:nn on line ...
Defining \__keys_set_keyval:nnn on line ...
Defining \__keys_set_keyval:onn on line ...
Defining \__keys_find_key_module:w on line ...
Defining \__keys_find_key_module:NNw on line ...
Defining \__keys_set_selective: on line ...
Defining \__keys_check_groups: on line ...
Defining \__keys_value_or_default:n on line ...
Expand Down
10 changes: 9 additions & 1 deletion l3kernel/testfiles/m3expl001.tlg
Expand Up @@ -3524,6 +3524,8 @@ Defining \l__keys_selective_seq on line ...
Defining \l__keys_unused_clist on line ...
Defining \l_keys_value_tl on line ...
Defining \l__keys_tmp_bool on line ...
Defining \l__keys_tmpa_tl on line ...
Defining \l__keys_tmpb_tl on line ...
Defining \keys_define:nn on line ...
Defining \__keys_define:nnn on line ...
Defining \__keys_define:onn on line ...
Expand Down Expand Up @@ -3556,6 +3558,8 @@ Defining \__keys_inherit:n on line ...
Defining \__keys_initialise:n on line ...
Defining \__keys_meta_make:n on line ...
Defining \__keys_meta_make:nn on line ...
Defining \__keys_prop_put:Nn on line ...
Defining \__keys_prop_put:cn on line ...
Defining \__keys_undefine: on line ...
Defining \__keys_value_requirement:nn on line ...
Defining \__keys_validate_forbidden: on line ...
Expand Down Expand Up @@ -3610,6 +3614,10 @@ Defining \key prop > .multichoices:nn on line ...
Defining \key prop > .multichoices:Vn on line ...
Defining \key prop > .multichoices:on on line ...
Defining \key prop > .multichoices:xn on line ...
Defining \key prop > .prop_put:N on line ...
Defining \key prop > .prop_put:c on line ...
Defining \key prop > .prop_gput:N on line ...
Defining \key prop > .prop_gput:c on line ...
Defining \key prop > .skip_set:N on line ...
Defining \key prop > .skip_set:c on line ...
Defining \key prop > .skip_gset:N on line ...
Expand Down Expand Up @@ -3671,7 +3679,7 @@ Defining \__keys_set_keyval:n on line ...
Defining \__keys_set_keyval:nn on line ...
Defining \__keys_set_keyval:nnn on line ...
Defining \__keys_set_keyval:onn on line ...
Defining \__keys_find_key_module:w on line ...
Defining \__keys_find_key_module:NNw on line ...
Defining \__keys_set_selective: on line ...
Defining \__keys_check_groups: on line ...
Defining \__keys_value_or_default:n on line ...
Expand Down
10 changes: 9 additions & 1 deletion l3kernel/testfiles/m3expl001.uptex.tlg
Expand Up @@ -3524,6 +3524,8 @@ Defining \l__keys_selective_seq on line ...
Defining \l__keys_unused_clist on line ...
Defining \l_keys_value_tl on line ...
Defining \l__keys_tmp_bool on line ...
Defining \l__keys_tmpa_tl on line ...
Defining \l__keys_tmpb_tl on line ...
Defining \keys_define:nn on line ...
Defining \__keys_define:nnn on line ...
Defining \__keys_define:onn on line ...
Expand Down Expand Up @@ -3556,6 +3558,8 @@ Defining \__keys_inherit:n on line ...
Defining \__keys_initialise:n on line ...
Defining \__keys_meta_make:n on line ...
Defining \__keys_meta_make:nn on line ...
Defining \__keys_prop_put:Nn on line ...
Defining \__keys_prop_put:cn on line ...
Defining \__keys_undefine: on line ...
Defining \__keys_value_requirement:nn on line ...
Defining \__keys_validate_forbidden: on line ...
Expand Down Expand Up @@ -3610,6 +3614,10 @@ Defining \key prop > .multichoices:nn on line ...
Defining \key prop > .multichoices:Vn on line ...
Defining \key prop > .multichoices:on on line ...
Defining \key prop > .multichoices:xn on line ...
Defining \key prop > .prop_put:N on line ...
Defining \key prop > .prop_put:c on line ...
Defining \key prop > .prop_gput:N on line ...
Defining \key prop > .prop_gput:c on line ...
Defining \key prop > .skip_set:N on line ...
Defining \key prop > .skip_set:c on line ...
Defining \key prop > .skip_gset:N on line ...
Expand Down Expand Up @@ -3671,7 +3679,7 @@ Defining \__keys_set_keyval:n on line ...
Defining \__keys_set_keyval:nn on line ...
Defining \__keys_set_keyval:nnn on line ...
Defining \__keys_set_keyval:onn on line ...
Defining \__keys_find_key_module:w on line ...
Defining \__keys_find_key_module:NNw on line ...
Defining \__keys_set_selective: on line ...
Defining \__keys_check_groups: on line ...
Defining \__keys_value_or_default:n on line ...
Expand Down
10 changes: 9 additions & 1 deletion l3kernel/testfiles/m3expl001.xetex.tlg
Expand Up @@ -3269,6 +3269,8 @@ Defining \l__keys_selective_seq on line ...
Defining \l__keys_unused_clist on line ...
Defining \l_keys_value_tl on line ...
Defining \l__keys_tmp_bool on line ...
Defining \l__keys_tmpa_tl on line ...
Defining \l__keys_tmpb_tl on line ...
Defining \keys_define:nn on line ...
Defining \__keys_define:nnn on line ...
Defining \__keys_define:onn on line ...
Expand Down Expand Up @@ -3301,6 +3303,8 @@ Defining \__keys_inherit:n on line ...
Defining \__keys_initialise:n on line ...
Defining \__keys_meta_make:n on line ...
Defining \__keys_meta_make:nn on line ...
Defining \__keys_prop_put:Nn on line ...
Defining \__keys_prop_put:cn on line ...
Defining \__keys_undefine: on line ...
Defining \__keys_value_requirement:nn on line ...
Defining \__keys_validate_forbidden: on line ...
Expand Down Expand Up @@ -3355,6 +3359,10 @@ Defining \key prop > .multichoices:nn on line ...
Defining \key prop > .multichoices:Vn on line ...
Defining \key prop > .multichoices:on on line ...
Defining \key prop > .multichoices:xn on line ...
Defining \key prop > .prop_put:N on line ...
Defining \key prop > .prop_put:c on line ...
Defining \key prop > .prop_gput:N on line ...
Defining \key prop > .prop_gput:c on line ...
Defining \key prop > .skip_set:N on line ...
Defining \key prop > .skip_set:c on line ...
Defining \key prop > .skip_gset:N on line ...
Expand Down Expand Up @@ -3416,7 +3424,7 @@ Defining \__keys_set_keyval:n on line ...
Defining \__keys_set_keyval:nn on line ...
Defining \__keys_set_keyval:nnn on line ...
Defining \__keys_set_keyval:onn on line ...
Defining \__keys_find_key_module:w on line ...
Defining \__keys_find_key_module:NNw on line ...
Defining \__keys_set_selective: on line ...
Defining \__keys_check_groups: on line ...
Defining \__keys_value_or_default:n on line ...
Expand Down
10 changes: 9 additions & 1 deletion l3kernel/testfiles/m3expl003.luatex.tlg
Expand Up @@ -3231,6 +3231,8 @@ Defining \l__keys_selective_seq on line ...
Defining \l__keys_unused_clist on line ...
Defining \l_keys_value_tl on line ...
Defining \l__keys_tmp_bool on line ...
Defining \l__keys_tmpa_tl on line ...
Defining \l__keys_tmpb_tl on line ...
Defining \keys_define:nn on line ...
Defining \__keys_define:nnn on line ...
Defining \__keys_define:onn on line ...
Expand Down Expand Up @@ -3263,6 +3265,8 @@ Defining \__keys_inherit:n on line ...
Defining \__keys_initialise:n on line ...
Defining \__keys_meta_make:n on line ...
Defining \__keys_meta_make:nn on line ...
Defining \__keys_prop_put:Nn on line ...
Defining \__keys_prop_put:cn on line ...
Defining \__keys_undefine: on line ...
Defining \__keys_value_requirement:nn on line ...
Defining \__keys_validate_forbidden: on line ...
Expand Down Expand Up @@ -3317,6 +3321,10 @@ Defining \key prop > .multichoices:nn on line ...
Defining \key prop > .multichoices:Vn on line ...
Defining \key prop > .multichoices:on on line ...
Defining \key prop > .multichoices:xn on line ...
Defining \key prop > .prop_put:N on line ...
Defining \key prop > .prop_put:c on line ...
Defining \key prop > .prop_gput:N on line ...
Defining \key prop > .prop_gput:c on line ...
Defining \key prop > .skip_set:N on line ...
Defining \key prop > .skip_set:c on line ...
Defining \key prop > .skip_gset:N on line ...
Expand Down Expand Up @@ -3378,7 +3386,7 @@ Defining \__keys_set_keyval:n on line ...
Defining \__keys_set_keyval:nn on line ...
Defining \__keys_set_keyval:nnn on line ...
Defining \__keys_set_keyval:onn on line ...
Defining \__keys_find_key_module:w on line ...
Defining \__keys_find_key_module:NNw on line ...
Defining \__keys_set_selective: on line ...
Defining \__keys_check_groups: on line ...
Defining \__keys_value_or_default:n on line ...
Expand Down

0 comments on commit 536c97d

Please sign in to comment.