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 @@
-![Version 0.9.0](https://img.shields.io/badge/version-0.9.0-blue)
+![Version 0.9.1](https://img.shields.io/badge/version-0.9.1-blue)
 
 ![Jason, the JSON parsing horse](https://github.com/jasperhabicht/jsonparse/assets/6378801/ddfddc70-bf5f-4121-ba45-4b9128875d85)
 

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.