texlive[72442] Master/texmf-dist: jsonparse (1oct24)
commits+karl at tug.org
commits+karl at tug.org
Tue Oct 1 21:51:04 CEST 2024
Revision: 72442
https://tug.org/svn/texlive?view=revision&revision=72442
Author: karl
Date: 2024-10-01 21:51:04 +0200 (Tue, 01 Oct 2024)
Log Message:
-----------
jsonparse (1oct24)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/jsonparse/README.md
trunk/Master/texmf-dist/doc/latex/jsonparse/jsonparse-doc.pdf
trunk/Master/texmf-dist/doc/latex/jsonparse/jsonparse-doc.tex
trunk/Master/texmf-dist/tex/latex/jsonparse/jsonparse.sty
Modified: trunk/Master/texmf-dist/doc/latex/jsonparse/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/jsonparse/README.md 2024-10-01 19:50:40 UTC (rev 72441)
+++ trunk/Master/texmf-dist/doc/latex/jsonparse/README.md 2024-10-01 19:51:04 UTC (rev 72442)
@@ -1,4 +1,4 @@
-
+

Modified: trunk/Master/texmf-dist/doc/latex/jsonparse/jsonparse-doc.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/jsonparse/jsonparse-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/jsonparse/jsonparse-doc.tex 2024-10-01 19:50:40 UTC (rev 72441)
+++ trunk/Master/texmf-dist/doc/latex/jsonparse/jsonparse-doc.tex 2024-10-01 19:51:04 UTC (rev 72442)
@@ -11,8 +11,8 @@
% This work has the LPPL maintenance status `maintained'.
%
\documentclass[a4paper]{article}
-\def\jsonparsefileversion{0.9.0}
-\def\jsonparsefiledate{27 August 2024}
+\def\jsonparsefileversion{0.9.1}
+\def\jsonparsefiledate{21 September 2024}
\usepackage[T1]{fontenc}
\usepackage{Alegreya}
@@ -201,6 +201,7 @@
\changes{v0.8.6}{2024/05/09}{Bug fix in nesting function.}
\changes{v0.8.7}{2024/08/08}{Corrections in documentation, error messages.}
\changes{v0.9.0}{2024/08/27}{Adaption to updated verbatim tokenization.}
+\changes{v0.9.1}{2024/09/21}{Added functions to test for valid JSON numbers.}
\begin{document}
\vspace*{-1cm}
@@ -461,7 +462,14 @@
These keys can be used to set the replacement text for the JSON escape sequences \macro{\b} (backspace), \macro{\f} (formfeed), \macro{\n} (linefeed), \macro{\r} (carriage return) and \macro{\t} (horizontal tab). The default replacement string is a space. Only strings can be used as replacement. These replacements take place only during typesetting.
These keys can be set using \macro{\JSONParseSet}. They can also be set locally as option to the commands \macro{\JSONParseValue}, \macro{\JSONParseArrayValues} and \macro{\JSONParseArrayValuesMap}.
+\begin{macrodef}
+|check num|
+|check num|={<boolean>}
+\end{macrodef}
+If set to \macro{false}, the key \macro{check num} omits an internal check of numerical expressions against the JSON specification for numbers. Turning off this feature can increase the parsing speed.
+This key can be set using \macro{\JSONParseSet}. It can also be set locally as option to the commands \macro{\JSONParse} and \macro{\JSONParseFromFile}.
+
\subsection{L3 commands}
\begin{macrodef}
@@ -479,6 +487,14 @@
\end{macrodef}
The command \macro{\jsonparse_parse_to_prop:Nn} processes the token variable given as the first arguments as property list and filters it according to the key given as second argument. Filtering means that for every entry in the property list, the key of this entry is compared against the key given to the command. If the key in the property list starts with the given key, the matching part is removed from the key in the property list. If the keys do not match, the entry is completely removed from the property list.
+\begin{macrodef}
+|\jsonparse_if_num:nTF| {<string>} {<true code>} {<false code>}
+|\jsonparse_if_num:nT| {<string>} {<true code>}
+|\jsonparse_if_num:nF| {<string>} {<false code>}
+|\jsonparse_if_num_p:n| {<string>}
+\end{macrodef}
+The command \macro{\jsonparse_if_num:nTF} checks whether a string is a valid JSON number according the relevant specification. It executes the true code if the string is a valid JSON number and the false code if not. The variants \macro{\jsonparse_if_num:nT} and \macro{\jsonparse_if_num:nF} work accordingly. The command \macro{\jsonparse_if_num_p:n} returns a boolean true or false.
+
% =====
\printchanges
Modified: trunk/Master/texmf-dist/tex/latex/jsonparse/jsonparse.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/jsonparse/jsonparse.sty 2024-10-01 19:50:40 UTC (rev 72441)
+++ trunk/Master/texmf-dist/tex/latex/jsonparse/jsonparse.sty 2024-10-01 19:51:04 UTC (rev 72442)
@@ -10,7 +10,7 @@
%
% This work has the LPPL maintenance status `maintained'.
%
-\ProvidesExplPackage {jsonparse} {2024-08-27} {0.9.0}
+\ProvidesExplPackage {jsonparse} {2024-09-21} {0.9.1}
{JSON Parse}
\bool_new:N \l__jsonparse_debug_mode_bool
@@ -64,7 +64,7 @@
\msg_new:nnn { jsonparse } { saving-external } {
\msg_info_text:n { jsonparse } \iow_newline:
- Saving ~ external ~ file: ~ #1.
+ Saving ~ to ~ external ~ file: ~ #1.
}
\msg_new:nnn { jsonparse } { loading-external } {
@@ -86,6 +86,7 @@
\str_new:N \l__jsonparse_false_str
\str_new:N \l__jsonparse_null_str
\bool_new:N \l__jsonparse_zero_based_bool
+\bool_new:N \l__jsonparse_check_num_bool
\bool_new:N \l__jsonparse_rescan_bool
\bool_new:N \l__jsonparse_externalize_bool
@@ -97,8 +98,7 @@
\clist_new:N \l__jsonparse_unused_keys_clist
-\clist_new:N \l__jsonparse_escape_tex_chars_clist
-\clist_set:Nn \l__jsonparse_escape_tex_chars_clist {
+\clist_const:Nn \c__jsonparse_escape_tex_chars_clist {
number_sign ,
dollar_sign ,
percent_sign ,
@@ -109,7 +109,7 @@
}
\str_new:N \l__jsonparse_escape_temp_str
-\clist_map_inline:Nn \l__jsonparse_escape_tex_chars_clist {
+\clist_map_inline:Nn \c__jsonparse_escape_tex_chars_clist {
\bool_new:c { l__jsonparse_escape_ #1 _bool }
}
@@ -133,6 +133,9 @@
zero-based .bool_set:N = \l__jsonparse_zero_based_bool ,
zero-based .default:n = { true } ,
zero-based .initial:n = { true } ,
+ 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 } ,
@@ -157,12 +160,12 @@
escape .code:n = {
\str_case:nnF {#1} {
{ all } {
- \clist_map_inline:Nn \l__jsonparse_escape_tex_chars_clist {
+ \clist_map_inline:Nn \c__jsonparse_escape_tex_chars_clist {
\bool_set_true:c { l__jsonparse_escape_ ##1 _bool }
}
}
{ none } {
- \clist_map_inline:Nn \l__jsonparse_escape_tex_chars_clist {
+ \clist_map_inline:Nn \c__jsonparse_escape_tex_chars_clist {
\bool_set_false:c { l__jsonparse_escape_ ##1 _bool }
}
}
@@ -292,6 +295,326 @@
% ===
+\tl_new:N \l__jsonparse_num_input_tl
+\tl_new:N \l__jsonparse_num_remainder_tl
+\tl_new:N \l__jsonparse_num_input_last_tl
+\bool_new:N \l__jsonparse_num_bool
+\bool_new:N \l__jsonparse_num_zero_seen_bool
+\bool_new:N \l__jsonparse_num_plus_minus_seen_bool
+\bool_new:N \l__jsonparse_num_fraction_seen_bool
+\bool_new:N \l__jsonparse_num_exponent_seen_bool
+\tl_new:N \l__jsonparse_num_input_tl
+\tl_new:N \l__jsonparse_num_remainder_tl
+\tl_new:N \l__jsonparse_num_input_last_tl
+\bool_new:N \l__jsonparse_num_bool
+\bool_new:N \l__jsonparse_num_zero_seen_bool
+\bool_new:N \l__jsonparse_num_plus_minus_seen_bool
+\bool_new:N \l__jsonparse_num_fraction_seen_bool
+\bool_new:N \l__jsonparse_num_exponent_seen_bool
+
+\clist_const:Nn \c__jsonparse_num_digits_clist {
+\clist_const:Nn \c__jsonparse_num_digits_clist {
+ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
+}
+
+\prg_new_conditional:Npnn \jsonparse_if_num:n #1 { p , T , F , TF } {
+ \bool_set_true:N \l__jsonparse_num_bool
+ \bool_set_false:N \l__jsonparse_num_zero_seen_bool
+ \bool_set_false:N \l__jsonparse_num_plus_minus_seen_bool
+ \bool_set_false:N \l__jsonparse_num_fraction_seen_bool
+ \bool_set_false:N \l__jsonparse_num_exponent_seen_bool
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { #1 }
+ \tl_if_empty:NTF \l__jsonparse_num_remainder_tl {
+ \bool_set_false:N \l__jsonparse_num_bool
+\prg_new_conditional:Npnn \jsonparse_if_num:n #1 { p , T , F , TF } {
+ \bool_set_true:N \l__jsonparse_num_bool
+ \bool_set_false:N \l__jsonparse_num_zero_seen_bool
+ \bool_set_false:N \l__jsonparse_num_plus_minus_seen_bool
+ \bool_set_false:N \l__jsonparse_num_fraction_seen_bool
+ \bool_set_false:N \l__jsonparse_num_exponent_seen_bool
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { #1 }
+ \tl_if_empty:NTF \l__jsonparse_num_remainder_tl {
+ \bool_set_false:N \l__jsonparse_num_bool
+ } {
+ \__jsonparse_parse_num:n {#1}
+ \__jsonparse_parse_num:n {#1}
+ }
+ \bool_lazy_any:nT {
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { + } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { . } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { e } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { E } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { + } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { . } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { e } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { E } }
+ } {
+ \bool_set_false:N \l__jsonparse_num_bool
+ \bool_set_false:N \l__jsonparse_num_bool
+ }
+ \bool_if:NTF \l__jsonparse_num_bool {
+ \bool_if:NTF \l__jsonparse_num_bool {
+ \prg_return_true:
+ } {
+ \prg_return_false:
+ }
+}
+
+\cs_new:Npn \__jsonparse_parse_num:n #1 {
+ \tl_set:Ne \l__jsonparse_num_input_tl { \tl_trim_spaces:e {#1} }
+ \tl_if_empty:NF \l__jsonparse_num_input_tl {
+ \cs_if_exist_use:cTF { __jsonparse_parse_num_ \str_head_ignore_spaces:o { \l__jsonparse_num_input_tl } :w } {
+ \l__jsonparse_num_input_tl \q_stop
+\cs_new:Npn \__jsonparse_parse_num:n #1 {
+ \tl_set:Ne \l__jsonparse_num_input_tl { \tl_trim_spaces:e {#1} }
+ \tl_if_empty:NF \l__jsonparse_num_input_tl {
+ \cs_if_exist_use:cTF { __jsonparse_parse_num_ \str_head_ignore_spaces:o { \l__jsonparse_num_input_tl } :w } {
+ \l__jsonparse_num_input_tl \q_stop
+ } {
+ \exp_last_unbraced:No
+ \__jsonparse_parse_num_other:w \l__jsonparse_num_input_tl \q_stop
+ \__jsonparse_parse_num_other:w \l__jsonparse_num_input_tl \q_stop
+ }
+ }
+}
+
+\cs_new:cpn { __jsonparse_parse_num_ + :w } #1 \q_stop {
+\cs_new:cpn { __jsonparse_parse_num_ + :w } #1 \q_stop {
+ \exp_last_unbraced:No
+ \__jsonparse_parse_num_plus_minus:w #1 \q_stop
+ \__jsonparse_parse_num_plus_minus:w #1 \q_stop
+}
+
+\cs_new:cpn { __jsonparse_parse_num_ - :w } #1 \q_stop {
+\cs_new:cpn { __jsonparse_parse_num_ - :w } #1 \q_stop {
+ \exp_last_unbraced:No
+ \__jsonparse_parse_num_plus_minus:w #1 \q_stop
+ \__jsonparse_parse_num_plus_minus:w #1 \q_stop
+}
+
+\cs_new:cpn { __jsonparse_parse_num_ . :w } #1 \q_stop {
+\cs_new:cpn { __jsonparse_parse_num_ . :w } #1 \q_stop {
+ \exp_last_unbraced:No
+ \__jsonparse_parse_num_fraction:w #1 \q_stop
+ \__jsonparse_parse_num_fraction:w #1 \q_stop
+}
+
+\cs_new:cpn { __jsonparse_parse_num_ e :w } #1 \q_stop {
+\cs_new:cpn { __jsonparse_parse_num_ e :w } #1 \q_stop {
+ \exp_last_unbraced:No
+ \__jsonparse_parse_num_exponent:w #1 \q_stop
+ \__jsonparse_parse_num_exponent:w #1 \q_stop
+}
+
+\cs_new:cpn { __jsonparse_parse_num_ E :w } #1 \q_stop {
+\cs_new:cpn { __jsonparse_parse_num_ E :w } #1 \q_stop {
+ \exp_last_unbraced:No
+ \__jsonparse_parse_num_exponent:w #1 \q_stop
+ \__jsonparse_parse_num_exponent:w #1 \q_stop
+}
+
+\clist_map_inline:Nn \c__jsonparse_num_digits_clist {
+ \cs_new:cpn { __jsonparse_parse_num_ #1 :w } ##1 \q_stop {
+\clist_map_inline:Nn \c__jsonparse_num_digits_clist {
+ \cs_new:cpn { __jsonparse_parse_num_ #1 :w } ##1 \q_stop {
+ \exp_last_unbraced:No
+ \__jsonparse_parse_num_digit:w ##1 \q_stop
+ \__jsonparse_parse_num_digit:w ##1 \q_stop
+ }
+}
+
+\cs_new:Npn \__jsonparse_parse_num_plus_minus:w #1 \q_stop {
+ \bool_if:NTF \l__jsonparse_num_plus_minus_seen_bool {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+\cs_new:Npn \__jsonparse_parse_num_plus_minus:w #1 \q_stop {
+ \bool_if:NTF \l__jsonparse_num_plus_minus_seen_bool {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ } {
+ \tl_if_empty:NTF \l__jsonparse_num_input_last_tl {
+ \tl_if_empty:NTF \l__jsonparse_num_input_last_tl {
+ \str_if_eq:enT { \tl_head:n {#1} } { + } {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ }
+ } {
+ \bool_lazy_any:nT {
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { + } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { . } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { e } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { E } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { + } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { . } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { e } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { E } }
+ } {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ }
+ }
+ }
+ \bool_set_true:N \l__jsonparse_num_plus_minus_seen_bool
+ \tl_set:Ne \l__jsonparse_num_input_last_tl { \tl_head:n {#1} }
+ \tl_set:Ne \l__jsonparse_num_remainder_tl { \tl_tail:n {#1} }
+ \__jsonparse_parse_num:n { \l__jsonparse_num_remainder_tl }
+ \bool_set_true:N \l__jsonparse_num_plus_minus_seen_bool
+ \tl_set:Ne \l__jsonparse_num_input_last_tl { \tl_head:n {#1} }
+ \tl_set:Ne \l__jsonparse_num_remainder_tl { \tl_tail:n {#1} }
+ \__jsonparse_parse_num:n { \l__jsonparse_num_remainder_tl }
+}
+
+\cs_new:Npn \__jsonparse_parse_num_fraction:w #1 \q_stop {
+ \bool_if:NTF \l__jsonparse_num_fraction_seen_bool {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+\cs_new:Npn \__jsonparse_parse_num_fraction:w #1 \q_stop {
+ \bool_if:NTF \l__jsonparse_num_fraction_seen_bool {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ } {
+ \tl_if_empty:NTF \l__jsonparse_num_input_last_tl {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ \tl_if_empty:NTF \l__jsonparse_num_input_last_tl {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ } {
+ \bool_lazy_any:nT {
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { + } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { . } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { e } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { E } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { + } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { . } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { e } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { E } }
+ } {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ }
+ }
+ }
+ \bool_set_false:N \l__jsonparse_num_zero_seen_bool
+ \bool_set_true:N \l__jsonparse_num_plus_minus_seen_bool
+ \bool_set_true:N \l__jsonparse_num_fraction_seen_bool
+ \tl_set:Ne \l__jsonparse_num_input_last_tl { \tl_head:n {#1} }
+ \tl_set:Ne \l__jsonparse_num_remainder_tl { \tl_tail:n {#1} }
+ \__jsonparse_parse_num:n { \l__jsonparse_num_remainder_tl }
+ \bool_set_false:N \l__jsonparse_num_zero_seen_bool
+ \bool_set_true:N \l__jsonparse_num_plus_minus_seen_bool
+ \bool_set_true:N \l__jsonparse_num_fraction_seen_bool
+ \tl_set:Ne \l__jsonparse_num_input_last_tl { \tl_head:n {#1} }
+ \tl_set:Ne \l__jsonparse_num_remainder_tl { \tl_tail:n {#1} }
+ \__jsonparse_parse_num:n { \l__jsonparse_num_remainder_tl }
+}
+
+\cs_new:Npn \__jsonparse_parse_num_exponent:w #1 \q_stop {
+ \bool_if:NTF \l__jsonparse_num_exponent_seen_bool {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+\cs_new:Npn \__jsonparse_parse_num_exponent:w #1 \q_stop {
+ \bool_if:NTF \l__jsonparse_num_exponent_seen_bool {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ } {
+ \tl_if_empty:NTF \l__jsonparse_num_input_last_tl {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ \tl_if_empty:NTF \l__jsonparse_num_input_last_tl {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ } {
+ \bool_lazy_any:nT {
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { + } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { . } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { e } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { E } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { + } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { . } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { e } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { E } }
+ } {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ }
+ }
+ }
+ \bool_set_false:N \l__jsonparse_num_zero_seen_bool
+ \bool_set_false:N \l__jsonparse_num_plus_minus_seen_bool
+ \bool_set_true:N \l__jsonparse_num_fraction_seen_bool
+ \bool_set_true:N \l__jsonparse_num_exponent_seen_bool
+ \tl_set:Ne \l__jsonparse_num_input_last_tl { \tl_head:n {#1} }
+ \tl_set:Ne \l__jsonparse_num_remainder_tl { \tl_tail:n {#1} }
+ \__jsonparse_parse_num:n { \l__jsonparse_num_remainder_tl }
+ \bool_set_false:N \l__jsonparse_num_zero_seen_bool
+ \bool_set_false:N \l__jsonparse_num_plus_minus_seen_bool
+ \bool_set_true:N \l__jsonparse_num_fraction_seen_bool
+ \bool_set_true:N \l__jsonparse_num_exponent_seen_bool
+ \tl_set:Ne \l__jsonparse_num_input_last_tl { \tl_head:n {#1} }
+ \tl_set:Ne \l__jsonparse_num_remainder_tl { \tl_tail:n {#1} }
+ \__jsonparse_parse_num:n { \l__jsonparse_num_remainder_tl }
+}
+
+\cs_new:Npn \__jsonparse_parse_num_digit:w #1 \q_stop {
+\cs_new:Npn \__jsonparse_parse_num_digit:w #1 \q_stop {
+ \bool_lazy_any:nTF {
+ { \tl_if_empty_p:N \l__jsonparse_num_input_last_tl }
+ { \tl_if_empty_p:N \l__jsonparse_num_input_last_tl }
+ { \bool_lazy_and_p:nn
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } }
+ { \bool_not_p:n { \l__jsonparse_num_exponent_seen_bool } }
+ { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } }
+ { \bool_not_p:n { \l__jsonparse_num_exponent_seen_bool } }
+ }
+ } {
+ \str_if_eq:enT { \tl_head:n {#1} } { 0 } {
+ \bool_set_true:N \l__jsonparse_num_zero_seen_bool
+ \bool_set_true:N \l__jsonparse_num_zero_seen_bool
+ }
+ } {
+ \bool_if:NT \l__jsonparse_num_zero_seen_bool {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ \bool_if:NT \l__jsonparse_num_zero_seen_bool {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+ }
+ }
+ \tl_set:Ne \l__jsonparse_num_input_last_tl { \tl_head:n {#1} }
+ \tl_set:Ne \l__jsonparse_num_remainder_tl { \tl_tail:n {#1} }
+ \__jsonparse_parse_num:n { \l__jsonparse_num_remainder_tl }
+ \tl_set:Ne \l__jsonparse_num_input_last_tl { \tl_head:n {#1} }
+ \tl_set:Ne \l__jsonparse_num_remainder_tl { \tl_tail:n {#1} }
+ \__jsonparse_parse_num:n { \l__jsonparse_num_remainder_tl }
+}
+
+\cs_new:Npn \__jsonparse_parse_num_other:w #1 \q_stop {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+\cs_new:Npn \__jsonparse_parse_num_other:w #1 \q_stop {
+ \tl_set:Nn \l__jsonparse_num_remainder_tl { }
+ \bool_set_false:N \l__jsonparse_num_bool
+}
+
+% ===
+
\cs_new_protected:Npn \jsonparse_parse_to_prop:Nn #1#2 {
\bool_if:NT \l__jsonparse_debug_mode_bool {
\msg_log:nne { jsonparse } { debug-info } {
@@ -491,11 +814,24 @@
\cs_new:Npn \__jsonparse_parse_other_aux:w #1 , #2 \q_stop {
\tl_set:Ne \l__jsonparse_temp_tl { \tl_trim_spaces:n {#1} }
\cs_if_exist_use:cF { __jsonparse_parse_ \str_casefold:o { \l__jsonparse_temp_tl } : } {
- \fp_if_nan:nTF {#1} {
- % nan
- \msg_error:nnoo { jsonparse } { parsing-error }
- { \l__jsonparse_key_tl } {#1}
- } {
+ \bool_if:NTF \l__jsonparse_check_num_bool {
+ \jsonparse_if_num:nTF {#1} {
+ \tl_set:Nn \l__jsonparse_val_tl {#1}
+ \prop_gput:Nee \g_jsonparse_entries_prop
+ { \l__jsonparse_key_tl } { \l__jsonparse_val_tl }
+ % number
+ \bool_if:NT \l__jsonparse_debug_mode_bool {
+ \msg_log:nne { jsonparse } { debug-info } {
+ (key) ~ \str_use:N \l__jsonparse_key_tl : \iow_newline:
+ \iow_char:N \ \iow_char:N \ (num) ~ \str_use:N \l__jsonparse_val_tl
+ }
+ }
+ } {
+ % not a valid JSON fp
+ \msg_error:nnoo { jsonparse } { parsing-error }
+ { \l__jsonparse_key_tl } {#1}
+ }
+ } {
\tl_set:Nn \l__jsonparse_val_tl {#1}
\prop_gput:Nee \g_jsonparse_entries_prop
{ \l__jsonparse_key_tl } { \l__jsonparse_val_tl }
More information about the tex-live-commits
mailing list.