diff --git a/CHANGES.md b/CHANGES.md index 6d2937bf..0eb1066d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,13 @@ # Changes +## 3.14.0 (2026-01-XX) + +Development: + +- Support the new prepending (`^=`) and the appending (`$=`) operators for + renderers and renderer prototypes. (proposed by @witiko in #232, added by + @witiko in #617) + ## 3.13.0 (2026-01-02) Fixes: diff --git a/markdown.dtx b/markdown.dtx index 64f6b0a6..326d966d 100644 --- a/markdown.dtx +++ b/markdown.dtx @@ -21729,6 +21729,8 @@ following text: } \tl_new:N \l_@@_renderer_definition_tl +\bool_new:N + \g_@@_prepending_renderer_bool \bool_new:N \g_@@_appending_renderer_bool \bool_new:N @@ -21746,16 +21748,28 @@ following text: { \cP\#0 } { #1 } \l_@@_renderer_definition_tl - \bool_if:NT - \g_@@_appending_renderer_bool + \bool_if:nT + { + \g_@@_prepending_renderer_bool || + \g_@@_appending_renderer_bool + } { \@@_tl_set_from_cs:NNn \l_tmpa_tl #2 { #3 } - \tl_put_left:NV - \l_@@_renderer_definition_tl - \l_tmpa_tl + \bool_if:NTF + \g_@@_prepending_renderer_bool + { + \tl_put_right:NV + \l_@@_renderer_definition_tl + \l_tmpa_tl + } + { + \tl_put_left:NV + \l_@@_renderer_definition_tl + \l_tmpa_tl + } } \bool_if:NTF \g_@@_unprotected_renderer_bool @@ -21888,9 +21902,15 @@ following text: \l_@@_renderer_glob_definition_tl \seq_new:N \l_@@_renderer_glob_results_seq +\regex_const:Nn + \c_@@_prepending_key_regex + { \^$ } \regex_const:Nn \c_@@_appending_key_regex - { \s*+$ } + { [\$+]$ } +\regex_const:Nn + \c_@@_prepending_or_appending_key_regex + { [\^\$+]$ } \keys_define:nn { markdown/options/renderers } { @@ -21899,14 +21919,15 @@ following text: % \begin{markdown} % % Besides defining renderers at once, we can also define them incrementally -% using the appending operator (`+=`). This can be especially useful in -% defining rules for processing different \acro{HTML} class names and -% identifiers: +% using the prepending (`^=`) and appending (`$=` or `+=`) operators. This +% can be especially useful in defining rules for processing different +% \acro{HTML} class names and identifiers: % ``` tex % \markdownSetup{ % renderers = { % \% Start with empty renderers. -% headerAttributeContextBegin = {}, +% headerAttributeContextBegin = \begingroup, +% headerAttributeContextEnd = \endgroup, % attributeClassName = {}, % attributeIdentifier = {}, % \% Define the processing of a single specific HTML class name. @@ -21932,17 +21953,31 @@ following text: % \end{markdown} % \begin{macrocode} % TODO: Use `\regex_if_match` in TeX Live 2025. - \regex_match:NVTF + \regex_match:NVT + \c_@@_prepending_key_regex + \l_keys_key_str + { + \bool_gset_true:N + \g_@@_prepending_renderer_bool + } + % TODO: Use `\regex_if_match` in TeX Live 2025. + \regex_match:NVT \c_@@_appending_key_regex \l_keys_key_str { \bool_gset_true:N \g_@@_appending_renderer_bool + } + % TODO: Use `\regex_if_match` in TeX Live 2025. + \regex_match:NVTF + \c_@@_prepending_or_appending_key_regex + \l_keys_key_str + { \tl_set:NV \l_tmpa_tl \l_keys_key_str \regex_replace_once:NnN - \c_@@_appending_key_regex + \c_@@_prepending_or_appending_key_regex { } \l_tmpa_tl \tl_set:Nx @@ -21954,6 +21989,8 @@ following text: \keys_set:nV { markdown/options/renderers } \l_tmpb_tl + \bool_gset_false:N + \g_@@_prepending_renderer_bool \bool_gset_false:N \g_@@_appending_renderer_bool } @@ -22047,7 +22084,7 @@ following text: % TODO: Use `\regex_if_match` in TeX Live 2025. \regex_match:Nn % noqa: w202 { NV } - { TF } + { T, TF } \prop_new:N \g_@@_glob_cache_prop \tl_new:N @@ -22568,6 +22605,8 @@ following text: } \tl_new:N \l_@@_renderer_prototype_definition_tl +\bool_new:N + \g_@@_prepending_renderer_prototype_bool \bool_new:N \g_@@_appending_renderer_prototype_bool \bool_new:N @@ -22585,16 +22624,28 @@ following text: { \cP\#0 } { #1 } \l_@@_renderer_prototype_definition_tl - \bool_if:NT - \g_@@_appending_renderer_prototype_bool + \bool_if:nT + { + \g_@@_prepending_renderer_prototype_bool || + \g_@@_appending_renderer_prototype_bool + } { \@@_tl_set_from_cs:NNn \l_tmpa_tl #2 { #3 } - \tl_put_left:NV - \l_@@_renderer_prototype_definition_tl - \l_tmpa_tl + \bool_if:NTF + \g_@@_prepending_renderer_prototype_bool + { + \tl_put_right:NV + \l_@@_renderer_prototype_definition_tl + \l_tmpa_tl + } + { + \tl_put_left:NV + \l_@@_renderer_prototype_definition_tl + \l_tmpa_tl + } } \bool_if:NTF \g_@@_unprotected_renderer_prototype_bool @@ -22670,14 +22721,15 @@ following text: % \begin{markdown} % % Besides defining renderer prototypes at once, we can also define them -% incrementally using the appending operator (`+=`). This can be especially -% useful in defining rules for processing different \acro{HTML} class names -% and identifiers: +% incrementally using the prepending (`^=`) and appending (`$=` or `+=`) +% operators. This can be especially useful in defining rules for processing +% different \acro{HTML} class names and identifiers: % ``` tex % \markdownSetup{ % rendererPrototypes = { % \% Start with empty renderer prototypes. -% headerAttributeContextBegin = {}, +% headerAttributeContextBegin = \begingroup, +% headerAttributeContextEnd = \endgroup, % attributeClassName = {}, % attributeIdentifier = {}, % \% Define the processing of a single specific HTML class name. @@ -22703,17 +22755,31 @@ following text: % \end{markdown} % \begin{macrocode} % TODO: Use `\regex_if_match` in TeX Live 2025. - \regex_match:NVTF + \regex_match:NVT + \c_@@_prepending_key_regex + \l_keys_key_str + { + \bool_gset_true:N + \g_@@_prepending_renderer_prototype_bool + } + % TODO: Use `\regex_if_match` in TeX Live 2025. + \regex_match:NVT \c_@@_appending_key_regex \l_keys_key_str { \bool_gset_true:N \g_@@_appending_renderer_prototype_bool + } + % TODO: Use `\regex_if_match` in TeX Live 2025. + \regex_match:NVTF + \c_@@_prepending_or_appending_key_regex + \l_keys_key_str + { \tl_set:NV \l_tmpa_tl \l_keys_key_str \regex_replace_once:NnN - \c_@@_appending_key_regex + \c_@@_prepending_or_appending_key_regex { } \l_tmpa_tl \tl_set:Nx @@ -22725,6 +22791,8 @@ following text: \keys_set:nV { markdown/options/renderer-prototypes } \l_tmpb_tl + \bool_gset_false:N + \g_@@_prepending_renderer_prototype_bool \bool_gset_false:N \g_@@_appending_renderer_prototype_bool } diff --git a/tests/support/keyval-setup.tex b/tests/support/keyval-setup.tex index b6784819..1c2e1088 100644 --- a/tests/support/keyval-setup.tex +++ b/tests/support/keyval-setup.tex @@ -81,10 +81,14 @@ codeSpan = {% \TYPE{#0: #1}}, (link|image) = {% - \TYPE{BEGIN #0}% - \TYPE{- label: #1}% - \TYPE{- URI: #3}% - \TYPE{- title: #4}% + \TYPE{- URI: #3}}, + (link|image) ^= {% + \TYPE{- label: #1}}, + (link|image) ^= {% + \TYPE{BEGIN #0}}, + (link|image) $= {% + \TYPE{- title: #4}}, + (link|image) $= {% \TYPE{END #0}}, contentBlock(|OnlineImage) = {% \TYPE{BEGIN #0}%