diff options
Diffstat (limited to 'macros/latex/contrib/jsonparse/jsonparse.sty')
-rw-r--r-- | macros/latex/contrib/jsonparse/jsonparse.sty | 81 |
1 files changed, 53 insertions, 28 deletions
diff --git a/macros/latex/contrib/jsonparse/jsonparse.sty b/macros/latex/contrib/jsonparse/jsonparse.sty index 0a401ee9bf..f2a37013c2 100644 --- a/macros/latex/contrib/jsonparse/jsonparse.sty +++ b/macros/latex/contrib/jsonparse/jsonparse.sty @@ -10,7 +10,7 @@ % % This work has the LPPL maintenance status `maintained'. % -\ProvidesExplPackage {jsonparse} {2025-01-26} {1.0.3} +\ProvidesExplPackage {jsonparse} {2025-01-30} {1.1.0} {A handy way to parse, store and access JSON data from files or strings in LaTeX documents} \msg_new:nnn { jsonparse } { old-kernel } { @@ -125,6 +125,9 @@ \str_new:N \l__jsonparse_carriage_return_str \str_new:N \l__jsonparse_horizontal_tab_str +\tl_new:N \l__jsonparse_map_before_tl +\tl_new:N \l__jsonparse_map_after_tl + \clist_new:N \l__jsonparse_unused_keys_clist \clist_const:Nn \c__jsonparse_escape_tex_chars_clist { @@ -165,13 +168,13 @@ check ~ num .bool_set:N = \l__jsonparse_check_num_bool , check ~ num .default:n = { true } , check ~ num .initial:n = { true } , - replace .code:n = { \keys_set:nn { jsonparse / parse / replace } {#1} } , - replace / true .str_set:N = \l__jsonparse_true_str , - replace / true .initial:n = { true } , - replace / false .str_set:N = \l__jsonparse_false_str , - replace / false .initial:n = { false } , - replace / null .str_set:N = \l__jsonparse_null_str , - replace / null .initial:n = { null } + keyword .code:n = { \keys_set:nn { jsonparse / parse / keyword } {#1} } , + keyword / true .str_set:N = \l__jsonparse_true_str , + keyword / true .initial:n = { true } , + keyword / false .str_set:N = \l__jsonparse_false_str , + keyword / false .initial:n = { false } , + keyword / null .str_set:N = \l__jsonparse_null_str , + keyword / null .initial:n = { null } } \keys_define:nn { jsonparse / typeset } { @@ -233,7 +236,9 @@ rescan .bool_set:N = \l__jsonparse_rescan_bool , rescan .default:n = { true } , rescan .initial:n = { true } , - rescan .groups:n = { output } + rescan .groups:n = { output } , + code ~ before .tl_set:N = \l__jsonparse_map_before_tl , + code ~ after .tl_set:N = \l__jsonparse_map_after_tl } \cs_new_protected:Npn \__jsonparse_warning_unused_keys: { @@ -1054,6 +1059,7 @@ \prg_return_false: } } +\prg_generate_conditional_variant:Nnn \jsonparse_unicode_if_high_surrogate:n { e } { p , T , F , TF } \prg_new_conditional:Npnn \jsonparse_unicode_if_low_surrogate:n #1 { p , T , F , TF } { \int_compare:nNnTF {#1} > { "DBFF } { @@ -1066,10 +1072,12 @@ \prg_return_false: } } +\prg_generate_conditional_variant:Nnn \jsonparse_unicode_if_low_surrogate:n { e } { p , T , F , TF } \cs_new:Npn \jsonparse_unicode_convert_surrogate_pair:nn #1#2 { \int_eval:n { ( #1 - "D800 ) * "0400 + ( #2 - "DC00 ) + "10000 } } +\cs_generate_variant:Nn \jsonparse_unicode_convert_surrogate_pair:nn { ee } \cs_new:Npn \__jsonparse_unicode_char:NNNNN #1#2#3#4#5 { \__jsonparse_unicode_char_aux:nNNNN { } #1#2#3#4 @@ -1082,13 +1090,14 @@ \cs_new:Npn \__jsonparse_unicode_char_aux:nNNNN #1#2#3#4#5 { \tl_if_empty:nTF {#1} { - \exp_args:Ne \jsonparse_unicode_if_high_surrogate:nF { " \str_uppercase:n {#2#3#4#5} } { + \jsonparse_unicode_if_high_surrogate:eF { " \str_uppercase:n {#2#3#4#5} } { \exp_args:Ne \codepoint_generate:nn { " \str_uppercase:n {#2#3#4#5} } { 12 } } } { - \exp_args:Ne \jsonparse_unicode_if_low_surrogate:nTF { " \str_uppercase:n {#2#3#4#5} } { + \jsonparse_unicode_if_low_surrogate:eTF { " \str_uppercase:n {#2#3#4#5} } { \codepoint_generate:nn { - \exp_args:Nne \jsonparse_unicode_convert_surrogate_pair:nn {#1} { " \str_uppercase:n {#2#3#4#5} } + \jsonparse_unicode_convert_surrogate_pair:ee + { \str_uppercase:n {#1} } { " \str_uppercase:n {#2#3#4#5} } } { 12 } } { \exp_args:Ne \codepoint_generate:nn { " \str_uppercase:n {#2#3#4#5} } { 12 } @@ -1274,7 +1283,7 @@ \tl_set:NV #1 \l__jsonparse_array_count_int } -\cs_new_protected:Npn \__jsonparse_array_values:n #1 { +\cs_new_protected:Npn \__jsonparse_array_use:n #1 { \bool_if:NTF \l__jsonparse_prop_map_first_bool { \bool_set_false:N \l__jsonparse_prop_map_first_bool } { @@ -1313,7 +1322,7 @@ } } -\NewDocumentCommand { \JSONParseArrayValues } { O{} m m O{} m } { +\NewDocumentCommand { \JSONParseArrayUse } { O{} m m O{} m } { \__jsonparse_warning_undefined_prop:N #2 \group_begin: \keys_set_known:nn { jsonparse / typeset } {#1} \l__jsonparse_unused_keys_clist @@ -1325,15 +1334,19 @@ \tl_set:Nn \l__jsonparse_array_values_insert_tl {#5} \bool_set_true:N \l__jsonparse_prop_map_first_bool \int_step_function:nN { \l__jsonparse_array_count_int } - \__jsonparse_array_values:n + \__jsonparse_array_use:n \group_end: } +% backward compatibility +\cs_set_eq:NN \JSONParseArrayValues \JSONParseArrayUse +% === + \tl_new:N \JSONParseArrayIndex \tl_new:N \JSONParseArrayKey \tl_new:N \JSONParseArrayValue -\cs_new_protected:Npn \__jsonparse_array_values_map_keys:n #1 { +\cs_new_protected:Npn \__jsonparse_array_map_function_keys:n #1 { \int_incr:N \l__jsonparse_array_keys_index_int \tl_set:Ne \l__jsonparse_array_keys_index_roman_tl { \int_to_Roman:n { \l__jsonparse_array_keys_index_int } @@ -1370,7 +1383,9 @@ } } -\cs_new_protected:Npn \__jsonparse_array_values_map:n #1 { +\cs_new:Npn \__jsonparse_array_map_function_cs: { } + +\cs_new_protected:Npn \__jsonparse_array_map_function:n #1 { \bool_if:NTF \l__jsonparse_zero_based_bool { \tl_gset:Nn \JSONParseArrayIndex { \int_eval:n { #1 - 1 } } } { @@ -1404,14 +1419,14 @@ } { \int_zero:N \l__jsonparse_array_keys_index_int \clist_map_function:NN \l__jsonparse_array_map_keys_clist - \__jsonparse_array_values_map_keys:n + \__jsonparse_array_map_function_keys:n \tl_gset_eq:NN \JSONParseArrayKey \JSONParseArrayKeyI \tl_gset_eq:NN \JSONParseArrayValue \JSONParseArrayValueI } - \use:c { \l__jsonparse_array_map_function_str } + \__jsonparse_array_map_function_cs: } -\cs_set_protected:Npn \__jsonparse_array_map_generate_cs:n #1 { +\cs_set_protected:Npn \__jsonparse_array_map_function_generate_cs:n #1 { \int_incr:N \l__jsonparse_array_keys_index_int \tl_set:Ne \l__jsonparse_array_keys_index_roman_tl { \int_to_Roman:n { \l__jsonparse_array_keys_index_int } @@ -1424,11 +1439,11 @@ } } -\NewDocumentCommand { \JSONParseArrayValuesMap } { O{} m m O{} m O{} O{} } { +\NewDocumentCommand { \JSONParseArrayMapFunction } { O{} m m O{} m } { \__jsonparse_warning_undefined_prop:N #2 - \cs_if_exist:cF {#5} { + \cs_if_exist:NF #5 { \msg_error:nne { jsonparse } { cs-undefined } - { \c_backslash_str #5 } + {#5} } \group_begin: \keys_set_known:nn { jsonparse / typeset } {#1} \l__jsonparse_unused_keys_clist @@ -1437,19 +1452,29 @@ \jsonparse_filter:Nn \l__jsonparse_temp_tl {#3} \jsonparse_array_count:NN \l__jsonparse_temp_tl \l__jsonparse_array_count_int \clist_set:Nn \l__jsonparse_array_map_keys_clist {#4} - \str_set:Nn \l__jsonparse_array_map_function_str {#5} + \cs_set_eq:NN \__jsonparse_array_map_function_cs: #5 \clist_if_empty:NF \l__jsonparse_array_map_keys_clist { \int_zero:N \l__jsonparse_array_keys_index_int \clist_map_function:NN \l__jsonparse_array_map_keys_clist - \__jsonparse_array_map_generate_cs:n + \__jsonparse_array_map_function_generate_cs:n } - #6 + \l__jsonparse_map_before_tl \int_step_function:nN { \l__jsonparse_array_count_int } - \__jsonparse_array_values_map:n - #7 + \__jsonparse_array_map_function:n + \l__jsonparse_map_after_tl \group_end: } +% backward compatibility +\cs_new:Npn \__jsonparse_array_map_function_cs_compat: { } + +\NewDocumentCommand { \JSONParseArrayValuesMap } { O{} m m O{} m O{} O{} } { + \cs_set_eq:Nc \__jsonparse_array_map_function_cs_compat: {#5} + \JSONParseArrayMapFunction [ #1 , code ~ before = {#6} , code ~ after = {#7} ] + {#2} {#3} [#4] { \__jsonparse_array_map_function_cs_compat: } +} +% === + \cs_new:Npn \__jsonparse_array_map_inline:n #1 { } \NewDocumentCommand { \JSONParseArrayMapInline } { m m +m } { |