summaryrefslogtreecommitdiff
path: root/macros/generic
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-08-31 03:03:30 +0000
committerNorbert Preining <norbert@preining.info>2024-08-31 03:03:30 +0000
commit25b0c606f5baf7e7316c653d3aff1043a415e5e9 (patch)
tree1ab9335897e194b0dcec64d88a135db312b1c300 /macros/generic
parent921cd4745581e821cc2e518227d97f6f2642c57e (diff)
CTAN sync 202408310303
Diffstat (limited to 'macros/generic')
-rw-r--r--macros/generic/markdown/CHANGES.md53
-rw-r--r--macros/generic/markdown/README.md60
-rw-r--r--macros/generic/markdown/VERSION2
-rw-r--r--macros/generic/markdown/docstrip.cfg6
-rw-r--r--macros/generic/markdown/examples/optex.tex3
-rw-r--r--macros/generic/markdown/markdown.dtx4123
-rw-r--r--macros/generic/markdown/markdown.html868
-rw-r--r--macros/generic/markdown/markdown.ins7
-rw-r--r--macros/generic/markdown/markdown.pdfbin1114115 -> 1145678 bytes
9 files changed, 3170 insertions, 1952 deletions
diff --git a/macros/generic/markdown/CHANGES.md b/macros/generic/markdown/CHANGES.md
index 922aadff91..3e081c8c2c 100644
--- a/macros/generic/markdown/CHANGES.md
+++ b/macros/generic/markdown/CHANGES.md
@@ -1,5 +1,58 @@
# Changes
+## 3.7.0 (2024-08-30)
+
+Development:
+
+- Add renderer `jekyllDataProgrammaticString` for processing YAML
+ string scalars that do not contain markdown markup and are not
+ intended for typesetting.
+ (istqborg/istqb_product_base#46, #440, #451, sponsored by @istqborg)
+- Add option `ensureJekyllData` for processing standalone YAML files.
+- Add renderers `warning` and `error` that represent warnings and errors
+ produced by the markdown parser. (#452, #473)
+- Support user-defined LaTeX environments with LaTeX markup.
+ (#20, #477, suggested by @cdupont)
+
+Fixes:
+
+- Produce more meaningful error message when KPathSea fails to
+ locate a file. (#458, #472, 33e6eef2, reported by @Yggdrasil128)
+- Fix soft line breaks in citation prenotes and postnotes.
+ (#483, #484, contributed by @lostenderman)
+
+Speed improvements:
+
+- Precompile snippets to improve the speed of setting them.
+ (#467, #479, inspired by the TUG 2024 talk by @josephwright)
+- Use an optimized parser to determine Unicode punctuation.
+ (#458, #474, #482, 4c1a7de2, co-authored by @Yggdrasil128,
+ sponsored by @istqborg)
+ This improves the speed of parsing markdown input by up to 500%.
+- Enable option `eagerCache` by default. (#468, #490, sponsored by @istqborg)
+ This improves the speed by up to 25% for large documents with many
+ markdown fragments that require multiple compilation runs.
+- Prevent loading the full Markdown package when converting cached markdown
+ fragments. (#487, #491, 40f0803f, 6609d43d, sponsored by @istqborg)
+ This significantly improves the speed for large documents with many
+ markdown fragments that require multiple compilation runs in pdfTeX.
+
+Deprecation:
+
+- Deprecate `jekyllDataString` renderer and renderer prototype.
+ Users should use `jekyllDataTypographicString` instead.
+ (istqborg/istqb_product_base#46, #440, #451, sponsored by @istqborg)
+
+Continuous Integration:
+
+- Ensure that all code lines are shorter than 72 characters.
+ (#478, e7160d60, 3ac95efe)
+
+Experiments:
+
+- Measure the speed of the Markdown package across recent versions.
+ (249552e5, 55ede824, efeaecbe, #474, 7b2b2431, fcf0064c)
+
## 3.6.2 (2024-07-14)
Fixes:
diff --git a/macros/generic/markdown/README.md b/macros/generic/markdown/README.md
index 2a02ee9736..5622e4e4c1 100644
--- a/macros/generic/markdown/README.md
+++ b/macros/generic/markdown/README.md
@@ -194,7 +194,7 @@ For further information, consult one of the following:
- [Attributes in Markdown][tb136],
- [Markdown 3 at TUG 2023: Reflections from the Q&A session][tb138],
- Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching ([preprint][tb139]), and
- - Markdown Themes in Practice ([preprint][tb140]).
+ - Markdown Themes in Practice ([preprint][tb140-preprint], [work in progress][tb140]).
5. Journal articles published by [CSTUG Bulletin][csbul] (in Czech and Slovak):
- [Rendering Markdown inside TeX Documents][10.5300/2016-1-4/78],
- [Markdown 2.8.1: Boldly Unto the Throne of Lightweight Markup in TeX][10.5300/2020-1-2/48],
@@ -204,11 +204,12 @@ For further information, consult one of the following:
- [Markdown 3: What's New, What's Next?][10.5300/2023-3-4/111].
6. Talks:
- [Five Years of Markdown in LaTeX: What, Why, How, and Whereto][pv212-fall2020] (in Czech),
- - [Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX][tb131-video] ([slides][tb131-slides]),
+ - [Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX][tb131-video] ([mirror][tb131-video-mirror], [slides][tb131-slides]),
- [A Self-Publisher's Take on Markdown and TeX][tb134-01-video] ([slides][tb134-01-slides]),
- [A Gentle Introduction to Markdown for Writers][tb134-02-video] ([slides][tb134-02-slides], [example][tb134-02-example]),
- - [Markdown 3: What's New, What's Next?][tb137-video] ([slides][tb137-slides]), and
- - An Implementation of the CommonMark Standard and new Syntax Extensions to the Markdown Package for TeX ([slides][gencur-defense-slides]).
+ - [Markdown 3: What's New, What's Next?][tb137-video] ([mirror][tb137-video-mirror], [slides][tb137-slides]),
+ - An Implementation of the CommonMark Standard and new Syntax Extensions to the Markdown Package for TeX ([slides][gencur-defense-slides]), and
+ - [Markdown Themes in Practice][tb140-video] ([preprint][tb140-preprint], [slides][tb140-slides])
7. Theses:
- [Generic TeX Writer for the Pandoc Document Converter][thesis-umhg5]
- [An implementation of the CommonMark standard into the Markdown package for TeX][thesis-r7z7l]
@@ -220,26 +221,31 @@ For further information, consult one of the following:
[overleaf-5]: https://www.overleaf.com/latex/examples/writing-posters-with-markdown/jtbgmmgqrqmh "Writing Posters with Markdown"
[overleaf-6]: https://www.overleaf.com/latex/examples/using-markdown-in-latex-documents/whdrnpcpnwrm "Using Markdown in LaTeX documents"
- [tb119]: https://www.tug.org/TUGboat/tb38-2/tb119novotny.pdf "Using Markdown inside TeX documents"
- [tb124]: https://www.tug.org/TUGboat/tb40-1/tb124novotny-markdown.pdf "Markdown 2.7.0: Towards lightweight markup in TeX"
- [tb129]: https://www.tug.org/TUGboat/tb41-3/tb129novotny-frozen.pdf "Making Markdown into a Microwave Meal"
- [tb131]: https://www.tug.org/TUGboat/tb42-2/tb131novotny-markdown.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX"
- [tb133]: https://www.tug.org/TUGboat/tb43-1/tb133novotny-markdown.pdf "Markdown 2.15.0: What's New?"
- [tb135]: https://www.tug.org/TUGboat/tb43-3/tb135novotny-markdown.pdf "Markdown 2.17.1: What's New, What's Next?"
- [tb136]: https://www.tug.org/TUGboat/tb44-1/tb136novotny-markdown-attr.pdf "Attributes in Markdown"
- [tb138]: https://www.tug.org/TUGboat/tb44-3/tb138starynovotny-markdown-qa.pdf "Markdown 3 at TUG 2023: Reflections from the Q&A session"
- [tb139]: https://github.com/Witiko/fast-regression-testing/releases/download/latest/tb139starynovotny-testing.pdf "Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching"
- [tb140]: https://www.tug.org/tug2024/preprints/starynovotny-markdown-themes.pdf "Markdown Themes in Practice"
-
- [tb131-slides]: https://tug.org/tug2021/assets/pdf/tug2021-novotny-slides.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX"
- [tb131-video]: https://youtu.be/i2GJMnLCZls "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX"
- [tb134-01-slides]: https://tug.org/tug2022/assets/served/Lloyd_Prentice-TUG2022-prentice-selfpub-slides.pdf "A Self-Publisher's Take on Markdown and TeX"
- [tb134-01-video]: https://youtu.be/OhwzT3TcLj8 "A Self-Publisher's Take on Markdown and TeX"
- [tb134-02-slides]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-slides.pdf "A Gentle Introduction to Markdown for Writers"
- [tb134-02-example]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-example.pdf "A Gentle Introduction to Markdown for Writers"
- [tb134-02-video]: https://youtu.be/FhN_x9rsR4M "A Gentle Introduction to Markdown for Writers"
- [tb137-slides]: https://tug.org/tug2023/files/sa-03-novotny-markdown3/novotny-markdown3-slides.pdf "Markdown 3: What's New, What's Next?"
- [tb137-video]: https://youtu.be/U8XjTOhJkg0 "Markdown 3: What's New, What's Next?"
+ [tb119]: https://www.tug.org/TUGboat/tb38-2/tb119novotny.pdf "Using Markdown inside TeX documents"
+ [tb124]: https://www.tug.org/TUGboat/tb40-1/tb124novotny-markdown.pdf "Markdown 2.7.0: Towards lightweight markup in TeX"
+ [tb129]: https://www.tug.org/TUGboat/tb41-3/tb129novotny-frozen.pdf "Making Markdown into a Microwave Meal"
+ [tb131]: https://www.tug.org/TUGboat/tb42-2/tb131novotny-markdown.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX"
+ [tb133]: https://www.tug.org/TUGboat/tb43-1/tb133novotny-markdown.pdf "Markdown 2.15.0: What's New?"
+ [tb135]: https://www.tug.org/TUGboat/tb43-3/tb135novotny-markdown.pdf "Markdown 2.17.1: What's New, What's Next?"
+ [tb136]: https://www.tug.org/TUGboat/tb44-1/tb136novotny-markdown-attr.pdf "Attributes in Markdown"
+ [tb138]: https://www.tug.org/TUGboat/tb44-3/tb138starynovotny-markdown-qa.pdf "Markdown 3 at TUG 2023: Reflections from the Q&A session"
+ [tb139]: https://github.com/Witiko/fast-regression-testing/releases/download/latest/tb139starynovotny-testing.pdf "Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching"
+ [tb140]: https://github.com/Witiko/markdown-themes-in-practice/releases/download/latest/tb140starynovotny-markdown-themes.pdf "Markdown Themes in Practice"
+
+ [tb131-slides]: https://tug.org/tug2021/assets/pdf/tug2021-novotny-slides.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX"
+ [tb131-video]: https://youtu.be/i2GJMnLCZls "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX"
+ [tb131-video-mirror]: https://youtu.be/THmPkAncMnc "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX (mirror)"
+ [tb134-01-slides]: https://tug.org/tug2022/assets/served/Lloyd_Prentice-TUG2022-prentice-selfpub-slides.pdf "A Self-Publisher's Take on Markdown and TeX"
+ [tb134-01-video]: https://youtu.be/OhwzT3TcLj8 "A Self-Publisher's Take on Markdown and TeX"
+ [tb134-02-slides]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-slides.pdf "A Gentle Introduction to Markdown for Writers"
+ [tb134-02-example]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-example.pdf "A Gentle Introduction to Markdown for Writers"
+ [tb134-02-video]: https://youtu.be/FhN_x9rsR4M "A Gentle Introduction to Markdown for Writers"
+ [tb137-slides]: https://tug.org/tug2023/files/sa-03-novotny-markdown3/novotny-markdown3-slides.pdf "Markdown 3: What's New, What's Next?"
+ [tb137-video]: https://youtu.be/U8XjTOhJkg0 "Markdown 3: What's New, What's Next?"
+ [tb137-video-mirror]: https://youtu.be/W15bBpVTA-c "Markdown 3: What's New, What's Next? (mirror)"
+ [tb140-preprint]: https://www.tug.org/tug2024/preprints/starynovotny-markdown-themes.pdf "Markdown Themes in Practice"
+ [tb140-video]: https://youtu.be/d7vTW7PR0B4?t=5h3m10s "Markdown Themes in Practice"
+ [tb140-slides]: https://www.tug.org/tug2024/slides/starynovotny-markdown-themes.pdf "Markdown Themes in Practice"
[10.5300/2016-1-4/78]: https://www.doi.org/10.5300/2016-1-4/78 "Rendering Markdown inside TeX Documents"
[10.5300/2020-1-2/48]: https://www.doi.org/10.5300/2020-1-2/48 "Markdown 2.8.1: Boldly Unto the Throne of Lightweight Markup in TeX"
@@ -276,7 +282,7 @@ Acknowledgements
| [<img width="150" src="https://www.fi.muni.cz/images/fi-logo.png">][fimu] | I gratefully acknowledge the funding from the [Faculty of Informatics][fimu] at the [Masaryk University][mu] in Brno, Czech Republic, for the development of the Markdown package in projects [MUNI/33/12/2015][], [MUNI/33/1784/2020][], [MUNI/33/0776/2021][], [MUNI/33/1654/2022][], and [MUNI/33/1658/2022][]. |
| [<img width="150" src="https://cdn.overleaf.com/img/ol-brand/overleaf_og_logo.png">][overleaf] | Extensive user documentation for the Markdown package was kindly written by [Lian Tze Lim][liantze] and published by [Overleaf][]. |
| [<img width="150" src="https://pbs.twimg.com/profile_images/1004769879319334912/6Bh1UthD.jpg">][omedym] | Support for content slicing (Lua options [`shiftHeadings`][option-shift-headings] and [`slice`][option-slice]) and pipe tables (Lua options [`pipeTables`][option-pipe-tables] and [`tableCaptions`][option-table-captions]) was graciously sponsored by [David Vins][dvins] and [Omedym][]. |
-| [<img width="150" src="https://www.istqb.org/static/istqb-logo-1b043e800a580724ad223567f9ea57c0.png">][istqb] | Fixes for issues [#359][issue-359], [#368][issue-368], [#401][issue-401], and [#424][issue-424] were graciously sponsored by the [International Software Testing Qualifications Board (ISTQB)][istqb]. |
+| [<img width="150" src="https://www.istqb.org/static/istqb-logo-1b043e800a580724ad223567f9ea57c0.png">][istqb] | Fixes for issues [#359][issue-359], [#368][issue-368], [#401][issue-401], [#424][issue-424], [#440][issue-440], [#468][issue-468], [#474][issue-474], and [#487][issue-487] were graciously sponsored by the [International Software Testing Qualifications Board (ISTQB)][istqb]. |
[dvins]: https://github.com/dvins "David Vins"
[fimu]: https://www.fi.muni.cz/index.html.en "Faculty of Informatics, Masaryk University"
@@ -288,6 +294,10 @@ Acknowledgements
[issue-368]: https://github.com/witiko/markdown/issues/368 "Tables nested in list items have empty lines"
[issue-401]: https://github.com/witiko/markdown/issues/401 "Create an unnumbered section"
[issue-424]: https://github.com/witiko/markdown/issues/424 "E-mail addresses are incorrectly interpreted as bracketed citations"
+ [issue-440]: https://github.com/witiko/markdown/issues/440 "Support programmatic text in YAML metadata values"
+ [issue-468]: https://github.com/witiko/markdown/issues/468 "Enable option eagerCache by default"
+ [issue-474]: https://github.com/witiko/markdown/issues/474 "Improve the speed of the Markdown package"
+ [issue-487]: https://github.com/witiko/markdown/issues/487 "Prevent loading the full Markdown package when converting cached markdown fragments"
[option-pipe-tables]: https://mirrors.ctan.org/macros/generic/markdown/markdown.html#pipe-tables "Markdown Package User Manual"
[option-shift-headings]: https://mirrors.ctan.org/macros/generic/markdown/markdown.html#option-shiftheadings "Markdown Package User Manual"
diff --git a/macros/generic/markdown/VERSION b/macros/generic/markdown/VERSION
index c2b2c7e0ab..a886c5e0cb 100644
--- a/macros/generic/markdown/VERSION
+++ b/macros/generic/markdown/VERSION
@@ -1 +1 @@
-3.6.2-0-g6c30af7e (2024-07-14)
+3.7.0-0-g98dece19 (2024-08-30)
diff --git a/macros/generic/markdown/docstrip.cfg b/macros/generic/markdown/docstrip.cfg
index 959a3a21c3..44429e7b97 100644
--- a/macros/generic/markdown/docstrip.cfg
+++ b/macros/generic/markdown/docstrip.cfg
@@ -11,12 +11,12 @@
-- permit persons to whom the Software is furnished to do so, subject to^^J%
-- the following conditions:^^J%
--^^J%
--- The above copyright notice and this permission notice shall be included^^J%
--- in all copies or substantial portions of the Software.^^J%
+-- The above copyright notice and this permission notice shall be^^J%
+-- included in all copies or substantial portions of the Software.^^J%
--^^J%
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,^^J%
-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF^^J%
--- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.^^J%
+-- MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND NONINFRINGEMENT.^^J%
-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY^^J%
-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,^^J%
-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE^^J%
diff --git a/macros/generic/markdown/examples/optex.tex b/macros/generic/markdown/examples/optex.tex
index d39369f6b3..a9c7f80a22 100644
--- a/macros/generic/markdown/examples/optex.tex
+++ b/macros/generic/markdown/examples/optex.tex
@@ -226,7 +226,8 @@
\_let \markdownRendererJekyllDataSequenceEnd \_relax
\_def \markdownRendererJekyllDataBoolean #1#2{}
\_def \markdownRendererJekyllDataNumber #1#2{}
-\_def \markdownRendererJekyllDataString #1#2{}
+\_def \markdownRendererJekyllDataProgrammaticString #1#2{}
+\_def \markdownRendererJekyllDataTypographicString #1#2{}
\_def \markdownRendererJekyllDataEmpty #1{}
% Load the Markdown module and set TeX macros for the Markdown module
diff --git a/macros/generic/markdown/markdown.dtx b/macros/generic/markdown/markdown.dtx
index 97fa8d6b56..2ad94e6e9c 100644
--- a/macros/generic/markdown/markdown.dtx
+++ b/macros/generic/markdown/markdown.dtx
@@ -814,7 +814,9 @@ abbr {
},
jekyllDataRenderers = {
/authors/* = {%
- \expandafter\gdef\expandafter\ltd@title@author\expandafter{\ltd@title@author, #1}%
+ \expandafter\gdef
+ \expandafter\ltd@title@author
+ \expandafter{\ltd@title@author, #1}%
},
title = {%
\gdef\ltd@title@title{#1}%
@@ -923,13 +925,15 @@ documentation][techdoc].
(A Markdown Interpreter for TeX)
%</manual>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
local metadata = {
version = "(((VERSION)))",
- comment = "A module for the conversion from markdown to plain TeX",
- author = "John MacFarlane, Hans Hagen, Vít Starý Novotný, Andrej Genčur",
+ comment = "A module for the conversion from markdown "
+ .. "to plain TeX",
+ author = "John MacFarlane, Hans Hagen, Vít Starý Novotný, "
+ .. "Andrej Genčur",
copyright = {"2009-2016 John MacFarlane, Hans Hagen",
"2016-2024 Vít Starý Novotný, Andrej Genčur"},
license = "LPPL 1.3c"
@@ -937,7 +941,7 @@ local metadata = {
% \end{macrocode}
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*lua>
% \fi
% \begin{macrocode}
@@ -989,7 +993,7 @@ make base
Either of the two abovelisted approaches should produce the following files:
-* `markdown.lua`: The Lua module
+* `markdown.lua` and `markdown-parser.lua`: The Lua module
* `libraries/markdown-tinyyaml.lua`: An external library for reading \acro{yaml}
* `markdown-cli.lua`: The Lua command-line interface
* `markdown.tex`: The plain \TeX{} macro package
@@ -1010,6 +1014,7 @@ directory structure. This is generally where the individual files should be
placed:
* `⟨TEXMF⟩/tex/luatex/markdown/markdown.lua`
+* `⟨TEXMF⟩/tex/luatex/markdown/markdown-parser.lua`
* `⟨TEXMF⟩/tex/luatex/markdown/markdown-tinyyaml.lua`
* `⟨TEXMF⟩/scripts/markdown/markdown-cli.lua`
* `⟨TEXMF⟩/tex/generic/markdown/markdown.tex`
@@ -1036,6 +1041,7 @@ portably typeset on legacy \TeX{} distributions.
This is where the individual files should be placed:
* `./markdown.lua`
+* `./markdown-parser.lua`
* `./markdown-tinyyaml.lua`
* `./markdown-cli.lua`
* `./markdown/markdown.tex`
@@ -1104,9 +1110,17 @@ local unicode = require("unicode")
% Live${}\geq{}2008$).
%
% \end{markdown}
+% \iffalse
+%</lua>
+%<*lua,lua-loader>
+% \fi
% \begin{macrocode}
local md5 = require("md5");
% \end{macrocode}
+% \iffalse
+%</lua,lua-loader>
+%<*lua>
+% \fi
% \begin{markdown}
%
% \pkg{Kpathsea}
@@ -1181,7 +1195,7 @@ local uni_algos = require("lua-uni-algos")
%<*depends>
% \fi
% \begin{macrocode}
-# hard lua-tinyyaml # TODO: Uncomment after TeX Live 2022 has been deprecated.
+# hard lua-tinyyaml # TODO: Uncomment after TeX Live 2022 deprecation.
% \end{macrocode}
% \iffalse
%</depends>
@@ -1871,7 +1885,7 @@ module and a command-line interface (CLI).
(Lua library for conversion between markup formats)
%</manual-interfaces>
-%<*lua>
+%<*lua,lua-loader>
% \fi
% \begin{markdown}
%
@@ -1886,6 +1900,10 @@ module and a command-line interface (CLI).
% \begin{macrocode}
local M = {metadata = metadata}
% \end{macrocode}
+% \iffalse
+% \fi
+%</lua,lua-loader>
+%<*lua>
% \par
% \begin{markdown}
%
@@ -2162,7 +2180,7 @@ In this section, I will describe all the options recognized by the Markdown
package.
%</manual-options>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
local defaultOptions = {}
@@ -2171,7 +2189,7 @@ local defaultOptions = {}
% \markdownSetup{snippet=lua-options}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
### Lua
@@ -2205,7 +2223,9 @@ interfaces and all the way up to the \LaTeX{} and \Hologo{ConTeXt} interfaces.
\prop_new:N \g_@@_default_lua_options_prop
\seq_new:N \g_@@_option_layers_seq
\tl_const:Nn \c_@@_option_layer_lua_tl { lua }
-\seq_gput_right:NV \g_@@_option_layers_seq \c_@@_option_layer_lua_tl
+\seq_gput_right:NV
+ \g_@@_option_layers_seq
+ \c_@@_option_layer_lua_tl
\cs_new:Nn
\@@_add_lua_option:nnn
{
@@ -2282,21 +2302,50 @@ interfaces and all the way up to the \LaTeX{} and \Hologo{ConTeXt} interfaces.
\cs_generate_variant:Nn
\msg_error:nnnn
{ nnnV }
-\seq_new:N \g_@@_option_types_seq
-\tl_const:Nn \c_@@_option_type_clist_tl { clist }
-\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_clist_tl
-\tl_const:Nn \c_@@_option_type_counter_tl { counter }
-\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_counter_tl
-\tl_const:Nn \c_@@_option_type_boolean_tl { boolean }
-\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_boolean_tl
-\tl_const:Nn \c_@@_option_type_number_tl { number }
-\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_number_tl
-\tl_const:Nn \c_@@_option_type_path_tl { path }
-\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_path_tl
-\tl_const:Nn \c_@@_option_type_slice_tl { slice }
-\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_slice_tl
-\tl_const:Nn \c_@@_option_type_string_tl { string }
-\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_string_tl
+\seq_new:N
+ \g_@@_option_types_seq
+\tl_const:Nn
+ \c_@@_option_type_clist_tl
+ { clist }
+\seq_gput_right:NV
+ \g_@@_option_types_seq
+ \c_@@_option_type_clist_tl
+\tl_const:Nn
+ \c_@@_option_type_counter_tl
+ { counter }
+\seq_gput_right:NV
+ \g_@@_option_types_seq
+ \c_@@_option_type_counter_tl
+\tl_const:Nn
+ \c_@@_option_type_boolean_tl
+ { boolean }
+\seq_gput_right:NV
+ \g_@@_option_types_seq
+ \c_@@_option_type_boolean_tl
+\tl_const:Nn
+ \c_@@_option_type_number_tl
+ { number }
+\seq_gput_right:NV
+ \g_@@_option_types_seq
+ \c_@@_option_type_number_tl
+\tl_const:Nn
+ \c_@@_option_type_path_tl
+ { path }
+\seq_gput_right:NV
+ \g_@@_option_types_seq
+ \c_@@_option_type_path_tl
+\tl_const:Nn
+ \c_@@_option_type_slice_tl
+ { slice }
+\seq_gput_right:NV
+ \g_@@_option_types_seq
+ \c_@@_option_type_slice_tl
+\tl_const:Nn
+ \c_@@_option_type_string_tl
+ { string }
+\seq_gput_right:NV
+ \g_@@_option_types_seq
+ \c_@@_option_type_string_tl
\cs_new:Nn
\@@_get_option_type:nN
{
@@ -2518,20 +2567,23 @@ interfaces and all the way up to the \LaTeX{} and \Hologo{ConTeXt} interfaces.
#### Option `eagerCache`
-`eagerCache` (default value: `false`)
+`eagerCache` (default value: `true`)
% \fi
% \begin{markdown}
%
-% \Optitem[false]{eagerCache}{\opt{true}, \opt{false}}
+% \Optitem[true]{eagerCache}{\opt{true}, \opt{false}}
%
: true
: Converted markdown documents will be cached in \Opt{cacheDir}. This can be
useful for post-processing the converted documents and for recovering
- historical versions of the documents from the cache. However, it also
- produces a large number of auxiliary files on the disk and obscures the
- output of the Lua command-line interface when it is used for plumbing.
+ historical versions of the documents from the cache. Furthermore, it can
+ also significantly improve the processing speed for documents that require
+ multiple compilation runs, since each markdown document is only converted once.
+ However, it also produces a large number of auxiliary files on the disk
+ and obscures the output of the Lua command-line interface when it is
+ used for plumbing.
This behavior will always be used if the \Opt{finalizeCache} option is
enabled.
@@ -2540,7 +2592,11 @@ interfaces and all the way up to the \LaTeX{} and \Hologo{ConTeXt} interfaces.
: Converted markdown documents will not be cached. This decreases the number
of auxiliary files that we produce and makes it easier to use the Lua
- command-line interface for plumbing.
+ command-line interface for plumbing. However, it makes it impossible to
+ post-process the converted documents and recover historical versions of
+ the documents from the cache. Furthermore, it can significantly reduce
+ the processing speed for documents that require multiple compilation
+ runs, since each markdown document is converted multiple times needlessly.
This behavior will only be used when the \Opt{finalizeCache} option is
disabled.
@@ -2602,18 +2658,18 @@ Hello \markdownRendererEmphasis{world}!\relax
\@@_add_lua_option:nnn
{ eagerCache }
{ boolean }
- { false }
+ { true }
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
-defaultOptions.eagerCache = false
+defaultOptions.eagerCache = true
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `singletonCache`
@@ -2641,12 +2697,11 @@ defaultOptions.eagerCache = false
: Every call to the function \luamref{new}`(options)` will produce a new
conversion function that will not be cached. This is slower than
caching conversion functions and may expose bugs related to memory
- leaks in the creation of conversion functions, see also issue
- [#226][issue-226].
+ leaks in the creation of conversion functions, see also [#226 (comment)][226-comment].
This was the default behavior until version 3.0.0 of the Markdown package.
- [issue-226]: https://github.com/witiko/markdown/pull/226#issuecomment-1599641634
+ [226-comment]: https://github.com/witiko/markdown/pull/226#issuecomment-1599641634
% \end{markdown}
% \iffalse
@@ -2695,13 +2750,13 @@ conversion function.
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.singletonCache = true
% \end{macrocode}
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*lua>
% \fi
% \begin{macrocode}
@@ -2750,14 +2805,14 @@ local singletonCache = {
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.unicodeNormalization = true
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `unicodeNormalizationForm`
@@ -2806,14 +2861,14 @@ defaultOptions.unicodeNormalization = true
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.unicodeNormalizationForm = "nfc"
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
% \fi
% \begin{markdown}
@@ -2982,14 +3037,14 @@ option.
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.cacheDir = "."
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `contentBlocksLanguageMap`
@@ -3146,14 +3201,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.contentBlocksLanguageMap = "markdown-languages.json"
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `debugExtensionsFileName`
@@ -3195,14 +3250,14 @@ defaultOptions.contentBlocksLanguageMap = "markdown-languages.json"
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.debugExtensionsFileName = "debug-extensions.json"
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `frozenCacheFileName`
@@ -3437,14 +3492,14 @@ the markdown document from “Hello *world*!” to “Hi *world*!” was not ref
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.frozenCacheFileName = "frozenCache.tex"
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
% \fi
% \begin{markdown}
@@ -3494,14 +3549,14 @@ See also the option \Opt{gfmAutoIdentifiers}.
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.autoIdentifiers = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `blankBeforeBlockquote`
@@ -3718,14 +3773,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.blankBeforeBlockquote = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `blankBeforeCodeFence`
@@ -3975,14 +4030,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.blankBeforeCodeFence = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `blankBeforeDivFence`
@@ -4058,14 +4113,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.blankBeforeDivFence = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `blankBeforeHeading`
@@ -4298,14 +4353,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.blankBeforeHeading = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `blankBeforeList`
@@ -4524,14 +4579,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.blankBeforeList = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `bracketedSpans`
@@ -4620,14 +4675,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.bracketedSpans = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `breakableBlockquotes`
@@ -4854,14 +4909,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.breakableBlockquotes = true
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `citationNbsps`
@@ -4948,14 +5003,14 @@ following text, where the middot (`·`) denotes a non-breaking space:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.citationNbsps = true
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `citations`
@@ -5051,14 +5106,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.citations = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `codeSpans`
@@ -5277,14 +5332,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.codeSpans = true
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `contentBlocks`
@@ -5451,14 +5506,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.contentBlocks = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `contentLevel`
@@ -5588,14 +5643,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.contentLevel = "block"
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `debugExtensions`
@@ -5743,14 +5798,14 @@ inserted to the grammar of markdown.
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.debugExtensions = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `definitionLists`
@@ -5882,14 +5937,60 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.definitionLists = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
+%<*manual-options>
+
+#### Option `ensureJekyllData`
+
+`ensureJekyllData` (default value: `false`)
+
+% \fi
+% \begin{markdown}
+%
+% \Optitem[false]{ensureJekyllData}{\opt{true}, \opt{false}}
+%
+: false
+
+ : When the \Opt{jekyllData} and \Opt{expectJekyllData} options are
+ enabled, then a markdown document may begin directly with \acro{yaml}
+ metadata and may contain nothing but \acro{yaml} metadata. Otherwise,
+ the markdown document is processed as markdown text.
+
+: true
+
+ : When the \Opt{jekyllData} and \Opt{expectJekyllData} options are
+ enabled, then a markdown document must begin directly with \acro{yaml}
+ metadata and must contain nothing but \acro{yaml} metadata. Otherwise,
+ an error is produced.
+
+% \end{markdown}
+% \iffalse
+%</manual-options>
+%<*tex>
+% \fi
+% \begin{macrocode}
+\@@_add_lua_option:nnn
+ { ensureJekyllData }
+ { boolean }
+ { false }
+% \end{macrocode}
+% \iffalse
+%</tex>
+%<*lua,lua-cli,lua-loader>
+% \fi
+% \begin{macrocode}
+defaultOptions.ensureJekyllData = false
+% \end{macrocode}
+% \par
+% \iffalse
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `expectJekyllData`
@@ -6006,14 +6107,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.expectJekyllData = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `extensions`
@@ -6157,14 +6258,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.extensions = {}
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `fancyLists`
@@ -6259,14 +6360,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.fancyLists = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `fencedCode`
@@ -6426,14 +6527,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.fencedCode = true
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `fencedCodeAttributes`
@@ -6526,14 +6627,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.fencedCodeAttributes = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `fencedDivs` {#fenced-divs}
@@ -6605,14 +6706,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.fencedDivs = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `finalizeCache`
@@ -6769,14 +6870,14 @@ the markdown document from “Hello *world*!” to “Hi *world*!” was not ref
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.finalizeCache = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `frozenCacheCounter`
@@ -6838,14 +6939,14 @@ requested using the `frozenCacheCounter` option.
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.frozenCacheCounter = 0
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `gfmAutoIdentifiers`
@@ -6887,14 +6988,14 @@ See also the option \Opt{autoIdentifiers}.
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.gfmAutoIdentifiers = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `hashEnumerators`
@@ -7018,14 +7119,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.hashEnumerators = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `headerAttributes` {#header-attributes}
@@ -7067,14 +7168,14 @@ defaultOptions.hashEnumerators = false
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.headerAttributes = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `html`
@@ -7339,14 +7440,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.html = true
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `hybrid`
@@ -7565,14 +7666,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.hybrid = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `inlineCodeAttributes`
@@ -7661,14 +7762,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.inlineCodeAttributes = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `inlineNotes`
@@ -7762,14 +7863,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.inlineNotes = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `jekyllData`
@@ -7929,14 +8030,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.jekyllData = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `linkAttributes`
@@ -8026,14 +8127,14 @@ image (from [Martin Scharrer's mwe package][mwe]) displayed at size 5cm × 4cm.
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.linkAttributes = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `lineBlocks`
@@ -8161,14 +8262,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.lineBlocks = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `mark`
@@ -8232,14 +8333,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.mark = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `notes`
@@ -8395,14 +8496,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.notes = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `pipeTables` {#pipe-tables}
@@ -8504,14 +8605,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.pipeTables = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `preserveTabs`
@@ -8544,14 +8645,14 @@ defaultOptions.pipeTables = false
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.preserveTabs = true
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `rawAttribute`
@@ -8639,14 +8740,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.rawAttribute = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `relativeReferences`
@@ -8728,14 +8829,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.relativeReferences = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `shiftHeadings`
@@ -8868,14 +8969,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.shiftHeadings = 0
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `slice`
@@ -9086,14 +9187,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.slice = "^ $"
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `smartEllipses`
@@ -9301,14 +9402,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.smartEllipses = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `startNumber`
@@ -9437,14 +9538,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.startNumber = true
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `strikeThrough`
@@ -9559,14 +9660,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.strikeThrough = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `stripIndent`
@@ -9672,14 +9773,14 @@ text “Hello *world*!”
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.stripIndent = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `subscripts`
@@ -9764,14 +9865,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.subscripts = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `superscripts`
@@ -9856,14 +9957,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.superscripts = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `tableAttributes`
@@ -9981,14 +10082,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.tableAttributes = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `tableCaptions` {#table-captions}
@@ -10111,14 +10212,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.tableCaptions = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `taskLists`
@@ -10224,14 +10325,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.taskLists = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `texComments`
@@ -10340,14 +10441,14 @@ text “Hello *world*!”
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.texComments = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `texMathDollars`
@@ -10551,14 +10652,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.texMathDollars = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `texMathDoubleBackslash`
@@ -10762,14 +10863,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.texMathDoubleBackslash = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `texMathSingleBackslash`
@@ -10973,14 +11074,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.texMathSingleBackslash = false
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `tightLists`
@@ -11094,14 +11195,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.tightLists = true
% \end{macrocode}
% \par
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*manual-options>
#### Option `underscores`
@@ -11237,14 +11338,14 @@ following text:
% \end{macrocode}
% \iffalse
%</tex>
-%<*lua,lua-cli>
+%<*lua,lua-cli,lua-loader>
% \fi
% \begin{macrocode}
defaultOptions.underscores = true
% \end{macrocode}
% \endgroup
% \iffalse
-%</lua,lua-cli>
+%</lua,lua-cli,lua-loader>
%<*lua-cli>
% \fi
% \par
@@ -11330,7 +11431,8 @@ Copyright (C) ]] .. table.concat(metadata.copyright,
License: ]] .. metadata.license
local function warn(s)
- io.stderr:write("Warning: " .. s .. "\n") end
+ io.stderr:write("Warning: " .. s .. "\n")
+end
local function error(s)
io.stderr:write("Error: " .. s .. "\n")
@@ -11421,8 +11523,8 @@ for i = 1, #arg do
if default_type == "nil" then
warn('Option "' .. key .. '" not recognized.')
else
- warn('Option "' .. key .. '" type not recognized, please file ' ..
- 'a report to the package maintainer.')
+ warn('Option "' .. key .. '" type not recognized, ' ..
+ 'please file a report to the package maintainer.')
end
warn('Parsing the ' .. 'value "' .. value ..'" of option "' ..
key .. '" as a string.')
@@ -11757,7 +11859,9 @@ pdftex --shell-escape document.tex
% \begin{macrocode}
\prop_new:N \g_@@_plain_tex_option_types_prop
\prop_new:N \g_@@_default_plain_tex_options_prop
-\seq_gput_right:NV \g_@@_option_layers_seq \c_@@_option_layer_plain_tex_tl
+\seq_gput_right:NV
+ \g_@@_option_layers_seq
+ \c_@@_option_layer_plain_tex_tl
\cs_new:Nn
\@@_add_plain_tex_option:nnn
{
@@ -12828,10 +12932,14 @@ options locally.
{ redefined-snippet }
\l_tmpa_tl
}
- \prop_gput:NVn
+ \keys_precompile:nnN
+ { markdown/options }
+ { #2 }
+ \l_tmpb_tl
+ \prop_gput:NVV
\g_@@_snippets_prop
\l_tmpa_tl
- { #2 }
+ \l_tmpb_tl
}
\cs_gset_eq:NN
\markdownSetupSnippet
@@ -12897,7 +13005,7 @@ options locally.
\g_@@_snippets_prop
\l_tmpa_tl
\l_tmpb_tl
- \@@_setup:V
+ \tl_use:N
\l_tmpb_tl
}
{
@@ -12912,9 +13020,6 @@ options locally.
{ markdown }
{ undefined-snippet }
{ Can't~invoke~undefined~snippet~#1 }
-\cs_generate_variant:Nn
- \@@_setup:n
- { V }
\ExplSyntaxOff
% \end{macrocode}
% \iffalse
@@ -15699,8 +15804,8 @@ following text:
% \begin{markdown}
#### Fenced Code Attribute Context Renderers
-The following macros are only produced, when the \Opt{fencedCode} option is
-enabled.
+The following macros are only produced, when the \Opt{fencedCode} and
+\Opt{fencedCodeAttributes} options are enabled.
The \mdef{markdownRendererFencedCodeAttributeContextBegin} and
\mdef{markdownRendererFencedCodeAttributeContextEnd} macros represent the
@@ -19956,6 +20061,50 @@ following text:
%
% \begin{markdown}
+#### Warning and Error Renderers
+
+The \mdef{markdownRendererWarning} and \mdef{markdownRendererError} macros
+represent warnings and errors produced by the markdown parser. Both macros
+receive a single parameter with the text of the warning or error.
+
+% \end{markdown}
+%
+% \iffalse
+%</manual-tokens>
+%<*tex>
+% \fi
+%
+% \begin{macrocode}
+\def\markdownRendererWarning{%
+ \markdownRendererWarningPrototype}%
+\def\markdownRendererError{%
+ \markdownRendererErrorPrototype}%
+\ExplSyntaxOn
+\seq_gput_right:Nn
+ \g_@@_renderers_seq
+ { warning }
+\prop_gput:Nnn
+ \g_@@_renderer_arities_prop
+ { warning }
+ { 1 }
+\seq_gput_right:Nn
+ \g_@@_renderers_seq
+ { error }
+\prop_gput:Nnn
+ \g_@@_renderer_arities_prop
+ { error }
+ { 1 }
+\ExplSyntaxOff
+% \end{macrocode}
+% \par
+%
+% \iffalse
+%</tex>
+%<*manual-tokens>
+% \fi
+%
+% \begin{markdown}
+
#### YAML Metadata Renderers {#yamlmetadatarenderers}
The \mdef{markdownRendererJekyllDataBegin} macro represents the beginning of a
@@ -20230,12 +20379,24 @@ following \acro{yaml} serialization rules.
%
% \begin{markdown}
-The \mdef{markdownRendererJekyllDataString} macro represents a string scalar
-value in a \acro{yaml} document. This macro will only be produced when the
-\Opt{jekyllData} option is enabled. The macro receives two arguments: the
+The \mdef{markdownRendererJekyllDataTypographicString} and
+\mdef{markdownRendererJekyllDataProgrammaticString} macros represent string
+scalar values in a \acro{yaml} document. This macro will only be produced when
+the \Opt{jekyllData} option is enabled. The macro receives two arguments: the
scalar key in the parent structure, cast to a string following \acro{yaml}
serialization rules, and the scalar value.
+For each string scalar value, both macros are produced. Whereas
+\mref{markdownRendererJekyllDataTypographicString} receives the scalar value
+after all markdown markup and special \TeX{} characters in the string have been
+replaced by \TeX{} macros, \mref{markdownRendererJekyllDataProgrammaticString}
+receives the raw scalar value. Therefore, whereas the
+\mref{markdownRendererJekyllDataTypographicString} macro is more appropriate
+for texts that are supposed to be typeset with \TeX{}, such as document titles,
+author names, or exam questions, the
+\mref{markdownRendererJekyllDataProgrammaticString} macro is more appropriate
+for identifiers and other programmatic text that won't be typeset by \TeX{}.
+
% \end{markdown}
%
% \iffalse
@@ -20244,11 +20405,83 @@ serialization rules, and the scalar value.
% \fi
%
% \begin{macrocode}
-\def\markdownRendererJekyllDataString{%
- \markdownRendererJekyllDataStringPrototype}%
+\def\markdownRendererJekyllDataTypographicString{%
+ \markdownRendererJekyllDataTypographicStringPrototype}%
+\def\markdownRendererJekyllDataProgrammaticString{%
+ \markdownRendererJekyllDataProgrammaticStringPrototype}%
\ExplSyntaxOn
\seq_gput_right:Nn
\g_@@_renderers_seq
+ { jekyllDataTypographicString }
+\prop_gput:Nnn
+ \g_@@_renderer_arities_prop
+ { jekyllDataTypographicString }
+ { 2 }
+\seq_gput_right:Nn
+ \g_@@_renderers_seq
+ { jekyllDataProgrammaticString }
+\prop_gput:Nnn
+ \g_@@_renderer_arities_prop
+ { jekyllDataProgrammaticString }
+ { 2 }
+\ExplSyntaxOff
+% \end{macrocode}
+% \par
+%
+% \iffalse
+%</tex>
+%<*manual-tokens>
+% \fi
+%
+% \begin{markdown}
+
+Before Markdown 3.7.0, the \mref{markdownRendererJekyllDataTypographicString}
+macro was named \mref{markdownRendererJekyllDataString} and the
+\mref{markdownRendererJekyllDataProgrammaticString} macro was not produced.
+The \mref{markdownRendererJekyllDataString} has been deprecated and will be
+removed in Markdown 4.0.0.
+
+% \end{markdown}
+%
+% \iffalse
+%</manual-tokens>
+%<*tex>
+% \fi
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+\cs_gset:Npn
+ \markdownRendererJekyllDataTypographicString
+ {
+ \cs_if_exist:NTF
+ \markdownRendererJekyllDataString
+ {
+ \markdownWarning
+ {
+ The~jekyllDataString~renderer~has~been~deprecated,~
+ to~be~removed~in~Markdown~4.0.0
+ }
+ \markdownRendererJekyllDataString
+ }
+ {
+ \cs_if_exist:NTF
+ \markdownRendererJekyllDataStringPrototype
+ {
+ \markdownWarning
+ {
+ The~jekyllDataString~renderer~prototype~
+ has~been~deprecated,~
+ to~be~removed~in~Markdown~4.0.0
+ }
+ \markdownRendererJekyllDataStringPrototype
+ }
+ {
+ \markdownRendererJekyllDataTypographicStringPrototype
+ }
+ }
+ }
+\seq_gput_right:Nn
+ \g_@@_renderers_seq
{ jekyllDataString }
\prop_gput:Nnn
\g_@@_renderer_arities_prop
@@ -20308,7 +20541,7 @@ following content:
``` tex
\input markdown
\def\markdownOptionJekyllData{true}
-\def\markdownRendererJekyllDataString#1#2{\gdef\name{#2}}
+\def\markdownRendererJekyllDataTypographicString#1#2{\gdef\name{#2}}
\def\markdownRendererJekyllDataNumber#1#2{\gdef\age{#2}}
\def\markdownRendererJekyllDataEnd{%
\name{} is \age{} years old.}
@@ -20338,7 +20571,7 @@ following content:
\usepackage[jekyllData]{markdown}
\markdownSetup{
renderers = {
- jekyllDataString = {\gdef\name{#2}},
+ jekyllDataTypographicString = {\gdef\name{#2}},
jekyllDataNumber = {\gdef\age{#2}},
jekyllDataEnd = {\name{} is \age{} years old.},
}
@@ -20370,7 +20603,7 @@ following content:
``` tex
\usemodule[t][markdown]
\setupmarkdown[jekyllData = yes]
-\def\markdownRendererJekyllDataString#1#2{\gdef\name{#2}}
+\def\markdownRendererJekyllDataTypographicString#1#2{\gdef\name{#2}}
\def\markdownRendererJekyllDataNumber#1#2{\gdef\age{#2}}
\def\markdownRendererJekyllDataEnd{%
\name{} is \age{} years old.}
@@ -20412,9 +20645,26 @@ following text:
\ExplSyntaxOn
\cs_new:Nn \@@_define_renderers:
{
- \seq_map_function:NN
+ \seq_map_inline:Nn
\g_@@_renderers_seq
- \@@_define_renderer:n
+ {
+% \end{macrocode}
+% \par
+% \begin{markdown}
+%
+% The \mref{markdownRendererJekyllDataString} has been deprecated and will be
+% removed in Markdown 4.0.0.
+%
+% \end{markdown}
+% \begin{macrocode}
+ \str_if_eq:nnF
+ { ##1 }
+ { jekyllDataString }
+ {
+ \@@_define_renderer:n
+ { ##1 }
+ }
+ }
}
\cs_new:Nn \@@_define_renderer:n
{
@@ -21130,9 +21380,26 @@ following text:
\ExplSyntaxOn
\cs_new:Nn \@@_define_renderer_prototypes:
{
- \seq_map_function:NN
+ \seq_map_inline:Nn
\g_@@_renderers_seq
- \@@_define_renderer_prototype:n
+ {
+% \end{macrocode}
+% \par
+% \begin{markdown}
+%
+% The \mref{markdownRendererJekyllDataString} has been deprecated and will be
+% removed in Markdown 4.0.0.
+%
+% \end{markdown}
+% \begin{macrocode}
+ \str_if_eq:nnF
+ { ##1 }
+ { jekyllDataString }
+ {
+ \@@_define_renderer_prototype:n
+ { ##1 }
+ }
+ }
}
\cs_new:Nn \@@_define_renderer_prototype:n
{
@@ -21612,9 +21879,10 @@ pdflatex --shell-escape document.tex
% \LaTeX{} environments, and redefines the \mref{markinline} and
% \mref{markdownInput} commands.
%
+%#### The `markdown` and `markdown*` \LaTeX{} environments
% The \envmref{markdown} and \envmref{markdown*} \LaTeX{} environments are used
% to typeset markdown document fragments. Both \LaTeX{} environments accept
-% \LaTeX{} interface options (see ection <#sec:latex-options>) as the only
+% \LaTeX{} interface options (see Section <#sec:latex-options>) as the only
% argument. This argument is optional for the \envmref{markdown} environment
% and mandatory for the \envmref{markdown*} environment.
%
@@ -21651,6 +21919,52 @@ pdflatex --shell-escape document.tex
% \end{document} \end{document}
% ```````
%
+% You can't directly extend the \envmref{markdown} \LaTeX{} environment by
+% using it in other environments as follows:
+%
+% ``` tex
+% \newenvironment{foo}\%
+% {code before \begin{markdown}[some, options]}\%
+% {\end{markdown} code after}
+% ```
+%
+% This is because the implementation looks for the literal string
+% `\end{markdown}` to stop scanning the markdown text. However, you can work
+% around this limitation by using the \mref{markdown} and \mref{markdownEnd}
+% macros directly in the definition as follows:
+%
+% \markdownEnd
+% \begin{markdown}
+%
+% ``` tex
+% \newenvironment{foo}\%
+% {code before \markdown[some, options]}\%
+% {\markdownEnd code after}
+% ```
+%
+% Specifically, the \mref{markdown} macro must appear at the end of the
+% replacement text and must be followed by text that has not yet been ingested
+% by \TeX's input processor. Furthermore, using the \mref{markdownEnd} macro is
+% optional and only makes a difference if you redefined it to produce special
+% effects before and after the \envmref{markdown} \LaTeX{} environment. Lastly,
+% you can't nest the other environments. For example, the following definition
+% is incorrect:
+%
+% ``` tex
+% \newenvironment{bar}{\begin{foo}}{\end{foo}}
+% ```
+%
+% In this example, you should use the \mref{markdown} macro directly in the
+% definition of the environment `bar`:
+%
+% ``` tex
+% \newenvironment{bar}{\markdown[some, options]}{\markdownEnd}
+% ```
+%
+% \end{markdown}
+% \markdownBegin
+%
+%#### The `\markinline` and `\markdownInput` macros
% The \mref{markinline} macro accepts a single mandatory parameter containing
% inline markdown content and expands to the result of the conversion of the
% input markdown document to plain \TeX{}. Unlike the \mref{markinline} macro
@@ -22395,14 +22709,14 @@ Built-in \Hologo{ConTeXt} themes provided with the Markdown package include:
% \end{markdown}
% \iffalse
%</manual-options>
-%<*themes-witiko-markdown-defaults-context>
+%<*themes-witiko-markdown-defaults-ctx>
% \fi
% \begin{macrocode}
\startmodule[markdownthemewitiko_markdown_defaults]
\unprotect
% \end{macrocode}
% \iffalse
-%</themes-witiko-markdown-defaults-context>
+%</themes-witiko-markdown-defaults-ctx>
%<*manual-options>
% \fi
% \begin{markdown}
@@ -22463,9 +22777,17 @@ local P, R, S, V, C, Cg, Cb, Cmt, Cc, Ct, B, Cs, Cp, any =
% `lunamark/util.lua` file in the Lunamark Lua module.
%
% \end{markdown}
+% \iffalse
+%</lua>
+%<*lua,lua-loader>
+% \fi
% \begin{macrocode}
local util = {}
% \end{macrocode}
+% \iffalse
+%</lua,lua-loader>
+%<*lua>
+% \fi
% \par
% \begin{markdown}
%
@@ -22480,13 +22802,17 @@ function util.err(msg, exit_code)
os.exit(exit_code or 1)
end
% \end{macrocode}
+% \iffalse
+%</lua>
+%<*lua,lua-loader>
+% \fi
% \par
% \begin{markdown}
%
-% The \luamdef{util.cache} method computes the digest of `string` and
-% `salt`, adds the `suffix` and looks into the directory `dir`, whether a
-% file with such a name exists. If it does not, it gets created with
-% `transform(string)` as its content. The filename is then returned.
+% The \luamdef{util.cache} method used `dir`, `string`, `salt`, and `suffix`
+% to determine a pathname. If a file with such a pathname does not exists,
+% it gets created with `transform(string)` as its content. Regardless, the
+% pathname is then returned.
%
% \end{markdown}
% \begin{macrocode}
@@ -22494,7 +22820,7 @@ function util.cache(dir, string, salt, transform, suffix)
local digest = md5.sumhexa(string .. (salt or ""))
local name = util.pathname(dir, digest .. suffix)
local file = io.open(name, "r")
- if file == nil then -- If no cache entry exists, then create a new one.
+ if file == nil then -- If no cache entry exists, create a new one.
file = assert(io.open(name, "w"),
[[Could not open file "]] .. name .. [[" for writing]])
local result = string
@@ -22507,6 +22833,10 @@ function util.cache(dir, string, salt, transform, suffix)
return name
end
% \end{macrocode}
+% \iffalse
+%</lua,lua-loader>
+%<*lua>
+% \fi
% \par
% \begin{markdown}
%
@@ -22765,6 +23095,10 @@ function util.escaper(char_escapes, string_escapes)
end
end
% \end{macrocode}
+% \iffalse
+%</lua>
+%<*lua,lua-loader>
+% \fi
% \par
% \begin{markdown}
%
@@ -22784,6 +23118,43 @@ end
% \par
% \begin{markdown}
%
+% The \luamdef{util.salt} method produces cryptographic salt out of a table of
+% options `options`.
+%
+% \end{markdown}
+% \begin{macrocode}
+function util.salt(options)
+ local opt_string = {}
+ for k, _ in pairs(defaultOptions) do
+ local v = options[k]
+ if type(v) == "table" then
+ for _, i in ipairs(v) do
+ opt_string[#opt_string+1] = k .. "=" .. tostring(i)
+ end
+% \end{macrocode}
+% \begin{markdown}
+%
+% The \Opt{cacheDir} option is disregarded.
+%
+% \end{markdown}
+% \begin{macrocode}
+ elseif k ~= "cacheDir" then
+ opt_string[#opt_string+1] = k .. "=" .. tostring(v)
+ end
+ end
+ table.sort(opt_string)
+ local salt = table.concat(opt_string, ",")
+ .. "," .. metadata.version
+ return salt
+end
+% \end{macrocode}
+% \iffalse
+%</lua,lua-loader>
+%<*lua>
+% \fi
+% \par
+% \begin{markdown}
+%
%### HTML Entities
% This section documents the \acro{HTML} entities recognized by the
% markdown reader. These functions are encapsulated in the `entities`
@@ -25100,15 +25471,6 @@ function M.writer.new(options)
% \par
% \begin{markdown}
%
-% Define \luamdef{writer->suffix} as the suffix of the produced cache files.
-%
-% \end{markdown}
-% \begin{macrocode}
- self.suffix = ".tex"
-% \end{macrocode}
-% \par
-% \begin{markdown}
-%
% Define \luamdef{writer->space} as the output format of a space character.
%
% \end{markdown}
@@ -25153,19 +25515,6 @@ function M.writer.new(options)
% \par
% \begin{markdown}
%
-% Define \luamdef{writer->pack} as a function that will take the filename
-% `name` of the output file prepared by the reader and transform it to the
-% output format.
-%
-% \end{markdown}
-% \begin{macrocode}
- function self.pack(name)
- return [[\input{]] .. name .. [[}\relax]]
- end
-% \end{macrocode}
-% \par
-% \begin{markdown}
-%
% Define \luamdef{writer->interblocksep} as the output format of a block
% element separator.
%
@@ -25269,13 +25618,17 @@ function M.writer.new(options)
["{"] = "\\markdownRendererLeftBrace{}",
["}"] = "\\markdownRendererRightBrace{}",
["\\"] = "\\markdownRendererBackslash{}",
+ ["\r"] = " ",
+ ["\n"] = " ",
}
self.escaped_minimal_strings = {
- ["^^"] = "\\markdownRendererCircumflex\\markdownRendererCircumflex ",
+ ["^^"] = "\\markdownRendererCircumflex"
+ .. "\\markdownRendererCircumflex ",
["☒"] = "\\markdownRendererTickedBox{}",
["⌛"] = "\\markdownRendererHalfTickedBox{}",
["☐"] = "\\markdownRendererUntickedBox{}",
- [entities.hex_entity('FFFD')] = "\\markdownRendererReplacementCharacter{}",
+ [entities.hex_entity('FFFD')]
+ = "\\markdownRendererReplacementCharacter{}",
}
% \end{macrocode}
% \par
@@ -25310,7 +25663,8 @@ function M.writer.new(options)
["^"] = "\\markdownRendererCircumflex{}",
["~"] = "\\markdownRendererTilde{}",
["|"] = "\\markdownRendererPipe{}",
- [entities.hex_entity('0000')] = "\\markdownRendererReplacementCharacter{}",
+ [entities.hex_entity('0000')]
+ = "\\markdownRendererReplacementCharacter{}",
}
% \end{macrocode}
% \par
@@ -25318,9 +25672,9 @@ function M.writer.new(options)
%
% Use the \luamref{writer->escaped_chars}, \luamref{writer->escaped_uri_chars},
% and \luamref{writer->escaped_minimal_strings} tables to create the
-% \luamdef{writer->escape_typographic_text},
-% \luamdef{writer->escape_programmatic_text}, and
-% \luamdef{writer->escape_minimal} escaper functions.
+% \luamdef{escape_typographic_text},
+% \luamdef{escape_programmatic_text}, and
+% \luamdef{escape_minimal} local escaper functions.
%
% \end{markdown}
% \begin{macrocode}
@@ -25372,6 +25726,30 @@ function M.writer.new(options)
% \par
% \begin{markdown}
%
+% Define \luamdef{writer->warning} as a function that will transform an input
+% warning `t` to the output format.
+%
+% \end{markdown}
+% \begin{macrocode}
+ function self.warning(t)
+ return {"\\markdownRendererWarning{", self.identifier(t), "}"}
+ end
+% \end{macrocode}
+% \par
+% \begin{markdown}
+%
+% Define \luamdef{writer->error} as a function that will transform an input
+% error `t` to the output format.
+%
+% \end{markdown}
+% \begin{macrocode}
+ function self.error(t)
+ return {"\\markdownRendererError{", self.identifier(t), "}"}
+ end
+% \end{macrocode}
+% \par
+% \begin{markdown}
+%
% Define \luamdef{writer->code} as a function that will transform an input
% inline code span `s` with optional attributes `attributes` to the output
% format.
@@ -25571,7 +25949,8 @@ function M.writer.new(options)
% \begin{macrocode}
function self.inline_html_tag(contents)
if self.flatten_inlines then return contents end
- return {"\\markdownRendererInlineHtmlTag{",self.string(contents),"}"}
+ return {"\\markdownRendererInlineHtmlTag{",
+ self.string(contents),"}"}
end
% \end{macrocode}
% \par
@@ -25862,8 +26241,10 @@ function M.writer.new(options)
% \begin{macrocode}
function self.push_attributes(attribute_type, attributes,
start_output, end_output)
- local attribute_type_level = self.attribute_type_levels[attribute_type]
- self.attribute_type_levels[attribute_type] = attribute_type_level + 1
+ local attribute_type_level
+ = self.attribute_type_levels[attribute_type]
+ self.attribute_type_levels[attribute_type]
+ = attribute_type_level + 1
-- index attributes in a hash table for easy lookup
attributes = attributes or {}
@@ -25918,8 +26299,10 @@ function M.writer.new(options)
local attributes, _, end_output
current_attribute_type, attributes, _, end_output = table.unpack(
self.active_attributes[#self.active_attributes])
- local attribute_type_level = self.attribute_type_levels[current_attribute_type]
- self.attribute_type_levels[current_attribute_type] = attribute_type_level - 1
+ local attribute_type_level
+ = self.attribute_type_levels[current_attribute_type]
+ self.attribute_type_levels[current_attribute_type]
+ = attribute_type_level - 1
if self.is_writing and end_output ~= nil then
table.insert(buf, end_output)
end
@@ -25953,7 +26336,8 @@ function M.writer.new(options)
local prev_space = false
local letter_found = false
local normalized_s = s
- if not options.unicodeNormalization or options.unicodeNormalizationForm ~= "nfc" then
+ if not options.unicodeNormalization
+ or options.unicodeNormalizationForm ~= "nfc" then
normalized_s = uni_algos.normalize.NFC(normalized_s)
end
@@ -25970,7 +26354,8 @@ function M.writer.new(options)
end
end
- -- Remove all non-alphanumeric characters, except underscores, hyphens, and periods.
+ -- Remove all non-alphanumeric characters, except underscores,
+ -- hyphens, and periods.
if not unicode.utf8.match(char, "[%w_%-%.%s]") then
goto continue
end
@@ -25998,7 +26383,8 @@ function M.writer.new(options)
table.remove(buffer)
end
- local identifier = #buffer == 0 and "section" or table.concat(buffer, "")
+ local identifier = #buffer == 0 and "section"
+ or table.concat(buffer, "")
return identifier
end
% \end{macrocode}
@@ -26013,7 +26399,8 @@ function M.writer.new(options)
local prev_space = false
local letter_found = false
local normalized_s = s
- if not options.unicodeNormalization or options.unicodeNormalizationForm ~= "nfc" then
+ if not options.unicodeNormalization
+ or options.unicodeNormalizationForm ~= "nfc" then
normalized_s = uni_algos.normalize.NFC(normalized_s)
end
@@ -26030,7 +26417,8 @@ function M.writer.new(options)
end
end
- -- Remove all non-alphanumeric characters, except underscores and hyphens.
+ -- Remove all non-alphanumeric characters, except underscores
+ -- and hyphens.
if not unicode.utf8.match(char, "[%w_%-%s]") then
prev_space = false
goto continue
@@ -26059,7 +26447,8 @@ function M.writer.new(options)
table.remove(buffer)
end
- local identifier = #buffer == 0 and "section" or table.concat(buffer, "")
+ local identifier = #buffer == 0 and "section"
+ or table.concat(buffer, "")
return identifier
end
% \end{macrocode}
@@ -26098,9 +26487,11 @@ function M.writer.new(options)
table.insert(auto_identifiers, create_auto_identifier(flat_text))
end
if self.options.gfmAutoIdentifiers then
- table.insert(auto_identifiers, create_gfm_auto_identifier(flat_text))
+ table.insert(auto_identifiers,
+ create_gfm_auto_identifier(flat_text))
end
- local normalized_attributes = normalize_attributes(attributes, auto_identifiers)
+ local normalized_attributes = normalize_attributes(attributes,
+ auto_identifiers)
-- push attributes for the new section
local start_output = {}
@@ -26116,7 +26507,8 @@ function M.writer.new(options)
-- render the heading and its attributes
if self.is_writing and #normalized_attributes > 0 then
- table.insert(buf, "\\markdownRendererHeaderAttributeContextBegin\n")
+ table.insert(buf,
+ "\\markdownRendererHeaderAttributeContextBegin\n")
table.insert(buf, self.attributes(normalized_attributes, false))
end
@@ -26289,34 +26681,91 @@ parsers.ascii_punctuation = S("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~")
%
% \end{markdown}
% \begin{macrocode}
-parsers.punctuation = {}
-(function()
- local pathname = kpse.lookup("UnicodeData.txt")
+;(function()
+ local pathname = assert(kpse.find_file("UnicodeData.txt"),
+ [[Could not locate file "UnicodeData.txt"]])
local file = assert(io.open(pathname, "r"),
[[Could not open file "UnicodeData.txt"]])
+% \end{macrocode}
+% \par
+% \begin{markdown}
+%
+% In order to minimize the size and speed of the parser, we will first
+% construct a prefix tree of UTF-8 encodings for all codepoints of a
+% given code length.
+%
+% \end{markdown}
+% \begin{macrocode}
+ local prefix_trees = {}
for line in file:lines() do
local codepoint, major_category = line:match("^(%x+);[^;]*;(%a)")
if major_category == "P" or major_category == "S" then
local code = unicode.utf8.char(tonumber(codepoint, 16))
- if parsers.punctuation[#code] == nil then
- parsers.punctuation[#code] = parsers.fail
+ if prefix_trees[#code] == nil then
+ prefix_trees[#code] = {}
end
- local code_parser = parsers.succeed
+ local node = prefix_trees[#code]
for i = 1, #code do
local byte = code:sub(i, i)
- local byte_parser = S(byte)
- code_parser = code_parser
- * byte_parser
+ if i < #code then
+ if node[byte] == nil then
+ node[byte] = {}
+ end
+ node = node[byte]
+ else
+ table.insert(node, byte)
+ end
end
- parsers.punctuation[#code] = parsers.punctuation[#code]
- + code_parser
end
end
assert(file:close())
+% \end{macrocode}
+% \par
+% \begin{markdown}
+%
+% Next, we will construct a parser out of the prefix tree.
+%
+% \end{markdown}
+% \begin{macrocode}
+ local function depth_first_search(node, path, visit, leave)
+ visit(node, path)
+ for label, child in pairs(node) do
+ if type(child) == "table" then
+ depth_first_search(child, path .. label, visit, leave)
+ else
+ visit(child, path)
+ end
+ end
+ leave(node, path)
+ end
+
+ parsers.punctuation = {}
+ for length, prefix_tree in pairs(prefix_trees) do
+ local subparsers = {}
+ depth_first_search(prefix_tree, "", function(node, path)
+ if type(node) == "table" then
+ subparsers[path] = parsers.fail
+ else
+ assert(type(node) == "string")
+ subparsers[path] = subparsers[path] + S(node)
+ end
+ end, function(_, path)
+ if #path > 0 then
+ local byte = path:sub(#path, #path)
+ local parent_path = path:sub(1, #path-1)
+ subparsers[parent_path] = subparsers[parent_path]
+ + S(byte) * subparsers[path]
+ else
+ parsers.punctuation[length] = subparsers[path]
+ end
+ end)
+ assert(parsers.punctuation[length] ~= nil)
+ end
end)()
parsers.escapable = parsers.ascii_punctuation
-parsers.anyescaped = parsers.backslash / "" * parsers.escapable
+parsers.anyescaped = parsers.backslash / ""
+ * parsers.escapable
+ parsers.any
parsers.spacechar = S("\t ")
@@ -26335,14 +26784,18 @@ parsers.linechar = P(1 - parsers.newline)
parsers.blankline = parsers.optionalspace
* parsers.newline / "\n"
parsers.blanklines = parsers.blankline^0
-parsers.skipblanklines = (parsers.optionalspace * parsers.newline)^0
+parsers.skipblanklines = ( parsers.optionalspace
+ * parsers.newline)^0
parsers.indentedline = parsers.indent /""
- * C(parsers.linechar^1 * parsers.newline^-1)
+ * C( parsers.linechar^1
+ * parsers.newline^-1)
parsers.optionallyindentedline = parsers.indent^-1 /""
- * C(parsers.linechar^1 * parsers.newline^-1)
+ * C( parsers.linechar^1
+ * parsers.newline^-1)
parsers.sp = parsers.spacing^0
parsers.spnl = parsers.optionalspace
- * (parsers.newline * parsers.optionalspace)^-1
+ * ( parsers.newline
+ * parsers.optionalspace)^-1
parsers.line = parsers.linechar^0 * parsers.newline
parsers.nonemptyline = parsers.line - parsers.blankline
% \end{macrocode}
@@ -26425,7 +26878,8 @@ local function update_indent_table(indent_table, new_indent, add)
if add then
indent_table.indents[#indent_table.indents + 1] = new_indent
else
- if indent_table.indents[#indent_table.indents].name == new_indent.name then
+ if indent_table.indents[#indent_table.indents].name
+ == new_indent.name then
indent_table.indents[#indent_table.indents] = nil
end
end
@@ -26441,10 +26895,12 @@ end
% \end{markdown}
% \begin{macrocode}
local function remove_indent(name)
- local function remove_indent_level(s, i, indent_table) -- luacheck: ignore s i
- indent_table = update_indent_table(indent_table, {name=name}, false)
- return true, indent_table
- end
+ local remove_indent_level =
+ function(s, i, indent_table) -- luacheck: ignore s i
+ indent_table = update_indent_table(indent_table, {name=name},
+ false)
+ return true, indent_table
+ end
return Cg(Cmt(Cb("indent_info"), remove_indent_level), "indent_info")
end
@@ -26460,7 +26916,8 @@ end
%
% \end{markdown}
% \begin{macrocode}
-local function process_starter_spacing(indent, spacing, minimum, left_strip_length)
+local function process_starter_spacing(indent, spacing,
+ minimum, left_strip_length)
left_strip_length = left_strip_length or 0
local count = 0
@@ -26497,14 +26954,16 @@ local function process_starter_spacing(indent, spacing, minimum, left_strip_leng
minimum_remainder = minimum_remainder .. character
elseif (count >= minimum) then
minimum_found = true
- minimum_remainder = minimum_remainder .. string.rep(" ", count - minimum)
+ minimum_remainder = minimum_remainder
+ .. string.rep(" ", count - minimum)
end
if (code_started) then
code_start = code_start .. character
elseif (count >= minimum + 4) then
code_started = true
- code_start = code_start .. string.rep(" ", count - (minimum + 4))
+ code_start = code_start
+ .. string.rep(" ", count - (minimum + 4))
end
end
end
@@ -26571,7 +27030,8 @@ end
%
% \end{markdown}
% \begin{macrocode}
-local function process_starter_indent(_, _, indent_table, starter, is_blank, indent_type, breakable)
+local function process_starter_indent(_, _, indent_table, starter,
+ is_blank, indent_type, breakable)
local last_trail = starter[1]
local delimiter = starter[2]
local raw_new_trail = starter[3]
@@ -26599,11 +27059,13 @@ local function process_starter_indent(_, _, indent_table, starter, is_blank, ind
local last_trail_length = #last_trail
local delimiter_length = total_delimiter_length(delimiter)
- local total_indent_level = preceding_indentation + last_trail_length + delimiter_length
+ local total_indent_level = preceding_indentation + last_trail_length
+ + delimiter_length
local sp = {}
if not is_blank then
- sp = process_starter_spacing(total_indent_level, raw_new_trail, 0, 1)
+ sp = process_starter_spacing(total_indent_level, raw_new_trail,
+ 0, 1)
end
local del_trail_length = sp.left_total_stripped
@@ -26613,12 +27075,17 @@ local function process_starter_indent(_, _, indent_table, starter, is_blank, ind
del_trail_length = del_trail_length + #sp.remainder
end
- local indent_length = last_trail_length + delimiter_length + del_trail_length
+ local indent_length = last_trail_length + delimiter_length
+ + del_trail_length
local new_indent_info = {name=indent_type, length=indent_length}
- indent_table = update_indent_table(indent_table, new_indent_info, true)
- indent_table = add_trail(indent_table, {is_code=sp.is_code, remainder=sp.remainder, total_length=sp.total_length,
- full_remainder=sp.full_remainder})
+ indent_table = update_indent_table(indent_table, new_indent_info,
+ true)
+ indent_table = add_trail(indent_table,
+ {is_code=sp.is_code,
+ remainder=sp.remainder,
+ total_length=sp.total_length,
+ full_remainder=sp.full_remainder})
return true, indent_table
end
@@ -26636,7 +27103,8 @@ local function decode_pattern(name)
delimeter = parsers.more
end
- return C(parsers.optionalspace) * C(delimeter) * C(parsers.optionalspace) * Cp()
+ return C(parsers.optionalspace) * C(delimeter)
+ * C(parsers.optionalspace) * Cp()
end
% \end{macrocode}
@@ -26677,7 +27145,8 @@ end
%
% \end{markdown}
% \begin{macrocode}
-local function traverse_indent(s, i, indent_table, is_optional, is_blank, current_line_indents)
+local function traverse_indent(s, i, indent_table, is_optional,
+ is_blank, current_line_indents)
local new_index = i
local preceding_indentation = 0
@@ -26696,12 +27165,17 @@ local function traverse_indent(s, i, indent_table, is_optional, is_blank, curren
-- match decoded pattern
local new_indent_info = lpeg.match(Ct(pattern), s, new_index)
if new_indent_info == nil then
- local blankline_end = lpeg.match(Ct(parsers.blankline * Cg(Cp(), "pos")), s, new_index)
- if is_optional or not indent_table.ignore_blockquote_blank or not blankline_end then
- return is_optional, new_index, current_trail, current_line_indents
+ local blankline_end = lpeg.match(
+ Ct(parsers.blankline * Cg(Cp(), "pos")), s, new_index)
+ if is_optional or not indent_table.ignore_blockquote_blank
+ or not blankline_end then
+ return is_optional, new_index, current_trail,
+ current_line_indents
end
- return traverse_indent(s, tonumber(blankline_end.pos), indent_table, is_optional, is_blank, current_line_indents)
+ return traverse_indent(s, tonumber(blankline_end.pos),
+ indent_table, is_optional, is_blank,
+ current_line_indents)
end
local raw_last_trail = new_indent_info[1]
@@ -26714,13 +27188,15 @@ local function traverse_indent(s, i, indent_table, is_optional, is_blank, curren
-- check previous trail
if not space_only and next(current_trail) == nil then
local sp = process_starter_spacing(0, raw_last_trail, 0, 0)
- current_trail = {is_code=sp.is_code, remainder=sp.remainder, total_length=sp.total_length,
+ current_trail = {is_code=sp.is_code, remainder=sp.remainder,
+ total_length=sp.total_length,
full_remainder=sp.full_remainder}
end
if next(current_trail) ~= nil then
if not space_only and current_trail.is_code then
- return is_optional, new_index, current_trail, current_line_indents
+ return is_optional, new_index, current_trail,
+ current_line_indents
end
if current_trail.internal_remainder ~= nil then
raw_last_trail = current_trail.internal_remainder
@@ -26735,7 +27211,8 @@ local function traverse_indent(s, i, indent_table, is_optional, is_blank, curren
raw_last_trail_length = #raw_last_trail
end
- local total_indent_level = preceding_indentation + raw_last_trail_length + delimiter_length
+ local total_indent_level = preceding_indentation
+ + raw_last_trail_length + delimiter_length
local spacing_to_process
local minimum = 0
@@ -26749,13 +27226,17 @@ local function traverse_indent(s, i, indent_table, is_optional, is_blank, curren
minimum = value.length
end
- local sp = process_starter_spacing(total_indent_level, spacing_to_process, minimum, left_strip_length)
+ local sp = process_starter_spacing(total_indent_level,
+ spacing_to_process, minimum,
+ left_strip_length)
if space_only and not sp.is_minimum then
- return is_optional or (is_blank and blank_starter <= index), new_index, current_trail, current_line_indents
+ return is_optional or (is_blank and blank_starter <= index),
+ new_index, current_trail, current_line_indents
end
- local indent_length = raw_last_trail_length + delimiter_length + sp.left_total_stripped
+ local indent_length = raw_last_trail_length + delimiter_length
+ + sp.left_total_stripped
-- update info for the next pattern
if not space_only then
@@ -26764,8 +27245,10 @@ local function traverse_indent(s, i, indent_table, is_optional, is_blank, curren
preceding_indentation = preceding_indentation + value.length
end
- current_trail = {is_code=sp.is_code, remainder=sp.remainder, internal_remainder=sp.minimum_remainder,
- total_length=sp.total_length, full_remainder=sp.full_remainder}
+ current_trail = {is_code=sp.is_code, remainder=sp.remainder,
+ internal_remainder=sp.minimum_remainder,
+ total_length=sp.total_length,
+ full_remainder=sp.full_remainder}
current_line_indents[#current_line_indents + 1] = new_indent_info
new_index = next_index
@@ -26793,34 +27276,36 @@ end
%
% \end{markdown}
% \begin{macrocode}
-local function check_trail_joined(s, i, indent_table, spacing, expect_code, omit_remainder) -- luacheck: ignore s i
- local is_code
- local remainder
+local check_trail_joined =
+ function(s, i, indent_table, -- luacheck: ignore s i
+ spacing, expect_code, omit_remainder)
+ local is_code
+ local remainder
- if has_trail(indent_table) then
- local trail = indent_table.trail
- is_code = trail.is_code
- if is_code then
- remainder = trail.remainder
- else
- remainder = trail.full_remainder
- end
- else
- local sp = process_starter_spacing(0, spacing, 0, 0)
- is_code = sp.is_code
- if is_code then
- remainder = sp.remainder
+ if has_trail(indent_table) then
+ local trail = indent_table.trail
+ is_code = trail.is_code
+ if is_code then
+ remainder = trail.remainder
+ else
+ remainder = trail.full_remainder
+ end
else
- remainder = sp.full_remainder
+ local sp = process_starter_spacing(0, spacing, 0, 0)
+ is_code = sp.is_code
+ if is_code then
+ remainder = sp.remainder
+ else
+ remainder = sp.full_remainder
+ end
end
- end
- local result = check_trail(expect_code, is_code)
- if omit_remainder then
- return result
+ local result = check_trail(expect_code, is_code)
+ if omit_remainder then
+ return result
+ end
+ return result, remainder
end
- return result, remainder
-end
% \end{macrocode}
% \begin{markdown}
@@ -26829,22 +27314,24 @@ end
%
% \end{markdown}
% \begin{macrocode}
-local function check_trail_length(s, i, indent_table, spacing, min, max) -- luacheck: ignore s i
- local trail
+local check_trail_length =
+ function(s, i, indent_table, -- luacheck: ignore s i
+ spacing, min, max)
+ local trail
- if has_trail(indent_table) then
- trail = indent_table.trail
- else
- trail = process_starter_spacing(0, spacing, 0, 0)
- end
+ if has_trail(indent_table) then
+ trail = indent_table.trail
+ else
+ trail = process_starter_spacing(0, spacing, 0, 0)
+ end
- local total_length = trail.total_length
- if total_length == nil then
- return false
- end
+ local total_length = trail.total_length
+ if total_length == nil then
+ return false
+ end
- return min <= total_length and total_length <= max
-end
+ return min <= total_length and total_length <= max
+ end
% \end{macrocode}
% \begin{markdown}
@@ -26854,7 +27341,8 @@ end
%
% \end{markdown}
% \begin{macrocode}
-local function check_continuation_indentation(s, i, indent_table, is_optional, is_blank)
+local function check_continuation_indentation(s, i, indent_table,
+ is_optional, is_blank)
if not has_indents(indent_table) then
return true
end
@@ -26907,27 +27395,29 @@ end
%
% \end{markdown}
% \begin{macrocode}
-local function check_trail_type(s, i, trail, spacing, trail_type) -- luacheck: ignore s i
- if trail == nil then
- trail = process_starter_spacing(0, spacing, 0, 0)
- end
+local check_trail_type =
+ function(s, i, -- luacheck: ignore s i
+ trail, spacing, trail_type)
+ if trail == nil then
+ trail = process_starter_spacing(0, spacing, 0, 0)
+ end
- if trail_type == "non-code" then
- return check_trail(false, trail.is_code)
- end
- if trail_type == "code" then
- return check_trail(true, trail.is_code)
- end
- if trail_type == "full-code" then
- if (trail.is_code) then
- return i, trail.remainder
+ if trail_type == "non-code" then
+ return check_trail(false, trail.is_code)
+ end
+ if trail_type == "code" then
+ return check_trail(true, trail.is_code)
+ end
+ if trail_type == "full-code" then
+ if (trail.is_code) then
+ return i, trail.remainder
+ end
+ return i, ""
+ end
+ if trail_type == "full-any" then
+ return i, trail.internal_remainder
end
- return i, ""
- end
- if trail_type == "full-any" then
- return i, trail.internal_remainder
end
-end
% \end{macrocode}
% \begin{markdown}
@@ -26936,20 +27426,22 @@ end
%
% \end{markdown}
% \begin{macrocode}
-local function trail_freezing(s, i, indent_table, is_freezing) -- luacheck: ignore s i
- if is_freezing then
- if indent_table.is_trail_frozen then
- indent_table.trail = indent_table.frozen_trail
+local trail_freezing =
+ function(s, i, -- luacheck: ignore s i
+ indent_table, is_freezing)
+ if is_freezing then
+ if indent_table.is_trail_frozen then
+ indent_table.trail = indent_table.frozen_trail
+ else
+ indent_table.frozen_trail = indent_table.trail
+ indent_table.is_trail_frozen = true
+ end
else
- indent_table.frozen_trail = indent_table.trail
- indent_table.is_trail_frozen = true
+ indent_table.frozen_trail = nil
+ indent_table.is_trail_frozen = false
end
- else
- indent_table.frozen_trail = nil
- indent_table.is_trail_frozen = false
+ return true, indent_table
end
- return true, indent_table
-end
% \end{macrocode}
% \begin{markdown}
@@ -26960,53 +27452,59 @@ end
%
% \end{markdown}
% \begin{macrocode}
-local function check_continuation_indentation_and_trail(s, i, indent_table, is_optional, is_blank, trail_type,
- reset_rem, omit_remainder)
- if not has_indents(indent_table) then
- local spacing, new_index = lpeg.match(C(parsers.spacechar^0) * Cp(), s, i)
- local result, remainder = check_trail_type(s, i, indent_table.trail, spacing, trail_type)
- if remainder == nil then
+local check_continuation_indentation_and_trail =
+ function (s, i, indent_table, is_optional, is_blank, trail_type,
+ reset_rem, omit_remainder)
+ if not has_indents(indent_table) then
+ local spacing, new_index = lpeg.match( C(parsers.spacechar^0)
+ * Cp(), s, i)
+ local result, remainder = check_trail_type(s, i,
+ indent_table.trail, spacing, trail_type)
+ if remainder == nil then
+ if result then
+ return new_index
+ end
+ return false
+ end
if result then
- return new_index
+ return new_index, remainder
end
return false
end
- if result then
- return new_index, remainder
- end
- return false
- end
- local passes, new_index, current_trail = traverse_indent(s, i, indent_table, is_optional, is_blank)
+ local passes, new_index, current_trail = traverse_indent(s, i,
+ indent_table, is_optional, is_blank)
+
+ if passes then
+ local spacing
+ if current_trail == nil then
+ local newer_spacing, newer_index = lpeg.match(
+ C(parsers.spacechar^0) * Cp(), s, i)
+ current_trail = process_starter_spacing(0, newer_spacing, 0, 0)
+ new_index = newer_index
+ spacing = newer_spacing
+ else
+ spacing = current_trail.remainder
+ end
+ local result, remainder = check_trail_type(s, new_index,
+ current_trail, spacing, trail_type)
+ if remainder == nil or omit_remainder then
+ if result then
+ return new_index
+ end
+ return false
+ end
- if passes then
- local spacing
- if current_trail == nil then
- local newer_spacing, newer_index = lpeg.match(C(parsers.spacechar^0) * Cp(), s, i)
- current_trail = process_starter_spacing(0, newer_spacing, 0, 0)
- new_index = newer_index
- spacing = newer_spacing
- else
- spacing = current_trail.remainder
- end
- local result, remainder = check_trail_type(s, new_index, current_trail, spacing, trail_type)
- if remainder == nil or omit_remainder then
+ if is_blank and reset_rem then
+ remainder = remove_remainder_if_blank(indent_table, remainder)
+ end
if result then
- return new_index
+ return new_index, remainder
end
return false
end
-
- if is_blank and reset_rem then
- remainder = remove_remainder_if_blank(indent_table, remainder)
- end
- if result then
- return new_index, remainder
- end
return false
end
- return false
-end
% \end{macrocode}
% \begin{markdown}
@@ -27015,14 +27513,20 @@ end
%
% \end{markdown}
% \begin{macrocode}
-parsers.check_trail = Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(false), check_trail_joined)
+parsers.check_trail = Cmt( Cb("indent_info") * C(parsers.spacechar^0)
+ * Cc(false), check_trail_joined)
-parsers.check_trail_no_rem = Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(false) * Cc(true), check_trail_joined)
+parsers.check_trail_no_rem = Cmt( Cb("indent_info")
+ * C(parsers.spacechar^0) * Cc(false)
+ * Cc(true), check_trail_joined)
-parsers.check_code_trail = Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(true), check_trail_joined)
+parsers.check_code_trail = Cmt( Cb("indent_info")
+ * C(parsers.spacechar^0)
+ * Cc(true), check_trail_joined)
parsers.check_trail_length_range = function(min, max)
- return Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(min) * Cc(max), check_trail_length)
+ return Cmt( Cb("indent_info") * C(parsers.spacechar^0) * Cc(min)
+ * Cc(max), check_trail_length)
end
parsers.check_trail_length = function(n)
@@ -27037,9 +27541,11 @@ end
%
% \end{markdown}
% \begin{macrocode}
-parsers.freeze_trail = Cg(Cmt(Cb("indent_info") * Cc(true), trail_freezing), "indent_info")
+parsers.freeze_trail = Cg( Cmt(Cb("indent_info")
+ * Cc(true), trail_freezing), "indent_info")
-parsers.unfreeze_trail = Cg(Cmt(Cb("indent_info") * Cc(false), trail_freezing), "indent_info")
+parsers.unfreeze_trail = Cg(Cmt(Cb("indent_info") * Cc(false),
+ trail_freezing), "indent_info")
% \end{macrocode}
% \begin{markdown}
@@ -27048,11 +27554,16 @@ parsers.unfreeze_trail = Cg(Cmt(Cb("indent_info") * Cc(false), trail_freezing),
%
% \end{markdown}
% \begin{macrocode}
-parsers.check_minimal_indent = Cmt(Cb("indent_info") * Cc(false), check_continuation_indentation)
+parsers.check_minimal_indent = Cmt(Cb("indent_info") * Cc(false),
+ check_continuation_indentation)
-parsers.check_optional_indent = Cmt(Cb("indent_info") * Cc(true), check_continuation_indentation)
+parsers.check_optional_indent = Cmt(Cb("indent_info") * Cc(true),
+ check_continuation_indentation)
-parsers.check_minimal_blank_indent = Cmt(Cb("indent_info") * Cc(false) * Cc(true), check_continuation_indentation)
+parsers.check_minimal_blank_indent
+ = Cmt( Cb("indent_info") * Cc(false)
+ * Cc(true)
+ , check_continuation_indentation)
% \end{macrocode}
% \begin{markdown}
@@ -27063,37 +27574,45 @@ parsers.check_minimal_blank_indent = Cmt(Cb("indent_info") * Cc(false) * Cc(true
% \end{markdown}
% \begin{macrocode}
-parsers.check_minimal_indent_and_trail = Cmt( Cb("indent_info")
- * Cc(false) * Cc(false) * Cc("non-code") * Cc(true),
- check_continuation_indentation_and_trail)
+parsers.check_minimal_indent_and_trail =
+ Cmt( Cb("indent_info")
+ * Cc(false) * Cc(false) * Cc("non-code") * Cc(true)
+ , check_continuation_indentation_and_trail)
-parsers.check_minimal_indent_and_code_trail = Cmt( Cb("indent_info")
- * Cc(false) * Cc(false) * Cc("code") * Cc(false),
- check_continuation_indentation_and_trail)
+parsers.check_minimal_indent_and_code_trail =
+ Cmt( Cb("indent_info")
+ * Cc(false) * Cc(false) * Cc("code") * Cc(false)
+ , check_continuation_indentation_and_trail)
-parsers.check_minimal_blank_indent_and_full_code_trail = Cmt( Cb("indent_info")
- * Cc(false) * Cc(true) * Cc("full-code") * Cc(true),
- check_continuation_indentation_and_trail)
+parsers.check_minimal_blank_indent_and_full_code_trail =
+ Cmt( Cb("indent_info")
+ * Cc(false) * Cc(true) * Cc("full-code") * Cc(true)
+ , check_continuation_indentation_and_trail)
-parsers.check_minimal_indent_and_any_trail = Cmt( Cb("indent_info")
- * Cc(false) * Cc(false) * Cc("full-any") * Cc(true) * Cc(false),
- check_continuation_indentation_and_trail)
+parsers.check_minimal_indent_and_any_trail =
+ Cmt( Cb("indent_info")
+ * Cc(false) * Cc(false) * Cc("full-any") * Cc(true) * Cc(false)
+ , check_continuation_indentation_and_trail)
-parsers.check_minimal_blank_indent_and_any_trail = Cmt( Cb("indent_info")
- * Cc(false) * Cc(true) * Cc("full-any") * Cc(true) * Cc(false),
- check_continuation_indentation_and_trail)
+parsers.check_minimal_blank_indent_and_any_trail =
+ Cmt( Cb("indent_info")
+ * Cc(false) * Cc(true) * Cc("full-any") * Cc(true) * Cc(false)
+ , check_continuation_indentation_and_trail)
-parsers.check_minimal_blank_indent_and_any_trail_no_rem = Cmt( Cb("indent_info")
- * Cc(false) * Cc(true) * Cc("full-any") * Cc(true) * Cc(true),
- check_continuation_indentation_and_trail)
+parsers.check_minimal_blank_indent_and_any_trail_no_rem =
+ Cmt( Cb("indent_info")
+ * Cc(false) * Cc(true) * Cc("full-any") * Cc(true) * Cc(true)
+ , check_continuation_indentation_and_trail)
-parsers.check_optional_indent_and_any_trail = Cmt( Cb("indent_info")
- * Cc(true) * Cc(false) * Cc("full-any") * Cc(true) * Cc(false),
- check_continuation_indentation_and_trail)
+parsers.check_optional_indent_and_any_trail =
+ Cmt( Cb("indent_info")
+ * Cc(true) * Cc(false) * Cc("full-any") * Cc(true) * Cc(false)
+ , check_continuation_indentation_and_trail)
-parsers.check_optional_blank_indent_and_any_trail = Cmt( Cb("indent_info")
- * Cc(true) * Cc(true) * Cc("full-any") * Cc(true) * Cc(false),
- check_continuation_indentation_and_trail)
+parsers.check_optional_blank_indent_and_any_trail =
+ Cmt( Cb("indent_info")
+ * Cc(true) * Cc(true) * Cc("full-any") * Cc(true) * Cc(false)
+ , check_continuation_indentation_and_trail)
% \end{macrocode}
% \begin{markdown}
@@ -27104,7 +27623,8 @@ parsers.check_optional_blank_indent_and_any_trail = Cmt( Cb("indent_info")
% \begin{macrocode}
parsers.spnlc_noexc = parsers.optionalspace
- * (parsers.newline * parsers.check_minimal_indent_and_any_trail)^-1
+ * ( parsers.newline
+ * parsers.check_minimal_indent_and_any_trail)^-1
parsers.spnlc = parsers.optionalspace
* (V("EndlineNoSub"))^-1
@@ -27112,7 +27632,8 @@ parsers.spnlc = parsers.optionalspace
parsers.spnlc_sep = parsers.optionalspace * V("EndlineNoSub")
+ parsers.spacechar^1
-parsers.only_blank = parsers.spacechar^0 * (parsers.newline + parsers.eof)
+parsers.only_blank = parsers.spacechar^0
+ * (parsers.newline + parsers.eof)
% \end{macrocode}
% \begin{figure}
@@ -27159,64 +27680,66 @@ parsers.commented_line_letter = parsers.linechar
+ parsers.newline
- parsers.backslash
- parsers.percent
-parsers.commented_line = Cg(Cc(""), "backslashes")
- * ((#(parsers.commented_line_letter
- - parsers.newline)
- * Cb("backslashes")
- * Cs(parsers.commented_line_letter
- - parsers.newline)^1 -- initial
- * Cg(Cc(""), "backslashes"))
- + #(parsers.backslash * parsers.backslash)
- * Cg((parsers.backslash -- even backslash
- * parsers.backslash)^1, "backslashes")
- + (parsers.backslash
- * (#parsers.percent
- * Cb("backslashes")
- / function(backslashes)
- return string.rep("\\", #backslashes / 2)
- end
- * C(parsers.percent)
- + #parsers.commented_line_letter
- * Cb("backslashes")
- * Cc("\\")
- * C(parsers.commented_line_letter))
- * Cg(Cc(""), "backslashes")))^0
- * (#parsers.percent
- * Cb("backslashes")
- / function(backslashes)
- return string.rep("\\", #backslashes / 2)
- end
- * ((parsers.percent -- comment
- * parsers.line
- * #parsers.blankline) -- blank line
- / "\n"
- + parsers.percent -- comment
- * parsers.line
- * parsers.optionalspace) -- leading tabs and spaces
- + #(parsers.newline)
- * Cb("backslashes")
- * C(parsers.newline))
-
-parsers.chunk = parsers.line * (parsers.optionallyindentedline
- - parsers.blankline)^0
-
-parsers.attribute_key_char = parsers.alphanumeric + S("-_:.")
-parsers.attribute_raw_char = parsers.alphanumeric + S("-_")
-parsers.attribute_key = (parsers.attribute_key_char
- - parsers.dash - parsers.digit)
- * parsers.attribute_key_char^0
-parsers.attribute_value = ( (parsers.dquote / "")
- * (parsers.anyescaped - parsers.dquote)^0
- * (parsers.dquote / ""))
- + ( (parsers.squote / "")
- * (parsers.anyescaped - parsers.squote)^0
- * (parsers.squote / ""))
- + ( parsers.anyescaped - parsers.dquote - parsers.rbrace
- - parsers.space)^0
-parsers.attribute_identifier = parsers.attribute_key_char^1
-parsers.attribute_classname = parsers.letter
- * parsers.attribute_key_char^0
-parsers.attribute_raw = parsers.attribute_raw_char^1
+parsers.commented_line = Cg(Cc(""), "backslashes")
+ * ((#(parsers.commented_line_letter
+ - parsers.newline)
+ * Cb("backslashes")
+ * Cs(parsers.commented_line_letter
+ - parsers.newline)^1 -- initial
+ * Cg(Cc(""), "backslashes"))
+ + #(parsers.backslash * parsers.backslash)
+ * Cg((parsers.backslash -- even backslash
+ * parsers.backslash)^1, "backslashes")
+ + (parsers.backslash
+ * (#parsers.percent
+ * Cb("backslashes")
+ / function(backslashes)
+ return string.rep("\\", #backslashes / 2)
+ end
+ * C(parsers.percent)
+ + #parsers.commented_line_letter
+ * Cb("backslashes")
+ * Cc("\\")
+ * C(parsers.commented_line_letter))
+ * Cg(Cc(""), "backslashes")))^0
+ * (#parsers.percent
+ * Cb("backslashes")
+ / function(backslashes)
+ return string.rep("\\", #backslashes / 2)
+ end
+ * ((parsers.percent -- comment
+ * parsers.line
+ * #parsers.blankline) -- blank line
+ / "\n"
+ + parsers.percent -- comment
+ * parsers.line
+ * parsers.optionalspace) -- leading spaces
+ + #(parsers.newline)
+ * Cb("backslashes")
+ * C(parsers.newline))
+
+parsers.chunk = parsers.line * (parsers.optionallyindentedline
+ - parsers.blankline)^0
+
+parsers.attribute_key_char = parsers.alphanumeric + S("-_:.")
+parsers.attribute_raw_char = parsers.alphanumeric + S("-_")
+parsers.attribute_key = (parsers.attribute_key_char
+ - parsers.dash - parsers.digit)
+ * parsers.attribute_key_char^0
+parsers.attribute_value = ( (parsers.dquote / "")
+ * (parsers.anyescaped - parsers.dquote)^0
+ * (parsers.dquote / ""))
+ + ( (parsers.squote / "")
+ * (parsers.anyescaped - parsers.squote)^0
+ * (parsers.squote / ""))
+ + ( parsers.anyescaped
+ - parsers.dquote
+ - parsers.rbrace
+ - parsers.space)^0
+parsers.attribute_identifier = parsers.attribute_key_char^1
+parsers.attribute_classname = parsers.letter
+ * parsers.attribute_key_char^0
+parsers.attribute_raw = parsers.attribute_raw_char^1
parsers.attribute = (parsers.dash * Cc(".unnumbered"))
+ C( parsers.hash
@@ -27224,7 +27747,9 @@ parsers.attribute = (parsers.dash * Cc(".unnumbered"))
+ C( parsers.period
* parsers.attribute_classname)
+ Cs( parsers.attribute_key
- * parsers.optionalspace * parsers.equal * parsers.optionalspace
+ * parsers.optionalspace
+ * parsers.equal
+ * parsers.optionalspace
* parsers.attribute_value)
parsers.attributes = parsers.lbrace
* parsers.optionalspace
@@ -27234,7 +27759,6 @@ parsers.attributes = parsers.lbrace
* parsers.optionalspace
* parsers.rbrace
-
parsers.raw_attribute = parsers.lbrace
* parsers.optionalspace
* parsers.equal
@@ -27246,7 +27770,10 @@ parsers.raw_attribute = parsers.lbrace
-- indented blocks with first line indented.
parsers.indented_blocks = function(bl)
return Cs( bl
- * (parsers.blankline^1 * parsers.indent * -parsers.blankline * bl)^0
+ * ( parsers.blankline^1
+ * parsers.indent
+ * -parsers.blankline
+ * bl)^0
* (parsers.blankline^1 + parsers.eof) )
end
% \end{macrocode}
@@ -27262,15 +27789,18 @@ local function repeat_between(pattern, min, max)
end
parsers.hexentity = parsers.ampersand * parsers.hash * C(S("Xx"))
- * C(repeat_between(parsers.hexdigit, 1, 6)) * parsers.semicolon
+ * C(repeat_between(parsers.hexdigit, 1, 6))
+ * parsers.semicolon
parsers.decentity = parsers.ampersand * parsers.hash
- * C(repeat_between(parsers.digit, 1, 7)) * parsers.semicolon
+ * C(repeat_between(parsers.digit, 1, 7))
+ * parsers.semicolon
parsers.tagentity = parsers.ampersand * C(parsers.alphanumeric^1)
* parsers.semicolon
-parsers.html_entities = parsers.hexentity / entities.hex_entity_with_x_char
- + parsers.decentity / entities.dec_entity
- + parsers.tagentity / entities.char_entity
+parsers.html_entities
+ = parsers.hexentity / entities.hex_entity_with_x_char
+ + parsers.decentity / entities.dec_entity
+ + parsers.tagentity / entities.char_entity
% \end{macrocode}
% \par
% \begin{markdown}
@@ -27284,7 +27814,8 @@ parsers.bullet = function(bullet_char, interrupting)
if interrupting then
allowed_end = C(parsers.spacechar^1) * #parsers.linechar
else
- allowed_end = C(parsers.spacechar^1) + #(parsers.newline + parsers.eof)
+ allowed_end = C(parsers.spacechar^1)
+ + #(parsers.newline + parsers.eof)
end
return parsers.check_trail
* Ct(C(bullet_char) * Cc(""))
@@ -27342,7 +27873,8 @@ parsers.inticks = parsers.openticks
%
% \end{markdown}
% \begin{macrocode}
--- case-insensitive match (we assume s is lowercase). must be single byte encoding
+-- case-insensitive match (we assume s is lowercase)
+-- must be single byte encoding
parsers.keyword_exact = function(s)
local parser = P(0)
for i=1,#s do
@@ -27424,13 +27956,14 @@ parsers.block_keyword =
parsers.keyword_exact("ul")
-- end conditions
-parsers.html_blankline_end_condition = parsers.linechar^0
- * ( parsers.newline
- * (parsers.check_minimal_blank_indent_and_any_trail
- * #parsers.blankline
- + parsers.check_minimal_indent_and_any_trail)
- * parsers.linechar^1)^0
- * (parsers.newline^-1 / "")
+parsers.html_blankline_end_condition
+ = parsers.linechar^0
+ * ( parsers.newline
+ * (parsers.check_minimal_blank_indent_and_any_trail
+ * #parsers.blankline
+ + parsers.check_minimal_indent_and_any_trail)
+ * parsers.linechar^1)^0
+ * (parsers.newline^-1 / "")
local function remove_trailing_blank_lines(s)
return s:gsub("[\n\r]+%s*$", "")
@@ -27452,9 +27985,14 @@ parsers.html_attribute_spacing = parsers.optionalspace
* parsers.optionalspace
+ parsers.spacechar^1
-parsers.html_attribute_name = (parsers.letter + parsers.colon + parsers.underscore)
- * (parsers.alphanumeric + parsers.colon + parsers.underscore
- + parsers.period + parsers.dash)^0
+parsers.html_attribute_name = ( parsers.letter
+ + parsers.colon
+ + parsers.underscore)
+ * ( parsers.alphanumeric
+ + parsers.colon
+ + parsers.underscore
+ + parsers.period
+ + parsers.dash)^0
parsers.html_attribute_value = parsers.squote
* (parsers.linechar - parsers.squote)^0
@@ -27462,9 +28000,15 @@ parsers.html_attribute_value = parsers.squote
+ parsers.dquote
* (parsers.linechar - parsers.dquote)^0
* parsers.dquote
- + ( parsers.any - parsers.spacechar - parsers.newline
- - parsers.dquote - parsers.squote - parsers.backtick
- - parsers.equal - parsers.less - parsers.more)^1
+ + ( parsers.any
+ - parsers.spacechar
+ - parsers.newline
+ - parsers.dquote
+ - parsers.squote
+ - parsers.backtick
+ - parsers.equal
+ - parsers.less
+ - parsers.more)^1
parsers.html_inline_attribute_value = parsers.squote
* (V("NoSoftLineBreakEndline")
@@ -27478,30 +28022,41 @@ parsers.html_inline_attribute_value = parsers.squote
- parsers.blankline^2
- parsers.dquote)^0
* parsers.dquote
- + (parsers.any - parsers.spacechar - parsers.newline
- - parsers.dquote - parsers.squote - parsers.backtick
- - parsers.equal - parsers.less - parsers.more)^1
-
-parsers.html_attribute_value_specification = parsers.optionalspace
- * parsers.equal
- * parsers.optionalspace
- * parsers.html_attribute_value
+ + (parsers.any
+ - parsers.spacechar
+ - parsers.newline
+ - parsers.dquote
+ - parsers.squote
+ - parsers.backtick
+ - parsers.equal
+ - parsers.less
+ - parsers.more)^1
+
+parsers.html_attribute_value_specification
+ = parsers.optionalspace
+ * parsers.equal
+ * parsers.optionalspace
+ * parsers.html_attribute_value
parsers.html_spnl = parsers.optionalspace
- * (V("NoSoftLineBreakEndline") * parsers.optionalspace)^-1
+ * (V("NoSoftLineBreakEndline")
+ * parsers.optionalspace)^-1
-parsers.html_inline_attribute_value_specification = parsers.html_spnl
- * parsers.equal
- * parsers.html_spnl
- * parsers.html_inline_attribute_value
+parsers.html_inline_attribute_value_specification
+ = parsers.html_spnl
+ * parsers.equal
+ * parsers.html_spnl
+ * parsers.html_inline_attribute_value
-parsers.html_attribute = parsers.html_attribute_spacing
- * parsers.html_attribute_name
- * parsers.html_inline_attribute_value_specification^-1
+parsers.html_attribute
+ = parsers.html_attribute_spacing
+ * parsers.html_attribute_name
+ * parsers.html_inline_attribute_value_specification^-1
-parsers.html_non_newline_attribute = parsers.spacechar^1
- * parsers.html_attribute_name
- * parsers.html_attribute_value_specification^-1
+parsers.html_non_newline_attribute
+ = parsers.spacechar^1
+ * parsers.html_attribute_name
+ * parsers.html_attribute_value_specification^-1
parsers.nested_breaking_blank = parsers.newline
* parsers.check_minimal_blank_indent
@@ -27511,49 +28066,59 @@ parsers.html_comment_start = P("<!--")
parsers.html_comment_end = P("-->")
-parsers.html_comment = Cs( parsers.html_comment_start
- * parsers.html_until_end(parsers.html_comment_end))
+parsers.html_comment
+ = Cs( parsers.html_comment_start
+ * parsers.html_until_end(parsers.html_comment_end))
parsers.html_inline_comment = (parsers.html_comment_start / "")
* -P(">") * -P("->")
- * Cs((V("NoSoftLineBreakEndline") + parsers.any
- - parsers.nested_breaking_blank - parsers.html_comment_end)^0)
+ * Cs(( V("NoSoftLineBreakEndline")
+ + parsers.any
+ - parsers.nested_breaking_blank
+ - parsers.html_comment_end)^0)
* (parsers.html_comment_end / "")
parsers.html_cdatasection_start = P("<![CDATA[")
parsers.html_cdatasection_end = P("]]>")
-parsers.html_cdatasection = Cs( parsers.html_cdatasection_start
- * parsers.html_until_end(parsers.html_cdatasection_end))
+parsers.html_cdatasection
+ = Cs( parsers.html_cdatasection_start
+ * parsers.html_until_end(parsers.html_cdatasection_end))
-parsers.html_inline_cdatasection = parsers.html_cdatasection_start
- * Cs(V("NoSoftLineBreakEndline") + parsers.any
- - parsers.nested_breaking_blank - parsers.html_cdatasection_end)^0
- * parsers.html_cdatasection_end
+parsers.html_inline_cdatasection
+ = parsers.html_cdatasection_start
+ * Cs(V("NoSoftLineBreakEndline") + parsers.any
+ - parsers.nested_breaking_blank - parsers.html_cdatasection_end)^0
+ * parsers.html_cdatasection_end
parsers.html_declaration_start = P("<!") * parsers.letter
parsers.html_declaration_end = P(">")
-parsers.html_declaration = Cs( parsers.html_declaration_start
- * parsers.html_until_end(parsers.html_declaration_end))
+parsers.html_declaration
+ = Cs( parsers.html_declaration_start
+ * parsers.html_until_end(parsers.html_declaration_end))
-parsers.html_inline_declaration = parsers.html_declaration_start
- * Cs(V("NoSoftLineBreakEndline") + parsers.any
- - parsers.nested_breaking_blank - parsers.html_declaration_end)^0
- * parsers.html_declaration_end
+parsers.html_inline_declaration
+ = parsers.html_declaration_start
+ * Cs(V("NoSoftLineBreakEndline") + parsers.any
+ - parsers.nested_breaking_blank - parsers.html_declaration_end)^0
+ * parsers.html_declaration_end
parsers.html_instruction_start = P("<?")
parsers.html_instruction_end = P("?>")
-parsers.html_instruction = Cs( parsers.html_instruction_start
- * parsers.html_until_end(parsers.html_instruction_end))
+parsers.html_instruction
+ = Cs( parsers.html_instruction_start
+ * parsers.html_until_end(parsers.html_instruction_end))
parsers.html_inline_instruction = parsers.html_instruction_start
- * Cs(V("NoSoftLineBreakEndline") + parsers.any
- - parsers.nested_breaking_blank - parsers.html_instruction_end)^0
+ * Cs( V("NoSoftLineBreakEndline")
+ + parsers.any
+ - parsers.nested_breaking_blank
+ - parsers.html_instruction_end)^0
* parsers.html_instruction_end
parsers.html_blankline = parsers.newline
@@ -27599,25 +28164,28 @@ parsers.incomplete_tag_following = parsers.spacechar
+ parsers.slash * parsers.more
+ #(parsers.newline + parsers.eof)
-parsers.incomplete_special_tag_following = parsers.spacechar
- + parsers.more
- + #(parsers.newline + parsers.eof)
+parsers.incomplete_special_tag_following = parsers.spacechar
+ + parsers.more
+ + #( parsers.newline
+ + parsers.eof)
parsers.html_incomplete_open_tag = parsers.html_tag_start
* parsers.block_keyword
* parsers.incomplete_tag_following
-parsers.html_incomplete_open_special_tag = parsers.html_tag_start
- * parsers.special_block_keyword
- * parsers.incomplete_special_tag_following
+parsers.html_incomplete_open_special_tag
+ = parsers.html_tag_start
+ * parsers.special_block_keyword
+ * parsers.incomplete_special_tag_following
parsers.html_incomplete_close_tag = parsers.html_tag_closing_start
* parsers.block_keyword
* parsers.incomplete_tag_following
-parsers.html_incomplete_close_special_tag = parsers.html_tag_closing_start
- * parsers.special_block_keyword
- * parsers.incomplete_tag_following
+parsers.html_incomplete_close_special_tag
+ = parsers.html_tag_closing_start
+ * parsers.special_block_keyword
+ * parsers.incomplete_tag_following
-- closing tags
parsers.html_close_tag = parsers.html_tag_closing_start
@@ -27655,27 +28223,33 @@ parsers.html_empty_special_tag = parsers.html_tag_start
* parsers.html_attribute^0
* parsers.html_empty_tag_end
-parsers.html_incomplete_blocks = parsers.html_incomplete_open_tag
- + parsers.html_incomplete_open_special_tag
- + parsers.html_incomplete_close_tag
+parsers.html_incomplete_blocks
+ = parsers.html_incomplete_open_tag
+ + parsers.html_incomplete_open_special_tag
+ + parsers.html_incomplete_close_tag
-- parse special html blocks
-parsers.html_blankline_ending_special_block_opening = (parsers.html_close_special_tag
- + parsers.html_empty_special_tag)
- * #(parsers.optionalspace
- * (parsers.newline + parsers.eof))
+parsers.html_blankline_ending_special_block_opening
+ = ( parsers.html_close_special_tag
+ + parsers.html_empty_special_tag)
+ * #( parsers.optionalspace
+ * (parsers.newline + parsers.eof))
-parsers.html_blankline_ending_special_block = parsers.html_blankline_ending_special_block_opening
- * parsers.html_blankline_end_condition
+parsers.html_blankline_ending_special_block
+ = parsers.html_blankline_ending_special_block_opening
+ * parsers.html_blankline_end_condition
-parsers.html_special_block_opening = parsers.html_incomplete_open_special_tag
- - parsers.html_empty_special_tag
+parsers.html_special_block_opening
+ = parsers.html_incomplete_open_special_tag
+ - parsers.html_empty_special_tag
-parsers.html_closing_special_block = parsers.html_special_block_opening
- * parsers.html_until_end(parsers.html_close_special_tag)
+parsers.html_closing_special_block
+ = parsers.html_special_block_opening
+ * parsers.html_until_end(parsers.html_close_special_tag)
-parsers.html_special_block = parsers.html_blankline_ending_special_block
- + parsers.html_closing_special_block
+parsers.html_special_block
+ = parsers.html_blankline_ending_special_block
+ + parsers.html_closing_special_block
-- parse html blocks
parsers.html_block_opening = parsers.html_incomplete_open_tag
@@ -27685,18 +28259,21 @@ parsers.html_block = parsers.html_block_opening
* parsers.html_blankline_end_condition
-- parse any html blocks
-parsers.html_any_block_opening = (parsers.html_any_open_tag
- + parsers.html_any_close_tag
- + parsers.html_any_empty_tag)
- * #(parsers.optionalspace * (parsers.newline + parsers.eof))
+parsers.html_any_block_opening
+ = ( parsers.html_any_open_tag
+ + parsers.html_any_close_tag
+ + parsers.html_any_empty_tag)
+ * #(parsers.optionalspace * (parsers.newline + parsers.eof))
parsers.html_any_block = parsers.html_any_block_opening
* parsers.html_blankline_end_condition
parsers.html_inline_comment_full = parsers.html_comment_start
* -P(">") * -P("->")
- * Cs((V("NoSoftLineBreakEndline") + parsers.any - P("--")
- - parsers.nested_breaking_blank - parsers.html_comment_end)^0)
+ * Cs(( V("NoSoftLineBreakEndline")
+ + parsers.any - P("--")
+ - parsers.nested_breaking_blank
+ - parsers.html_comment_end)^0)
* parsers.html_comment_end
parsers.html_inline_tags = parsers.html_inline_comment_full
@@ -27729,21 +28306,25 @@ parsers.auto_link_scheme = parsers.letter
* parsers.auto_link_scheme_part^-30
parsers.absolute_uri = parsers.auto_link_scheme * parsers.colon
- * (parsers.any - parsers.spacing - parsers.less - parsers.more)^0
+ * ( parsers.any - parsers.spacing
+ - parsers.less - parsers.more)^0
parsers.printable_characters = S(".!#$%&'*+/=?^_`{|}~-")
parsers.email_address_local_part_char = parsers.alphanumeric
+ parsers.printable_characters
-parsers.email_address_local_part = parsers.email_address_local_part_char^1
+parsers.email_address_local_part
+ = parsers.email_address_local_part_char^1
parsers.email_address_dns_label = parsers.alphanumeric
- * (parsers.alphanumeric + parsers.dash)^-62
+ * ( parsers.alphanumeric
+ + parsers.dash)^-62
* B(parsers.alphanumeric)
parsers.email_address_domain = parsers.email_address_dns_label
- * (parsers.period * parsers.email_address_dns_label)^0
+ * ( parsers.period
+ * parsers.email_address_dns_label)^0
parsers.email_address = parsers.email_address_local_part
* parsers.at
@@ -27799,25 +28380,37 @@ parsers.link_text = parsers.lbracket
+ parsers.autolink
+ V("InlineHtml")
+ ( parsers.backslash * parsers.backslash)
- + ( parsers.backslash * (parsers.lbracket + parsers.rbracket)
+ + ( parsers.backslash
+ * ( parsers.lbracket
+ + parsers.rbracket)
+ V("NoSoftLineBreakSpace")
+ V("NoSoftLineBreakEndline")
+ (parsers.any
- - (parsers.newline + parsers.lbracket + parsers.rbracket + parsers.blankline^2))))^0)
+ - ( parsers.newline
+ + parsers.lbracket
+ + parsers.rbracket
+ + parsers.blankline^2))))^0)
* parsers.rbracket
parsers.link_label_body = -#(parsers.sp * parsers.rbracket)
- * #((parsers.any - parsers.rbracket)^-999 * parsers.rbracket)
+ * #( ( parsers.any
+ - parsers.rbracket)^-999
+ * parsers.rbracket)
* Cs((parsers.alphanumeric^1
+ parsers.inticks
+ parsers.autolink
+ V("InlineHtml")
+ ( parsers.backslash * parsers.backslash)
- + ( parsers.backslash * (parsers.lbracket + parsers.rbracket)
+ + ( parsers.backslash
+ * ( parsers.lbracket
+ + parsers.rbracket)
+ V("NoSoftLineBreakSpace")
+ V("NoSoftLineBreakEndline")
+ (parsers.any
- - (parsers.newline + parsers.lbracket + parsers.rbracket + parsers.blankline^2))))^1)
+ - ( parsers.newline
+ + parsers.lbracket
+ + parsers.rbracket
+ + parsers.blankline^2))))^1)
parsers.link_label = parsers.lbracket
* parsers.link_label_body
@@ -27847,29 +28440,38 @@ parsers.title_s = parsers.squote
* Cs((parsers.html_entities
+ V("NoSoftLineBreakSpace")
+ V("NoSoftLineBreakEndline")
- + (parsers.anyescaped - parsers.newline - parsers.squote - parsers.blankline^2))^0)
+ + ( parsers.anyescaped
+ - parsers.newline
+ - parsers.squote
+ - parsers.blankline^2))^0)
* parsers.squote
parsers.title_d = parsers.dquote
* Cs((parsers.html_entities
+ V("NoSoftLineBreakSpace")
+ V("NoSoftLineBreakEndline")
- + (parsers.anyescaped - parsers.newline - parsers.dquote - parsers.blankline^2))^0)
+ + ( parsers.anyescaped
+ - parsers.newline
+ - parsers.dquote
+ - parsers.blankline^2))^0)
* parsers.dquote
parsers.title_p = parsers.lparent
* Cs((parsers.html_entities
+ V("NoSoftLineBreakSpace")
+ V("NoSoftLineBreakEndline")
- + (parsers.anyescaped - parsers.newline - parsers.lparent - parsers.rparent
+ + ( parsers.anyescaped
+ - parsers.newline
+ - parsers.lparent
+ - parsers.rparent
- parsers.blankline^2))^0)
* parsers.rparent
-parsers.title = parsers.title_d + parsers.title_s + parsers.title_p
+parsers.title
+ = parsers.title_d + parsers.title_s + parsers.title_p
parsers.optionaltitle
- = parsers.spnlc * parsers.title * parsers.spacechar^0
- + Cc("")
+ = parsers.spnlc * parsers.title * parsers.spacechar^0 + Cc("")
% \end{macrocode}
% \par
@@ -27880,9 +28482,11 @@ parsers.optionaltitle
% \end{markdown}
% \begin{macrocode}
-- parse a reference definition: [foo]: /bar "title"
-parsers.define_reference_parser = (parsers.check_trail / "") * parsers.link_label * parsers.colon
+parsers.define_reference_parser = (parsers.check_trail / "")
+ * parsers.link_label * parsers.colon
* parsers.spnlc * parsers.url
- * ( parsers.spnlc_sep * parsers.title * parsers.only_blank
+ * ( parsers.spnlc_sep * parsers.title
+ * parsers.only_blank
+ Cc("") * parsers.only_blank)
% \end{macrocode}
% \par
@@ -27897,7 +28501,10 @@ parsers.Inline = V("Inline")
-- parse many p between starter and ender
parsers.between = function(p, starter, ender)
local ender2 = B(parsers.nonspacechar) * ender
- return (starter * #parsers.nonspacechar * Ct(p * (p - ender2)^0) * ender2)
+ return ( starter
+ * #parsers.nonspacechar
+ * Ct(p * (p - ender2)^0)
+ * ender2)
end
% \end{macrocode}
@@ -27909,7 +28516,8 @@ end
% \end{markdown}
% \begin{macrocode}
parsers.lineof = function(c)
- return (parsers.check_trail_no_rem * (P(c) * parsers.optionalspace)^3
+ return ( parsers.check_trail_no_rem
+ * (P(c) * parsers.optionalspace)^3
* (parsers.newline + parsers.eof))
end
@@ -27929,8 +28537,11 @@ parsers.heading_start = #parsers.hash * C(parsers.hash^-6)
* -parsers.hash / length
-- parse setext header ending and return level
-parsers.heading_level = parsers.nonindentspace * parsers.equal^1 * parsers.optionalspace * #parsers.newline * Cc(1)
- + parsers.nonindentspace * parsers.dash^1 * parsers.optionalspace * #parsers.newline * Cc(2)
+parsers.heading_level
+ = parsers.nonindentspace * parsers.equal^1
+ * parsers.optionalspace * #parsers.newline * Cc(1)
+ + parsers.nonindentspace * parsers.dash^1
+ * parsers.optionalspace * #parsers.newline * Cc(2)
local function strip_atx_end(s)
return s:gsub("%s+#*%s*\n$","")
@@ -28102,9 +28713,11 @@ function M.reader.new(writer, options)
local prefix = lpeg.match(C(parsers.optionalspace), line)
local prefix_length = #prefix
local is_shorter = min_prefix_length == nil
- is_shorter = is_shorter or prefix_length < min_prefix_length
+ if not is_shorter then
+ is_shorter = prefix_length < min_prefix_length
+ end
if is_shorter then
- min_prefix_length, min_prefix = prefix_length, prefix
+ min_prefix_length, min_prefix = prefix_length, prefix
end
return line
end)
@@ -28126,7 +28739,8 @@ function M.reader.new(writer, options)
end
local res = lpeg.match(grammar(), str)
if res == nil then
- error(format("%s failed on:\n%s", name, str:sub(1,20)))
+ return writer.error(format("%s failed on:\n%s",
+ name, str:sub(1,20)))
else
return res
end
@@ -28176,35 +28790,47 @@ function M.reader.new(writer, options)
%
% \end{markdown}
% \begin{macrocode}
- parsers.minimally_indented_blankline = parsers.check_minimal_indent * (parsers.blankline / "")
+ parsers.minimally_indented_blankline
+ = parsers.check_minimal_indent * (parsers.blankline / "")
- parsers.minimally_indented_block = parsers.check_minimal_indent * V("Block")
+ parsers.minimally_indented_block
+ = parsers.check_minimal_indent * V("Block")
- parsers.minimally_indented_block_or_paragraph = parsers.check_minimal_indent * V("BlockOrParagraph")
+ parsers.minimally_indented_block_or_paragraph
+ = parsers.check_minimal_indent * V("BlockOrParagraph")
- parsers.minimally_indented_paragraph = parsers.check_minimal_indent * V("Paragraph")
+ parsers.minimally_indented_paragraph
+ = parsers.check_minimal_indent * V("Paragraph")
- parsers.minimally_indented_plain = parsers.check_minimal_indent * V("Plain")
+ parsers.minimally_indented_plain
+ = parsers.check_minimal_indent * V("Plain")
- parsers.minimally_indented_par_or_plain = parsers.minimally_indented_paragraph
- + parsers.minimally_indented_plain
+ parsers.minimally_indented_par_or_plain
+ = parsers.minimally_indented_paragraph
+ + parsers.minimally_indented_plain
- parsers.minimally_indented_par_or_plain_no_blank = parsers.minimally_indented_par_or_plain
- - parsers.minimally_indented_blankline
+ parsers.minimally_indented_par_or_plain_no_blank
+ = parsers.minimally_indented_par_or_plain
+ - parsers.minimally_indented_blankline
- parsers.minimally_indented_ref = parsers.check_minimal_indent * V("Reference")
+ parsers.minimally_indented_ref
+ = parsers.check_minimal_indent * V("Reference")
- parsers.minimally_indented_blank = parsers.check_minimal_indent * V("Blank")
+ parsers.minimally_indented_blank
+ = parsers.check_minimal_indent * V("Blank")
- parsers.conditionally_indented_blankline = parsers.check_minimal_blank_indent * (parsers.blankline / "")
+ parsers.conditionally_indented_blankline
+ = parsers.check_minimal_blank_indent * (parsers.blankline / "")
- parsers.minimally_indented_ref_or_block = parsers.minimally_indented_ref
- + parsers.minimally_indented_block
- - parsers.minimally_indented_blankline
+ parsers.minimally_indented_ref_or_block
+ = parsers.minimally_indented_ref
+ + parsers.minimally_indented_block
+ - parsers.minimally_indented_blankline
- parsers.minimally_indented_ref_or_block_or_par = parsers.minimally_indented_ref
- + parsers.minimally_indented_block_or_paragraph
- - parsers.minimally_indented_blankline
+ parsers.minimally_indented_ref_or_block_or_par
+ = parsers.minimally_indented_ref
+ + parsers.minimally_indented_block_or_paragraph
+ - parsers.minimally_indented_blankline
% \end{macrocode}
% \begin{markdown}
@@ -28214,7 +28840,8 @@ function M.reader.new(writer, options)
% \end{markdown}
% \begin{macrocode}
- parsers.separator_loop = function(separated_block, paragraph, block_separator, paragraph_separator)
+ function parsers.separator_loop(separated_block, paragraph,
+ block_separator, paragraph_separator)
return separated_block
+ block_separator
* paragraph
@@ -28223,10 +28850,14 @@ function M.reader.new(writer, options)
* paragraph
end
- parsers.create_loop_body_pair = function(separated_block, paragraph, block_separator, paragraph_separator)
+ function parsers.create_loop_body_pair(separated_block, paragraph,
+ block_separator,
+ paragraph_separator)
return {
- block = parsers.separator_loop(separated_block, paragraph, block_separator, block_separator),
- par = parsers.separator_loop(separated_block, paragraph, block_separator, paragraph_separator)
+ block = parsers.separator_loop(separated_block, paragraph,
+ block_separator, block_separator),
+ par = parsers.separator_loop(separated_block, paragraph,
+ block_separator, paragraph_separator)
}
end
@@ -28249,18 +28880,20 @@ function M.reader.new(writer, options)
parsers.content_blank = parsers.minimally_indented_blankline
- parsers.ref_or_block_separated = parsers.sep_group_no_output(parsers.content_blank)
- * ( parsers.minimally_indented_ref
- - parsers.content_blank)
- + parsers.block_sep_group(parsers.content_blank)
- * ( parsers.minimally_indented_block
- - parsers.content_blank)
+ parsers.ref_or_block_separated
+ = parsers.sep_group_no_output(parsers.content_blank)
+ * ( parsers.minimally_indented_ref
+ - parsers.content_blank)
+ + parsers.block_sep_group(parsers.content_blank)
+ * ( parsers.minimally_indented_block
+ - parsers.content_blank)
parsers.loop_body_pair =
- parsers.create_loop_body_pair(parsers.ref_or_block_separated,
- parsers.minimally_indented_par_or_plain_no_blank,
- parsers.block_sep_group(parsers.content_blank),
- parsers.par_sep_group(parsers.content_blank))
+ parsers.create_loop_body_pair(
+ parsers.ref_or_block_separated,
+ parsers.minimally_indented_par_or_plain_no_blank,
+ parsers.block_sep_group(parsers.content_blank),
+ parsers.par_sep_group(parsers.content_blank))
parsers.content_loop = ( V("Block")
* parsers.loop_body_pair.block^0
@@ -28284,7 +28917,8 @@ function M.reader.new(writer, options)
parsers.add_indent = function(pattern, name, breakable)
return Cg(Cmt( Cb("indent_info")
* Ct(pattern)
- * (#parsers.linechar * Cc(false) + Cc(true)) -- check if starter is blank
+ * ( #parsers.linechar -- check if starter is blank
+ * Cc(false) + Cc(true))
* Cc(name)
* Cc(breakable),
process_starter_indent), "indent_info")
@@ -28312,7 +28946,8 @@ function M.reader.new(writer, options)
allowed_end = C(parsers.spacechar^1) * #parsers.linechar
else
delimiter_range = parsers.dig * parsers.dig^-8
- allowed_end = C(parsers.spacechar^1) + #(parsers.newline + parsers.eof)
+ allowed_end = C(parsers.spacechar^1)
+ + #(parsers.newline + parsers.eof)
end
return parsers.check_trail
@@ -28334,16 +28969,21 @@ function M.reader.new(writer, options)
%
% \end{markdown}
% \begin{macrocode}
- parsers.blockquote_start = parsers.check_trail * C(parsers.more) * C(parsers.spacechar^0)
+ parsers.blockquote_start
+ = parsers.check_trail
+ * C(parsers.more)
+ * C(parsers.spacechar^0)
- parsers.blockquote_body = parsers.add_indent(parsers.blockquote_start, "bq", true)
- * parsers.indented_content()
- * remove_indent("bq")
+ parsers.blockquote_body
+ = parsers.add_indent(parsers.blockquote_start, "bq", true)
+ * parsers.indented_content()
+ * remove_indent("bq")
if not options.breakableBlockquotes then
- parsers.blockquote_body = parsers.add_indent(parsers.blockquote_start, "bq", false)
- * parsers.indented_content()
- * remove_indent("bq")
+ parsers.blockquote_body
+ = parsers.add_indent(parsers.blockquote_start, "bq", false)
+ * parsers.indented_content()
+ * remove_indent("bq")
end
% \end{macrocode}
% \par
@@ -28357,7 +28997,8 @@ function M.reader.new(writer, options)
% \begin{macrocode}
local function parse_content_part(content_part)
local rope = util.rope_to_string(content_part)
- local parsed = self.parser_functions.parse_inlines_no_link_or_emphasis(rope)
+ local parsed
+ = self.parser_functions.parse_inlines_no_link_or_emphasis(rope)
parsed.indent_info = nil
return parsed
end
@@ -28369,37 +29010,40 @@ function M.reader.new(writer, options)
%
% \end{markdown}
% \begin{macrocode}
- local function collect_emphasis_content(t, opening_index, closing_index)
- local content = {}
+ local collect_emphasis_content =
+ function(t, opening_index, closing_index)
+ local content = {}
- local content_part = {}
- for i = opening_index, closing_index do
- local value = t[i]
+ local content_part = {}
+ for i = opening_index, closing_index do
+ local value = t[i]
- if value.rendered ~= nil then
- content[#content + 1] = parse_content_part(content_part)
- content_part = {}
- content[#content + 1] = value.rendered
- value.rendered = nil
- else
- if value.type == "delimiter" and value.element == "emphasis" then
- if value.is_active then
- content_part[#content_part + 1] = string.rep(value.character, value.current_count)
- end
+ if value.rendered ~= nil then
+ content[#content + 1] = parse_content_part(content_part)
+ content_part = {}
+ content[#content + 1] = value.rendered
+ value.rendered = nil
else
- content_part[#content_part + 1] = value.content
+ if value.type == "delimiter"
+ and value.element == "emphasis" then
+ if value.is_active then
+ content_part[#content_part + 1]
+ = string.rep(value.character, value.current_count)
+ end
+ else
+ content_part[#content_part + 1] = value.content
+ end
+ value.content = ''
+ value.is_active = false
end
- value.content = ''
- value.is_active = false
end
- end
- if next(content_part) ~= nil then
- content[#content + 1] = parse_content_part(content_part)
- end
+ if next(content_part) ~= nil then
+ content[#content + 1] = parse_content_part(content_part)
+ end
- return content
- end
+ return content
+ end
% \end{macrocode}
% \begin{markdown}
@@ -28410,7 +29054,9 @@ function M.reader.new(writer, options)
% \end{markdown}
% \begin{macrocode}
local function fill_emph(t, opening_index, closing_index)
- local content = collect_emphasis_content(t, opening_index + 1, closing_index - 1)
+ local content
+ = collect_emphasis_content(t, opening_index + 1,
+ closing_index - 1)
t[opening_index + 1].is_active = true
t[opening_index + 1].rendered = writer.emphasis(content)
end
@@ -28424,7 +29070,9 @@ function M.reader.new(writer, options)
% \end{markdown}
% \begin{macrocode}
local function fill_strong(t, opening_index, closing_index)
- local content = collect_emphasis_content(t, opening_index + 1, closing_index - 1)
+ local content
+ = collect_emphasis_content(t, opening_index + 1,
+ closing_index - 1)
t[opening_index + 1].is_active = true
t[opening_index + 1].rendered = writer.strong(content)
end
@@ -28438,9 +29086,12 @@ function M.reader.new(writer, options)
% \end{markdown}
% \begin{macrocode}
local function breaks_three_rule(opening_delimiter, closing_delimiter)
- return (opening_delimiter.is_closing or closing_delimiter.is_opening) and
- ((opening_delimiter.original_count + closing_delimiter.original_count) % 3 == 0) and
- (opening_delimiter.original_count % 3 ~= 0 or closing_delimiter.original_count % 3 ~= 0)
+ return ( opening_delimiter.is_closing
+ or closing_delimiter.is_opening)
+ and (( opening_delimiter.original_count
+ + closing_delimiter.original_count) % 3 == 0)
+ and ( opening_delimiter.original_count % 3 ~= 0
+ or closing_delimiter.original_count % 3 ~= 0)
end
% \end{macrocode}
@@ -28452,7 +29103,8 @@ function M.reader.new(writer, options)
%
% \end{markdown}
% \begin{macrocode}
- local function find_emphasis_opener(t, bottom_index, latest_index, character, closing_delimiter)
+ local find_emphasis_opener = function(t, bottom_index, latest_index,
+ character, closing_delimiter)
for i = latest_index, bottom_index, -1 do
local value = t[i]
if value.is_active and
@@ -28516,12 +29168,18 @@ function M.reader.new(writer, options)
local is_opening = value.is_opening
local closing_length_modulo_three = value.original_count % 3
- local current_openers_bottom = openers_bottom[character][is_opening][closing_length_modulo_three + 1]
+ local current_openers_bottom
+ = openers_bottom[character][is_opening]
+ [closing_length_modulo_three + 1]
- local opener_position = find_emphasis_opener(t, current_openers_bottom, current_position - 1, character, value)
+ local opener_position
+ = find_emphasis_opener(t, current_openers_bottom,
+ current_position - 1, character, value)
if (opener_position == nil) then
- openers_bottom[character][is_opening][closing_length_modulo_three + 1] = current_position
+ openers_bottom[character][is_opening]
+ [closing_length_modulo_three + 1]
+ = current_position
current_position = current_position + 1
goto continue
end
@@ -28531,7 +29189,8 @@ function M.reader.new(writer, options)
local current_opening_count = opening_delimiter.current_count
local current_closing_count = t[current_position].current_count
- if (current_opening_count >= 2) and (current_closing_count >= 2) then
+ if (current_opening_count >= 2)
+ and (current_closing_count >= 2) then
opening_delimiter.current_count = current_opening_count - 2
t[current_position].current_count = current_closing_count - 2
fill_strong(t, opener_position, current_position)
@@ -28615,15 +29274,19 @@ function M.reader.new(writer, options)
return check_unicode_type(s, i, 0, 3, "%s")
end
- parsers.unicode_preceding_punctuation = B(parsers.escapable)
- + Cmt(parsers.succeed, check_preceding_unicode_punctuation)
+ parsers.unicode_preceding_punctuation
+ = B(parsers.escapable)
+ + Cmt(parsers.succeed, check_preceding_unicode_punctuation)
- parsers.unicode_preceding_whitespace = Cmt(parsers.succeed, check_preceding_unicode_whitespace)
+ parsers.unicode_preceding_whitespace
+ = Cmt(parsers.succeed, check_preceding_unicode_whitespace)
- parsers.unicode_following_punctuation = #parsers.escapable
- + Cmt(parsers.succeed, check_following_unicode_punctuation)
+ parsers.unicode_following_punctuation
+ = #parsers.escapable
+ + Cmt(parsers.succeed, check_following_unicode_punctuation)
- parsers.unicode_following_whitespace = Cmt(parsers.succeed, check_following_unicode_whitespace)
+ parsers.unicode_following_whitespace
+ = Cmt(parsers.succeed, check_following_unicode_whitespace)
parsers.delimiter_run = function(character)
return (B(parsers.backslash * character) + -B(character))
@@ -28633,49 +29296,58 @@ function M.reader.new(writer, options)
parsers.left_flanking_delimiter_run = function(character)
return (B( parsers.any)
- * (parsers.unicode_preceding_punctuation + parsers.unicode_preceding_whitespace)
+ * ( parsers.unicode_preceding_punctuation
+ + parsers.unicode_preceding_whitespace)
+ -B(parsers.any))
* parsers.delimiter_run(character)
* parsers.unicode_following_punctuation
+ parsers.delimiter_run(character)
- * -#(parsers.unicode_following_punctuation + parsers.unicode_following_whitespace
+ * -#( parsers.unicode_following_punctuation
+ + parsers.unicode_following_whitespace
+ parsers.eof)
end
parsers.right_flanking_delimiter_run = function(character)
return parsers.unicode_preceding_punctuation
* parsers.delimiter_run(character)
- * (parsers.unicode_following_punctuation + parsers.unicode_following_whitespace
+ * ( parsers.unicode_following_punctuation
+ + parsers.unicode_following_whitespace
+ parsers.eof)
+ (B(parsers.any)
- * -(parsers.unicode_preceding_punctuation + parsers.unicode_preceding_whitespace))
+ * -( parsers.unicode_preceding_punctuation
+ + parsers.unicode_preceding_whitespace))
* parsers.delimiter_run(character)
end
if options.underscores then
- parsers.emph_start = parsers.left_flanking_delimiter_run(parsers.asterisk)
- + (-#parsers.right_flanking_delimiter_run(parsers.underscore)
- + (parsers.unicode_preceding_punctuation
- * #parsers.right_flanking_delimiter_run(parsers.underscore)))
- * parsers.left_flanking_delimiter_run(parsers.underscore)
-
- parsers.emph_end = parsers.right_flanking_delimiter_run(parsers.asterisk)
- + (-#parsers.left_flanking_delimiter_run(parsers.underscore)
- + #(parsers.left_flanking_delimiter_run(parsers.underscore)
- * parsers.unicode_following_punctuation))
- * parsers.right_flanking_delimiter_run(parsers.underscore)
+ parsers.emph_start
+ = parsers.left_flanking_delimiter_run(parsers.asterisk)
+ + ( -#parsers.right_flanking_delimiter_run(parsers.underscore)
+ + ( parsers.unicode_preceding_punctuation
+ * #parsers.right_flanking_delimiter_run(parsers.underscore)))
+ * parsers.left_flanking_delimiter_run(parsers.underscore)
+
+ parsers.emph_end
+ = parsers.right_flanking_delimiter_run(parsers.asterisk)
+ + ( -#parsers.left_flanking_delimiter_run(parsers.underscore)
+ + #( parsers.left_flanking_delimiter_run(parsers.underscore)
+ * parsers.unicode_following_punctuation))
+ * parsers.right_flanking_delimiter_run(parsers.underscore)
else
- parsers.emph_start = parsers.left_flanking_delimiter_run(parsers.asterisk)
+ parsers.emph_start
+ = parsers.left_flanking_delimiter_run(parsers.asterisk)
- parsers.emph_end = parsers.right_flanking_delimiter_run(parsers.asterisk)
+ parsers.emph_end
+ = parsers.right_flanking_delimiter_run(parsers.asterisk)
end
- parsers.emph_capturing_open_and_close = #parsers.emph_start * #parsers.emph_end
- * Ct( Cg(Cc("delimiter"), "type")
- * Cg(Cc("emphasis"), "element")
- * Cg(C(parsers.emph_start), "content")
- * Cg(Cc(true), "is_opening")
- * Cg(Cc(true), "is_closing"))
+ parsers.emph_capturing_open_and_close
+ = #parsers.emph_start * #parsers.emph_end
+ * Ct( Cg(Cc("delimiter"), "type")
+ * Cg(Cc("emphasis"), "element")
+ * Cg(C(parsers.emph_start), "content")
+ * Cg(Cc(true), "is_opening")
+ * Cg(Cc(true), "is_closing"))
parsers.emph_capturing_open = Ct( Cg(Cc("delimiter"), "type")
* Cg(Cc("emphasis"), "element")
@@ -28765,17 +29437,24 @@ function M.reader.new(writer, options)
parsers.title_s_direct_ref = parsers.squote
* Cs((parsers.html_entities
- + (parsers.anyescaped - parsers.squote - parsers.blankline^2))^0)
+ + ( parsers.anyescaped
+ - parsers.squote
+ - parsers.blankline^2))^0)
* parsers.squote
parsers.title_d_direct_ref = parsers.dquote
* Cs((parsers.html_entities
- + (parsers.anyescaped - parsers.dquote - parsers.blankline^2))^0)
+ + ( parsers.anyescaped
+ - parsers.dquote
+ - parsers.blankline^2))^0)
* parsers.dquote
parsers.title_p_direct_ref = parsers.lparent
* Cs((parsers.html_entities
- + (parsers.anyescaped - parsers.lparent - parsers.rparent - parsers.blankline^2))^0)
+ + ( parsers.anyescaped
+ - parsers.lparent
+ - parsers.rparent
+ - parsers.blankline^2))^0)
* parsers.rparent
parsers.title_direct_ref = parsers.title_s_direct_ref
@@ -28785,7 +29464,8 @@ function M.reader.new(writer, options)
parsers.inline_direct_ref_inside = parsers.lparent * parsers.spnl
* Cg(parsers.url + Cc(""), "url")
* parsers.spnl
- * Cg(parsers.title_direct_ref + Cc(""), "title")
+ * Cg( parsers.title_direct_ref
+ + Cc(""), "title")
* parsers.spnl * parsers.rparent
parsers.inline_direct_ref = parsers.lparent * parsers.spnlc
@@ -28813,7 +29493,8 @@ function M.reader.new(writer, options)
* Cg(Cc("inline"), "link_type")
+ #(parsers.exclamation * parsers.full_link)
* Cg(Cc("full"), "link_type")
- + #(parsers.exclamation * parsers.collapsed_link)
+ + #( parsers.exclamation
+ * parsers.collapsed_link)
* Cg(Cc("collapsed"), "link_type")
+ #(parsers.exclamation * parsers.shortcut_link)
* Cg(Cc("shortcut"), "link_type")
@@ -28844,15 +29525,18 @@ function M.reader.new(writer, options)
local inline_note_element = Cg(Cc("note"), "element")
* parsers.note_opening
- * Cg(parsers.circumflex * parsers.lbracket, "content")
+ * Cg( parsers.circumflex
+ * parsers.lbracket, "content")
local image_element = Cg(Cc("image"), "element")
* parsers.image_opening
- * Cg(parsers.exclamation * parsers.lbracket, "content")
+ * Cg( parsers.exclamation
+ * parsers.lbracket, "content")
local note_element = Cg(Cc("note"), "element")
* parsers.raw_note_opening
- * Cg(parsers.lbracket * parsers.circumflex, "content")
+ * Cg( parsers.lbracket
+ * parsers.circumflex, "content")
local link_element = Cg(Cc("link"), "element")
* parsers.link_opening
@@ -28882,7 +29566,9 @@ function M.reader.new(writer, options)
* Cg(Cc(false), "is_opening")
* Cg(Cc(true), "is_closing")
* ( Cg(Cc(true), "is_direct")
- * Cg(parsers.rbracket * #parsers.inline_direct_ref, "content")
+ * Cg( parsers.rbracket
+ * #parsers.inline_direct_ref,
+ "content")
+ Cg(Cc(false), "is_direct")
* Cg(parsers.rbracket, "content")))
@@ -28906,19 +29592,21 @@ function M.reader.new(writer, options)
* -parsers.starter) / "")
* parsers.spacechar^0 / "\n"
- parsers.link_and_emph_content = Ct( Cg(Cc("content"), "type")
- * Cg(Cs(( parsers.link_emph_precedence
- + parsers.backslash * parsers.any
- + parsers.link_and_emph_endline
- + (parsers.linechar
- - parsers.blankline^2
- - parsers.link_image_open_or_close
- - parsers.emph_open_or_close))^0), "content"))
+ parsers.link_and_emph_content
+ = Ct( Cg(Cc("content"), "type")
+ * Cg(Cs(( parsers.link_emph_precedence
+ + parsers.backslash * parsers.any
+ + parsers.link_and_emph_endline
+ + (parsers.linechar
+ - parsers.blankline^2
+ - parsers.link_image_open_or_close
+ - parsers.emph_open_or_close))^0), "content"))
- parsers.link_and_emph_table = (parsers.link_image_opening + parsers.emph_open)
- * parsers.link_and_emph_content
- * ((parsers.link_image_open_or_close + parsers.emph_open_or_close)
- * parsers.link_and_emph_content)^1
+ parsers.link_and_emph_table
+ = (parsers.link_image_opening + parsers.emph_open)
+ * parsers.link_and_emph_content
+ * ((parsers.link_image_open_or_close + parsers.emph_open_or_close)
+ * parsers.link_and_emph_content)^1
% \end{macrocode}
% \begin{markdown}
@@ -28948,7 +29636,9 @@ function M.reader.new(writer, options)
local value = t[i]
if value.type == "delimiter" and
value.is_opening and
- (value.element == "link" or value.element == "image" or value.element == "note")
+ ( value.element == "link"
+ or value.element == "image"
+ or value.element == "note")
and not value.removed then
if value.is_active then
return i
@@ -29029,11 +29719,12 @@ function M.reader.new(writer, options)
%
% \end{markdown}
% \begin{macrocode}
- local function delete_parsed_content_in_range(t, opening_index, closing_index)
- for i = opening_index, closing_index do
- t[i].rendered = nil
+ local delete_parsed_content_in_range =
+ function(t, opening_index, closing_index)
+ for i = opening_index, closing_index do
+ t[i].rendered = nil
+ end
end
- end
% \end{macrocode}
% \begin{markdown}
@@ -29078,34 +29769,40 @@ function M.reader.new(writer, options)
%
% \end{markdown}
% \begin{macrocode}
- local function render_link_or_image(t, opening_index, closing_index, content_end_index, reference)
- process_emphasis(t, opening_index, content_end_index)
- local mapped = collect_emphasis_content(t, opening_index + 1, content_end_index - 1)
-
- local rendered = {}
- if (t[opening_index].element == "link") then
- rendered = writer.link(mapped, reference.url, reference.title, reference.attributes)
- end
+ local render_link_or_image =
+ function(t, opening_index, closing_index, content_end_index,
+ reference)
+ process_emphasis(t, opening_index, content_end_index)
+ local mapped = collect_emphasis_content(t, opening_index + 1,
+ content_end_index - 1)
- if (t[opening_index].element == "image") then
- rendered = writer.image(mapped, reference.url, reference.title, reference.attributes)
- end
+ local rendered = {}
+ if (t[opening_index].element == "link") then
+ rendered = writer.link(mapped, reference.url,
+ reference.title, reference.attributes)
+ end
- if (t[opening_index].element == "note") then
- if (t[opening_index].link_type == "note_inline") then
- rendered = writer.note(mapped)
+ if (t[opening_index].element == "image") then
+ rendered = writer.image(mapped, reference.url, reference.title,
+ reference.attributes)
end
- if (t[opening_index].link_type == "raw_note") then
- rendered = writer.note(reference)
+
+ if (t[opening_index].element == "note") then
+ if (t[opening_index].link_type == "note_inline") then
+ rendered = writer.note(mapped)
+ end
+ if (t[opening_index].link_type == "raw_note") then
+ rendered = writer.note(reference)
+ end
end
- end
- t[opening_index].rendered = rendered
- delete_parsed_content_in_range(t, opening_index + 1, closing_index)
- empty_content_in_range(t, opening_index, closing_index)
- disable_previous_link_openers(t, opening_index)
- disable_range(t, opening_index, closing_index)
- end
+ t[opening_index].rendered = rendered
+ delete_parsed_content_in_range(t, opening_index + 1,
+ closing_index)
+ empty_content_in_range(t, opening_index, closing_index)
+ disable_previous_link_openers(t, opening_index)
+ disable_range(t, opening_index, closing_index)
+ end
% \end{macrocode}
% \begin{markdown}
@@ -29116,52 +29813,56 @@ function M.reader.new(writer, options)
%
% \end{markdown}
% \begin{macrocode}
- local function resolve_inline_following_content(t, closing_index, match_reference, match_link_attributes)
- local content = ""
- for i = closing_index + 1, #t do
- content = content .. t[i].content
- end
+ local resolve_inline_following_content =
+ function(t, closing_index, match_reference, match_link_attributes)
+ local content = ""
+ for i = closing_index + 1, #t do
+ content = content .. t[i].content
+ end
- local matching_content = parsers.succeed
+ local matching_content = parsers.succeed
- if match_reference then
- matching_content = matching_content * parsers.inline_direct_ref_inside
- end
+ if match_reference then
+ matching_content = matching_content
+ * parsers.inline_direct_ref_inside
+ end
- if match_link_attributes then
- matching_content = matching_content * Cg(Ct(parsers.attributes^-1), "attributes")
- end
+ if match_link_attributes then
+ matching_content = matching_content
+ * Cg(Ct(parsers.attributes^-1), "attributes")
+ end
- local matched = lpeg.match(Ct(matching_content * Cg(Cp(), "end_position")), content)
+ local matched = lpeg.match(Ct( matching_content
+ * Cg(Cp(), "end_position")), content)
- local matched_count = matched.end_position - 1
- for i = closing_index + 1, #t do
- local value = t[i]
+ local matched_count = matched.end_position - 1
+ for i = closing_index + 1, #t do
+ local value = t[i]
- local chars_left = matched_count
- matched_count = matched_count - #value.content
+ local chars_left = matched_count
+ matched_count = matched_count - #value.content
+
+ if matched_count <= 0 then
+ value.content = value.content:sub(chars_left + 1)
+ break
+ end
- if matched_count <= 0 then
- value.content = value.content:sub(chars_left + 1)
- break
+ value.content = ''
+ value.is_active = false
end
- value.content = ''
- value.is_active = false
- end
+ local attributes = matched.attributes
+ if attributes == nil or next(attributes) == nil then
+ attributes = nil
+ end
- local attributes = matched.attributes
- if attributes == nil or next(attributes) == nil then
- attributes = nil
+ return {
+ url = matched.url or "",
+ title = matched.title or "",
+ attributes = attributes
+ }
end
- return {
- url = matched.url or "",
- title = matched.title or "",
- attributes = attributes
- }
- end
-
% \end{macrocode}
% \begin{markdown}
%
@@ -29171,8 +29872,11 @@ function M.reader.new(writer, options)
% \end{markdown}
% \begin{macrocode}
local function resolve_inline_link(t, opening_index, closing_index)
- local inline_content = resolve_inline_following_content(t, closing_index, true, t.match_link_attributes)
- render_link_or_image(t, opening_index, closing_index, closing_index, inline_content)
+ local inline_content
+ = resolve_inline_following_content(t, closing_index, true,
+ t.match_link_attributes)
+ render_link_or_image(t, opening_index, closing_index,
+ closing_index, inline_content)
end
% \end{macrocode}
@@ -29183,10 +29887,14 @@ function M.reader.new(writer, options)
%
% \end{markdown}
% \begin{macrocode}
- local function resolve_note_inline_link(t, opening_index, closing_index)
- local inline_content = resolve_inline_following_content(t, closing_index, false, false)
- render_link_or_image(t, opening_index, closing_index, closing_index, inline_content)
- end
+ local resolve_note_inline_link =
+ function(t, opening_index, closing_index)
+ local inline_content
+ = resolve_inline_following_content(t, closing_index,
+ false, false)
+ render_link_or_image(t, opening_index, closing_index,
+ closing_index, inline_content)
+ end
% \end{macrocode}
% \begin{markdown}
@@ -29197,13 +29905,18 @@ function M.reader.new(writer, options)
% \end{markdown}
% \begin{macrocode}
local function resolve_shortcut_link(t, opening_index, closing_index)
- local content = collect_link_content(t, opening_index + 1, closing_index - 1)
+ local content
+ = collect_link_content(t, opening_index + 1, closing_index - 1)
local r = self.lookup_reference(content)
if r then
- local inline_content = resolve_inline_following_content(t, closing_index, false, t.match_link_attributes)
- r.attributes = join_attributes(r.attributes, inline_content.attributes)
- render_link_or_image(t, opening_index, closing_index, closing_index, r)
+ local inline_content
+ = resolve_inline_following_content(t, closing_index, false,
+ t.match_link_attributes)
+ r.attributes
+ = join_attributes(r.attributes, inline_content.attributes)
+ render_link_or_image(t, opening_index, closing_index,
+ closing_index, r)
end
end
@@ -29216,12 +29929,14 @@ function M.reader.new(writer, options)
% \end{markdown}
% \begin{macrocode}
local function resolve_raw_note_link(t, opening_index, closing_index)
- local content = collect_link_content(t, opening_index + 1, closing_index - 1)
+ local content
+ = collect_link_content(t, opening_index + 1, closing_index - 1)
local r = self.lookup_note_reference(content)
if r then
local parsed_ref = self.parser_functions.parse_blocks_nested(r)
- render_link_or_image(t, opening_index, closing_index, closing_index, parsed_ref)
+ render_link_or_image(t, opening_index, closing_index,
+ closing_index, parsed_ref)
end
end
@@ -29234,15 +29949,22 @@ function M.reader.new(writer, options)
% \end{markdown}
% \begin{macrocode}
local function resolve_full_link(t, opening_index, closing_index)
- local next_link_closing_index = find_next_link_closing_index(t, closing_index + 4)
- local next_link_content = collect_link_content(t, closing_index + 3, next_link_closing_index - 1)
+ local next_link_closing_index
+ = find_next_link_closing_index(t, closing_index + 4)
+ local next_link_content
+ = collect_link_content(t, closing_index + 3,
+ next_link_closing_index - 1)
local r = self.lookup_reference(next_link_content)
if r then
- local inline_content = resolve_inline_following_content(t, next_link_closing_index, false,
- t.match_link_attributes)
- r.attributes = join_attributes(r.attributes, inline_content.attributes)
- render_link_or_image(t, opening_index, next_link_closing_index, closing_index, r)
+ local inline_content
+ = resolve_inline_following_content(t, next_link_closing_index,
+ false,
+ t.match_link_attributes)
+ r.attributes
+ = join_attributes(r.attributes, inline_content.attributes)
+ render_link_or_image(t, opening_index, next_link_closing_index,
+ closing_index, r)
end
end
@@ -29256,14 +29978,20 @@ function M.reader.new(writer, options)
% \end{markdown}
% \begin{macrocode}
local function resolve_collapsed_link(t, opening_index, closing_index)
- local next_link_closing_index = find_next_link_closing_index(t, closing_index + 4)
- local content = collect_link_content(t, opening_index + 1, closing_index - 1)
+ local next_link_closing_index
+ = find_next_link_closing_index(t, closing_index + 4)
+ local content
+ = collect_link_content(t, opening_index + 1, closing_index - 1)
local r = self.lookup_reference(content)
if r then
- local inline_content = resolve_inline_following_content(t, closing_index, false, t.match_link_attributes)
- r.attributes = join_attributes(r.attributes, inline_content.attributes)
- render_link_or_image(t, opening_index, next_link_closing_index, closing_index, r)
+ local inline_content
+ = resolve_inline_following_content(t, closing_index, false,
+ t.match_link_attributes)
+ r.attributes
+ = join_attributes(r.attributes, inline_content.attributes)
+ render_link_or_image(t, opening_index, next_link_closing_index,
+ closing_index, r)
end
end
@@ -29285,7 +30013,9 @@ function M.reader.new(writer, options)
for i,value in ipairs(t) do
if not value.is_closing
or value.type ~= "delimiter"
- or not (value.element == "link" or value.element == "image" or value.element == "note")
+ or not ( value.element == "link"
+ or value.element == "image"
+ or value.element == "note")
or value.removed then
goto continue
end
@@ -29343,7 +30073,8 @@ function M.reader.new(writer, options)
%
% \end{markdown}
% \begin{macrocode}
- parsers.Str = (parsers.normalchar * (parsers.normalchar + parsers.at)^0)
+ parsers.Str = ( parsers.normalchar
+ * (parsers.normalchar + parsers.at)^0)
/ writer.string
parsers.Symbol = (parsers.backtick^1 + V("SpecialChar"))
@@ -29371,25 +30102,28 @@ function M.reader.new(writer, options)
parsers.interrupting_bullets = parsers.fail
parsers.interrupting_enumerators = parsers.fail
else
- parsers.interrupting_bullets = parsers.bullet(parsers.dash, true)
- + parsers.bullet(parsers.asterisk, true)
- + parsers.bullet(parsers.plus, true)
-
- parsers.interrupting_enumerators = parsers.enumerator(parsers.period, true)
- + parsers.enumerator(parsers.rparent, true)
+ parsers.interrupting_bullets
+ = parsers.bullet(parsers.dash, true)
+ + parsers.bullet(parsers.asterisk, true)
+ + parsers.bullet(parsers.plus, true)
+
+ parsers.interrupting_enumerators
+ = parsers.enumerator(parsers.period, true)
+ + parsers.enumerator(parsers.rparent, true)
end
if options.html then
- parsers.html_interrupting = parsers.check_trail
- * ( parsers.html_incomplete_open_tag
- + parsers.html_incomplete_close_tag
- + parsers.html_incomplete_open_special_tag
- + parsers.html_comment_start
- + parsers.html_cdatasection_start
- + parsers.html_declaration_start
- + parsers.html_instruction_start
- - parsers.html_close_special_tag
- - parsers.html_empty_special_tag)
+ parsers.html_interrupting
+ = parsers.check_trail
+ * ( parsers.html_incomplete_open_tag
+ + parsers.html_incomplete_close_tag
+ + parsers.html_incomplete_open_special_tag
+ + parsers.html_comment_start
+ + parsers.html_cdatasection_start
+ + parsers.html_declaration_start
+ + parsers.html_instruction_start
+ - parsers.html_close_special_tag
+ - parsers.html_empty_special_tag)
else
parsers.html_interrupting = parsers.fail
end
@@ -29411,7 +30145,7 @@ function M.reader.new(writer, options)
* -V("EndlineExceptions")
+ parsers.check_optional_indent
* -V("EndlineExceptions")
- * -parsers.starter)
+ * -parsers.starter) / function(_) return end
* parsers.spacechar^0
parsers.Endline = parsers.endline
@@ -29437,30 +30171,37 @@ function M.reader.new(writer, options)
parsers.Space = parsers.spacechar^2 * parsers.Endline
/ writer.hard_line_break
- + parsers.spacechar^1 * parsers.Endline^-1 * parsers.eof / self.expandtabs
+ + parsers.spacechar^1
+ * parsers.Endline^-1
+ * parsers.eof / self.expandtabs
+ parsers.spacechar^1 * parsers.Endline
/ writer.soft_line_break
- + parsers.spacechar^1 * -parsers.newline / self.expandtabs
+ + parsers.spacechar^1
+ * -parsers.newline / self.expandtabs
parsers.NoSoftLineBreakSpace
= parsers.spacechar^2 * parsers.Endline
/ writer.hard_line_break
- + parsers.spacechar^1 * parsers.Endline^-1 * parsers.eof / self.expandtabs
+ + parsers.spacechar^1
+ * parsers.Endline^-1
+ * parsers.eof / self.expandtabs
+ parsers.spacechar^1 * parsers.Endline
/ writer.soft_line_break
- + parsers.spacechar^1 * -parsers.newline / self.expandtabs
+ + parsers.spacechar^1
+ * -parsers.newline / self.expandtabs
parsers.NonbreakingEndline
= parsers.endline
- / writer.soft_line_break
+ / writer.nbsp
parsers.NonbreakingSpace
- = parsers.spacechar^2 * parsers.Endline
- / writer.hard_line_break
- + parsers.spacechar^1 * parsers.Endline^-1 * parsers.eof / ""
- + parsers.spacechar^1 * parsers.Endline
+ = parsers.spacechar^2 * parsers.endline
+ / writer.nbsp
+ + parsers.spacechar^1
+ * parsers.endline^-1 * parsers.eof / ""
+ + parsers.spacechar^1 * parsers.endline
* parsers.optionalspace
- / writer.soft_line_break
+ / writer.nbsp
+ parsers.spacechar^1 * parsers.optionalspace
/ writer.nbsp
@@ -29509,18 +30250,20 @@ end
parsers.LinkAndEmph = Ct(parsers.link_and_emph_table)
/ self.defer_link_and_emphasis_processing
- parsers.EscapedChar = parsers.backslash * C(parsers.escapable) / writer.string
+ parsers.EscapedChar = parsers.backslash
+ * C(parsers.escapable) / writer.string
- parsers.InlineHtml = Cs(parsers.html_inline_comment) / writer.inline_html_comment
- + Cs(parsers.html_any_empty_inline_tag
- + parsers.html_inline_instruction
- + parsers.html_inline_cdatasection
- + parsers.html_inline_declaration
- + parsers.html_any_open_inline_tag
- + parsers.html_any_close_tag)
- / writer.inline_html_tag
+ parsers.InlineHtml = Cs(parsers.html_inline_comment)
+ / writer.inline_html_comment
+ + Cs(parsers.html_any_empty_inline_tag
+ + parsers.html_inline_instruction
+ + parsers.html_inline_cdatasection
+ + parsers.html_inline_declaration
+ + parsers.html_any_open_inline_tag
+ + parsers.html_any_close_tag)
+ / writer.inline_html_tag
- parsers.HtmlEntity = parsers.html_entities / writer.string
+ parsers.HtmlEntity = parsers.html_entities / writer.string
% \end{macrocode}
% \par
% \begin{markdown}
@@ -29539,15 +30282,18 @@ end
+ parsers.html_declaration))
/ writer.block_html_element
- parsers.indented_non_blank_line = parsers.indentedline - parsers.blankline
+ parsers.indented_non_blank_line = parsers.indentedline
+ - parsers.blankline
- parsers.Verbatim = Cs(
- parsers.check_code_trail
- * (parsers.line - parsers.blankline)
- * ((parsers.check_minimal_blank_indent_and_full_code_trail * parsers.blankline)^0
- * ((parsers.check_minimal_indent / "") * parsers.check_code_trail
- * (parsers.line - parsers.blankline))^1)^0
- ) / self.expandtabs / writer.verbatim
+ parsers.Verbatim
+ = Cs( parsers.check_code_trail
+ * (parsers.line - parsers.blankline)
+ * (( parsers.check_minimal_blank_indent_and_full_code_trail
+ * parsers.blankline)^0
+ * ( (parsers.check_minimal_indent / "")
+ * parsers.check_code_trail
+ * (parsers.line - parsers.blankline))^1)^0)
+ / self.expandtabs / writer.verbatim
parsers.Blockquote = parsers.blockquote_body
/ writer.blockquote
@@ -29586,73 +30332,79 @@ end
parsers.list_blank = parsers.conditionally_indented_blankline
- parsers.ref_or_block_list_separated = parsers.sep_group_no_output(parsers.list_blank)
- * parsers.minimally_indented_ref
- + parsers.block_sep_group(parsers.list_blank)
- * parsers.minimally_indented_block
-
- parsers.ref_or_block_non_separated = parsers.minimally_indented_ref
- + (parsers.succeed / writer.interblocksep)
- * parsers.minimally_indented_block
- - parsers.minimally_indented_blankline
-
- parsers.tight_list_loop_body_pair =
- parsers.create_loop_body_pair(parsers.ref_or_block_non_separated,
- parsers.minimally_indented_par_or_plain_no_blank,
- (parsers.succeed / writer.interblocksep),
- (parsers.succeed / writer.paragraphsep))
-
- parsers.loose_list_loop_body_pair =
- parsers.create_loop_body_pair(parsers.ref_or_block_list_separated,
- parsers.minimally_indented_par_or_plain,
- parsers.block_sep_group(parsers.list_blank),
- parsers.par_sep_group(parsers.list_blank))
-
- parsers.tight_list_content_loop = V("Block")
- * parsers.tight_list_loop_body_pair.block^0
- + (V("Paragraph") + V("Plain"))
- * parsers.ref_or_block_non_separated
- * parsers.tight_list_loop_body_pair.block^0
- + (V("Paragraph") + V("Plain"))
- * parsers.tight_list_loop_body_pair.par^0
-
- parsers.loose_list_content_loop = V("Block")
- * parsers.loose_list_loop_body_pair.block^0
- + (V("Paragraph") + V("Plain"))
- * parsers.ref_or_block_list_separated
- * parsers.loose_list_loop_body_pair.block^0
- + (V("Paragraph") + V("Plain"))
- * parsers.loose_list_loop_body_pair.par^0
-
- parsers.list_item_tightness_condition = -#( parsers.list_blank^0
- * parsers.minimally_indented_ref_or_block_or_par)
- * remove_indent("li")
- + remove_indent("li")
- * parsers.fail
-
- parsers.indented_content_tight = Ct( (parsers.blankline / "")
- * #parsers.list_blank
- * remove_indent("li")
- + ( (V("Reference") + (parsers.blankline / ""))
- * parsers.check_minimal_indent
- * parsers.tight_list_content_loop
- + (V("Reference") + (parsers.blankline / ""))
- + (parsers.tickbox^-1 / writer.escape)
- * parsers.tight_list_content_loop
- )
- * parsers.list_item_tightness_condition
- )
-
- parsers.indented_content_loose = Ct( (parsers.blankline / "")
- * #parsers.list_blank
- + ( (V("Reference") + (parsers.blankline / ""))
- * parsers.check_minimal_indent
- * parsers.loose_list_content_loop
- + (V("Reference") + (parsers.blankline / ""))
- + (parsers.tickbox^-1 / writer.escape)
- * parsers.loose_list_content_loop
- )
- )
+ parsers.ref_or_block_list_separated
+ = parsers.sep_group_no_output(parsers.list_blank)
+ * parsers.minimally_indented_ref
+ + parsers.block_sep_group(parsers.list_blank)
+ * parsers.minimally_indented_block
+
+ parsers.ref_or_block_non_separated
+ = parsers.minimally_indented_ref
+ + (parsers.succeed / writer.interblocksep)
+ * parsers.minimally_indented_block
+ - parsers.minimally_indented_blankline
+
+ parsers.tight_list_loop_body_pair =
+ parsers.create_loop_body_pair(
+ parsers.ref_or_block_non_separated,
+ parsers.minimally_indented_par_or_plain_no_blank,
+ (parsers.succeed / writer.interblocksep),
+ (parsers.succeed / writer.paragraphsep))
+
+ parsers.loose_list_loop_body_pair =
+ parsers.create_loop_body_pair(
+ parsers.ref_or_block_list_separated,
+ parsers.minimally_indented_par_or_plain,
+ parsers.block_sep_group(parsers.list_blank),
+ parsers.par_sep_group(parsers.list_blank))
+
+ parsers.tight_list_content_loop
+ = V("Block")
+ * parsers.tight_list_loop_body_pair.block^0
+ + (V("Paragraph") + V("Plain"))
+ * parsers.ref_or_block_non_separated
+ * parsers.tight_list_loop_body_pair.block^0
+ + (V("Paragraph") + V("Plain"))
+ * parsers.tight_list_loop_body_pair.par^0
+
+ parsers.loose_list_content_loop
+ = V("Block")
+ * parsers.loose_list_loop_body_pair.block^0
+ + (V("Paragraph") + V("Plain"))
+ * parsers.ref_or_block_list_separated
+ * parsers.loose_list_loop_body_pair.block^0
+ + (V("Paragraph") + V("Plain"))
+ * parsers.loose_list_loop_body_pair.par^0
+
+ parsers.list_item_tightness_condition
+ = -#( parsers.list_blank^0
+ * parsers.minimally_indented_ref_or_block_or_par)
+ * remove_indent("li")
+ + remove_indent("li")
+ * parsers.fail
+
+ parsers.indented_content_tight
+ = Ct( (parsers.blankline / "")
+ * #parsers.list_blank
+ * remove_indent("li")
+ + ( (V("Reference") + (parsers.blankline / ""))
+ * parsers.check_minimal_indent
+ * parsers.tight_list_content_loop
+ + (V("Reference") + (parsers.blankline / ""))
+ + (parsers.tickbox^-1 / writer.escape)
+ * parsers.tight_list_content_loop
+ )
+ * parsers.list_item_tightness_condition)
+
+ parsers.indented_content_loose
+ = Ct( (parsers.blankline / "")
+ * #parsers.list_blank
+ + ( (V("Reference") + (parsers.blankline / ""))
+ * parsers.check_minimal_indent
+ * parsers.loose_list_content_loop
+ + (V("Reference") + (parsers.blankline / ""))
+ + (parsers.tickbox^-1 / writer.escape)
+ * parsers.loose_list_content_loop))
parsers.TightListItem = function(starter)
return -parsers.ThematicBreak
@@ -29710,13 +30462,15 @@ end
local enumerator = parsers.enumerator(delimiter_type)
return Cg(enumerator, "listtype")
* (Ct( parsers.TightListItem(Cb("listtype"))
- * ((parsers.check_minimal_indent / "") * parsers.TightListItem(enumerator))^0)
+ * ( (parsers.check_minimal_indent / "")
+ * parsers.TightListItem(enumerator))^0)
* Cc(true)
* -#((parsers.list_blank^0 / "")
* parsers.check_minimal_indent * enumerator)
+ Ct( parsers.LooseListItem(Cb("listtype"))
* ((parsers.list_blank^0 / "")
- * (parsers.check_minimal_indent / "") * parsers.LooseListItem(enumerator))^0)
+ * (parsers.check_minimal_indent / "")
+ * parsers.LooseListItem(enumerator))^0)
* Cc(false)
) * Ct(Cb("listtype")) / ordered_list
end
@@ -29769,15 +30523,21 @@ end
- parsers.thematic_break_lines
parsers.heading_text = parsers.heading_line
- * ((V("Endline") / "\n") * (parsers.heading_line - parsers.heading_level))^0
+ * ( (V("Endline") / "\n")
+ * ( parsers.heading_line
+ - parsers.heading_level))^0
* parsers.newline^-1
- parsers.SetextHeading = parsers.freeze_trail * parsers.check_trail_no_rem
- * #(parsers.heading_text
- * parsers.check_minimal_indent * parsers.check_trail * parsers.heading_level)
+ parsers.SetextHeading = parsers.freeze_trail
+ * parsers.check_trail_no_rem
+ * #( parsers.heading_text
+ * parsers.check_minimal_indent
+ * parsers.check_trail
+ * parsers.heading_level)
* Cs(parsers.heading_text)
/ parsers.parse_heading_text
- * parsers.check_minimal_indent_and_trail * parsers.heading_level
+ * parsers.check_minimal_indent_and_trail
+ * parsers.heading_level
* parsers.newline
* parsers.unfreeze_trail
/ writer.heading
@@ -29829,14 +30589,18 @@ end
local current_extension_name = nil
self.insert_pattern = function(selector, pattern, pattern_name)
assert(pattern_name == nil or type(pattern_name) == "string")
- local _, _, lhs, pos, rhs = selector:find("^(%a+)%s+([%a%s]+%a+)%s+(%a+)$")
+ local _, _, lhs, pos, rhs
+ = selector:find("^(%a+)%s+([%a%s]+%a+)%s+(%a+)$")
assert(lhs ~= nil,
- [[Expected selector in form "LHS (before|after|instead of) RHS", not "]]
+ [[Expected selector in form ]]
+ .. [["LHS (before|after|instead of) RHS", not "]]
.. selector .. [["]])
assert(walkable_syntax[lhs] ~= nil,
- [[Rule ]] .. lhs .. [[ -> ... does not exist in markdown grammar]])
+ [[Rule ]] .. lhs
+ .. [[ -> ... does not exist in markdown grammar]])
assert(pos == "before" or pos == "after" or pos == "instead of",
- [[Expected positional specifier "before", "after", or "instead of", not "]]
+ [[Expected positional specifier "before", "after", ]]
+ .. [[or "instead of", not "]]
.. pos .. [["]])
local rule = walkable_syntax[lhs]
local index = nil
@@ -29854,10 +30618,12 @@ end
.. [[ does not exist in markdown grammar]])
local accountable_pattern
if current_extension_name then
- accountable_pattern = { pattern, current_extension_name, pattern_name }
+ accountable_pattern
+ = {pattern, current_extension_name, pattern_name}
else
assert(type(pattern) == "string",
- [[reader->insert_pattern() was called outside an extension with ]]
+ [[reader->insert_pattern() was called outside ]]
+ .. [[an extension with ]]
.. [[a PEG pattern instead of a rule name]])
accountable_pattern = pattern
end
@@ -29880,11 +30646,9 @@ end
local syntax =
{ "Blocks",
- Blocks = V("InitializeState")
- * ( V("ExpectedJekyllData")
- * (V("Blank")^0 / writer.interblocksep)
- )^-1
- * V("Blank")^0
+ Blocks = V("InitializeState")
+ * V("ExpectedJekyllData")
+ * V("Blank")^0
% \end{macrocode}
% \par
% \begin{markdown}
@@ -29895,71 +30659,72 @@ end
%
% \end{markdown}
% \begin{macrocode}
- * ( V("Block")
- * ( V("Blank")^0 * parsers.eof
- + ( V("Blank")^2 / writer.paragraphsep
- + V("Blank")^0 / writer.interblocksep
- )
- )
- + ( V("Paragraph") + V("Plain") )
- * ( V("Blank")^0 * parsers.eof
- + ( V("Blank")^2 / writer.paragraphsep
- + V("Blank")^0 / writer.interblocksep
- )
- )
- * V("Block")
- * ( V("Blank")^0 * parsers.eof
- + ( V("Blank")^2 / writer.paragraphsep
- + V("Blank")^0 / writer.interblocksep
- )
- )
- + ( V("Paragraph") + V("Plain") )
- * ( V("Blank")^0 * parsers.eof
- + V("Blank")^0 / writer.paragraphsep
- )
- )^0,
-
- ExpectedJekyllData = parsers.fail,
-
- Blank = parsers.Blank,
- Reference = parsers.Reference,
-
- Blockquote = parsers.Blockquote,
- Verbatim = parsers.Verbatim,
- ThematicBreak = parsers.ThematicBreak,
- BulletList = parsers.BulletList,
- OrderedList = parsers.OrderedList,
- DisplayHtml = parsers.DisplayHtml,
- Heading = parsers.Heading,
- Paragraph = parsers.Paragraph,
- Plain = parsers.Plain,
-
- EndlineExceptions = parsers.EndlineExceptions,
+ * ( V("Block")
+ * ( V("Blank")^0 * parsers.eof
+ + ( V("Blank")^2 / writer.paragraphsep
+ + V("Blank")^0 / writer.interblocksep
+ )
+ )
+ + ( V("Paragraph") + V("Plain") )
+ * ( V("Blank")^0 * parsers.eof
+ + ( V("Blank")^2 / writer.paragraphsep
+ + V("Blank")^0 / writer.interblocksep
+ )
+ )
+ * V("Block")
+ * ( V("Blank")^0 * parsers.eof
+ + ( V("Blank")^2 / writer.paragraphsep
+ + V("Blank")^0 / writer.interblocksep
+ )
+ )
+ + ( V("Paragraph") + V("Plain") )
+ * ( V("Blank")^0 * parsers.eof
+ + V("Blank")^0 / writer.paragraphsep
+ )
+ )^0,
+
+ ExpectedJekyllData = parsers.succeed,
+
+ Blank = parsers.Blank,
+ Reference = parsers.Reference,
+
+ Blockquote = parsers.Blockquote,
+ Verbatim = parsers.Verbatim,
+ ThematicBreak = parsers.ThematicBreak,
+ BulletList = parsers.BulletList,
+ OrderedList = parsers.OrderedList,
+ DisplayHtml = parsers.DisplayHtml,
+ Heading = parsers.Heading,
+ Paragraph = parsers.Paragraph,
+ Plain = parsers.Plain,
+
+ EndlineExceptions = parsers.EndlineExceptions,
NoSoftLineBreakEndlineExceptions
- = parsers.NoSoftLineBreakEndlineExceptions,
-
- Str = parsers.Str,
- Space = parsers.Space,
- NoSoftLineBreakSpace = parsers.NoSoftLineBreakSpace,
- OptionalIndent = parsers.OptionalIndent,
- Endline = parsers.Endline,
- EndlineNoSub = parsers.EndlineNoSub,
+ = parsers.NoSoftLineBreakEndlineExceptions,
+
+ Str = parsers.Str,
+ Space = parsers.Space,
+ NoSoftLineBreakSpace
+ = parsers.NoSoftLineBreakSpace,
+ OptionalIndent = parsers.OptionalIndent,
+ Endline = parsers.Endline,
+ EndlineNoSub = parsers.EndlineNoSub,
NoSoftLineBreakEndline
- = parsers.NoSoftLineBreakEndline,
- EndlineBreak = parsers.EndlineBreak,
- LinkAndEmph = parsers.LinkAndEmph,
- Code = parsers.Code,
- AutoLinkUrl = parsers.AutoLinkUrl,
- AutoLinkEmail = parsers.AutoLinkEmail,
+ = parsers.NoSoftLineBreakEndline,
+ EndlineBreak = parsers.EndlineBreak,
+ LinkAndEmph = parsers.LinkAndEmph,
+ Code = parsers.Code,
+ AutoLinkUrl = parsers.AutoLinkUrl,
+ AutoLinkEmail = parsers.AutoLinkEmail,
AutoLinkRelativeReference
- = parsers.AutoLinkRelativeReference,
- InlineHtml = parsers.InlineHtml,
- HtmlEntity = parsers.HtmlEntity,
- EscapedChar = parsers.EscapedChar,
- Smart = parsers.Smart,
- Symbol = parsers.Symbol,
- SpecialChar = parsers.fail,
- InitializeState = parsers.succeed,
+ = parsers.AutoLinkRelativeReference,
+ InlineHtml = parsers.InlineHtml,
+ HtmlEntity = parsers.HtmlEntity,
+ EscapedChar = parsers.EscapedChar,
+ Smart = parsers.Smart,
+ Symbol = parsers.Symbol,
+ SpecialChar = parsers.fail,
+ InitializeState = parsers.succeed,
}
% \end{macrocode}
% \par
@@ -29977,13 +30742,17 @@ end
self.update_rule = function(rule_name, get_pattern)
assert(current_extension_name ~= nil)
assert(syntax[rule_name] ~= nil,
- [[Rule ]] .. rule_name .. [[ -> ... does not exist in markdown grammar]])
+ [[Rule ]] .. rule_name
+ .. [[ -> ... does not exist in markdown grammar]])
local previous_pattern
local extension_name
if walkable_syntax[rule_name] then
- local previous_accountable_pattern = walkable_syntax[rule_name][1]
+ local previous_accountable_pattern
+ = walkable_syntax[rule_name][1]
previous_pattern = previous_accountable_pattern[1]
- extension_name = previous_accountable_pattern[2] .. ", " .. current_extension_name
+ extension_name
+ = previous_accountable_pattern[2]
+ .. ", " .. current_extension_name
else
previous_pattern = nil
extension_name = current_extension_name
@@ -30113,9 +30882,11 @@ end
pattern_name = "Anonymous Pattern"
end
local extension_name = rhs[2]
- human_readable_rhs = pattern_name .. [[ (]] .. extension_name .. [[)]]
+ human_readable_rhs = pattern_name .. [[ (]]
+ .. extension_name .. [[)]]
end
- local encoded_rhs = util.encode_json_string(human_readable_rhs)
+ local encoded_rhs
+ = util.encode_json_string(human_readable_rhs)
local output_line = [[ ]] .. encoded_rhs
if rhs_index < #rule then
output_line = output_line .. ","
@@ -30133,7 +30904,8 @@ end
local output = table.concat(output_lines, "\n")
local output_filename = options.debugExtensionsFileName
local output_file = assert(io.open(output_filename, "w"),
- [[Could not open file "]] .. output_filename .. [[" for writing]])
+ [[Could not open file "]] .. output_filename
+ .. [[" for writing]])
assert(output_file:write(output))
assert(output_file:close())
end
@@ -30226,7 +30998,7 @@ end
end
local blocks_nested_t = util.table_copy(syntax)
- blocks_nested_t.ExpectedJekyllData = parsers.fail
+ blocks_nested_t.ExpectedJekyllData = parsers.succeed
parsers.blocks_nested = Ct(blocks_nested_t)
parsers.blocks = Ct(syntax)
@@ -30256,8 +31028,10 @@ end
local inlines_no_link_or_emphasis_t = util.table_copy(inlines_t)
inlines_no_link_or_emphasis_t.LinkAndEmph = parsers.fail
- inlines_no_link_or_emphasis_t.EndlineExceptions = parsers.EndlineExceptions - parsers.eof
- parsers.inlines_no_link_or_emphasis = Ct(inlines_no_link_or_emphasis_t)
+ inlines_no_link_or_emphasis_t.EndlineExceptions
+ = parsers.EndlineExceptions - parsers.eof
+ parsers.inlines_no_link_or_emphasis
+ = Ct(inlines_no_link_or_emphasis_t)
% \end{macrocode}
% \par
% \begin{markdown}
@@ -30284,7 +31058,8 @@ end
elseif form == "nfkd" then
input = uni_algos.normalize.NFKD(input)
else
- error(format("Unknown normalization form %s", form))
+ return writer.error(
+ format("Unknown normalization form %s", form))
end
end
% \end{macrocode}
@@ -30300,30 +31075,12 @@ end
end
% \end{macrocode}
% \begin{markdown}
-% When determining the name of the cache file, create salt for the hashing
-% function out of the package version and the passed options recognized by the
-% Lua interface (see Section <#sec:lua-options>). The \Opt{cacheDir} option
-% is disregarded.
+% Clear the table of references.
% \end{markdown}
% \begin{macrocode}
references = {}
- local opt_string = {}
- for k, _ in pairs(defaultOptions) do
- local v = options[k]
- if type(v) == "table" then
- for _, i in ipairs(v) do
- opt_string[#opt_string+1] = k .. "=" .. tostring(i)
- end
- elseif k ~= "cacheDir" then
- opt_string[#opt_string+1] = k .. "=" .. tostring(v)
- end
- end
- table.sort(opt_string)
- local salt = table.concat(opt_string, ",") .. "," .. metadata.version
- local output
- local function convert(input)
- local document = self.parser_functions.parse_blocks(input)
- local output = util.rope_to_string(writer.document(document))
+ local document = self.parser_functions.parse_blocks(input)
+ local output = util.rope_to_string(writer.document(document))
% \end{macrocode}
% \begin{markdown}
% Remove block element / paragraph separators immediately followed by the
@@ -30331,82 +31088,49 @@ end
% Then, remove any leftover output of \luamref{writer->undosep}.
% \end{markdown}
% \begin{macrocode}
- local undosep_start, undosep_end
- local potential_secend_start, secend_start
- local potential_sep_start, sep_start
+ local undosep_start, undosep_end
+ local potential_secend_start, secend_start
+ local potential_sep_start, sep_start
+ while true do
+ -- find a `writer->undosep`
+ undosep_start, undosep_end
+ = output:find(writer.undosep_text, 1, true)
+ if undosep_start == nil then break end
+ -- skip any preceding section ends
+ secend_start = undosep_start
while true do
- -- find a `writer->undosep`
- undosep_start, undosep_end = output:find(writer.undosep_text, 1, true)
- if undosep_start == nil then break end
- -- skip any preceding section ends
- secend_start = undosep_start
- while true do
- potential_secend_start = secend_start - #writer.secend_text
- if potential_secend_start < 1
- or output:sub(potential_secend_start, secend_start - 1) ~= writer.secend_text then
- break
- end
- secend_start = potential_secend_start
+ potential_secend_start = secend_start - #writer.secend_text
+ if potential_secend_start < 1
+ or output:sub(potential_secend_start,
+ secend_start - 1) ~= writer.secend_text
+ then
+ break
end
- -- find an immediately preceding block element / paragraph separator
- sep_start = secend_start
- potential_sep_start = sep_start - #writer.interblocksep_text
+ secend_start = potential_secend_start
+ end
+ -- find an immediately preceding
+ -- block element / paragraph separator
+ sep_start = secend_start
+ potential_sep_start = sep_start - #writer.interblocksep_text
+ if potential_sep_start >= 1
+ and output:sub(potential_sep_start,
+ sep_start - 1) == writer.interblocksep_text
+ then
+ sep_start = potential_sep_start
+ else
+ potential_sep_start = sep_start - #writer.paragraphsep_text
if potential_sep_start >= 1
- and output:sub(potential_sep_start, sep_start - 1) == writer.interblocksep_text then
+ and output:sub(potential_sep_start,
+ sep_start - 1) == writer.paragraphsep_text
+ then
sep_start = potential_sep_start
- else
- potential_sep_start = sep_start - #writer.paragraphsep_text
- if potential_sep_start >= 1
- and output:sub(potential_sep_start, sep_start - 1) == writer.paragraphsep_text then
- sep_start = potential_sep_start
- end
end
- -- remove `writer->undosep` and immediately preceding block element / paragraph separator
- output = output:sub(1, sep_start - 1)
- .. output:sub(secend_start, undosep_start - 1)
- .. output:sub(undosep_end + 1)
end
- return output
- end
-% \end{macrocode}
-% \begin{markdown}
-% If we cache markdown documents, produce the cache file and transform its
-% filename to plain \TeX{} output via the \luamref{writer->pack} method.
-% \end{markdown}
-% \begin{macrocode}
- if options.eagerCache or options.finalizeCache then
- local name = util.cache(options.cacheDir, input, salt, convert,
- ".md" .. writer.suffix)
- output = writer.pack(name)
-% \end{macrocode}
-% \begin{markdown}
-% Otherwise, return the result of the conversion directly.
-% \end{markdown}
-% \begin{macrocode}
- else
- output = convert(input)
- end
-% \end{macrocode}
-% \begin{markdown}
-% If the \Opt{finalizeCache} option is enabled, populate the frozen cache in
-% the file \Opt{frozenCacheFileName} with an entry for markdown document
-% number \Opt{frozenCacheCounter}.
-% \end{markdown}
-% \begin{macrocode}
- if options.finalizeCache then
- local file, mode
- if options.frozenCacheCounter > 0 then
- mode = "a"
- else
- mode = "w"
- end
- file = assert(io.open(options.frozenCacheFileName, mode),
- [[Could not open file "]] .. options.frozenCacheFileName
- .. [[" for writing]])
- assert(file:write([[\expandafter\global\expandafter\def\csname ]]
- .. [[markdownFrozenCache]] .. options.frozenCacheCounter
- .. [[\endcsname{]] .. output .. [[}]] .. "\n"))
- assert(file:close())
+ -- remove `writer->undosep` and immediately preceding
+ -- block element / paragraph separator
+ output = output:sub(1, sep_start - 1)
+ .. output:sub(secend_start, undosep_start - 1)
+ .. output:sub(undosep_end + 1)
end
return output
end
@@ -30468,10 +31192,13 @@ M.extensions.bracketed_spans = function()
+ parsers.autolink
+ V("InlineHtml")
+ ( parsers.backslash * parsers.backslash)
- + ( parsers.backslash * (parsers.lbracket + parsers.rbracket)
+ + ( parsers.backslash
+ * (parsers.lbracket + parsers.rbracket)
+ V("Space") + V("Endline")
+ (parsers.any
- - (parsers.newline + parsers.lbracket + parsers.rbracket
+ - ( parsers.newline
+ + parsers.lbracket
+ + parsers.rbracket
+ parsers.blankline^2))))^1)
/ self.parser_functions.parse_inlines)
* parsers.rbracket
@@ -30534,11 +31261,15 @@ M.extensions.citations = function(citation_nbsps)
end
end
else
- table.insert(buffer, {"\\markdownRenderer", text_cites and "TextCite" or "Cite",
- "{", #cites, "}"})
+ table.insert(buffer,
+ {"\\markdownRenderer",
+ text_cites and "TextCite" or "Cite",
+ "{", #cites, "}"})
for _,cite in ipairs(cites) do
- table.insert(buffer, {cite.suppress_author and "-" or "+", "{",
- cite.prenote or "", "}{", cite.postnote or "", "}{", cite.name, "}"})
+ table.insert(buffer,
+ {cite.suppress_author and "-" or "+", "{",
+ cite.prenote or "", "}{",
+ cite.postnote or "", "}{", cite.name, "}"})
end
end
return buffer
@@ -30554,12 +31285,16 @@ M.extensions.citations = function(citation_nbsps)
local citation_name
= Cs(parsers.dash^-1) * parsers.at
* Cs(citation_chars
- * (((citation_chars + parsers.internal_punctuation
+ * ((( citation_chars
+ + parsers.internal_punctuation
- parsers.comma - parsers.semicolon)
- * -#((parsers.internal_punctuation - parsers.comma
+ * -#(( parsers.internal_punctuation
+ - parsers.comma
- parsers.semicolon)^0
- * -(citation_chars + parsers.internal_punctuation
- - parsers.comma - parsers.semicolon)))^0
+ * -( citation_chars
+ + parsers.internal_punctuation
+ - parsers.comma
+ - parsers.semicolon)))^0
* citation_chars)^-1)
local citation_body_prenote
@@ -30568,10 +31303,14 @@ M.extensions.citations = function(citation_nbsps)
+ parsers.inticks
+ parsers.autolink
+ V("InlineHtml")
- + V("Space") + V("Endline")
+ + V("Space") + V("EndlineNoSub")
+ (parsers.anyescaped
- - (parsers.newline + parsers.rbracket + parsers.blankline^2))
- - (parsers.spnl * parsers.dash^-1 * parsers.at))^1)
+ - ( parsers.newline
+ + parsers.rbracket
+ + parsers.blankline^2))
+ - ( parsers.spnl
+ * parsers.dash^-1
+ * parsers.at))^1)
local citation_body_postnote
= Cs((parsers.alphanumeric^1
@@ -30579,9 +31318,11 @@ M.extensions.citations = function(citation_nbsps)
+ parsers.inticks
+ parsers.autolink
+ V("InlineHtml")
- + V("Space") + V("Endline")
+ + V("Space") + V("EndlineNoSub")
+ (parsers.anyescaped
- - (parsers.newline + parsers.rbracket + parsers.semicolon
+ - ( parsers.newline
+ + parsers.rbracket
+ + parsers.semicolon
+ parsers.blankline^2))
- (parsers.spnl * parsers.rbracket))^1)
@@ -30592,7 +31333,8 @@ M.extensions.citations = function(citation_nbsps)
* parsers.spnlc
)
* citation_name
- * (parsers.internal_punctuation - parsers.semicolon)^-1
+ * ( parsers.internal_punctuation
+ - parsers.semicolon)^-1
* ( parsers.spnlc / function(_) return end
* citation_body_postnote
+ Cc("")
@@ -30614,7 +31356,9 @@ M.extensions.citations = function(citation_nbsps)
+ V("InlineHtml")
+ V("Space") + V("Endline")
+ (parsers.anyescaped
- - (parsers.newline + parsers.rbracket + parsers.at
+ - ( parsers.newline
+ + parsers.rbracket
+ + parsers.at
+ parsers.semicolon + parsers.blankline^2))
- (parsers.spnl * parsers.rbracket))^0)
@@ -30708,7 +31452,8 @@ M.extensions.content_blocks = function(language_map)
% \begin{macrocode}
local languages_json = (function()
local base, prev, curr
- for _, pathname in ipairs{kpse.lookup(language_map, { all=true })} do
+ for _, pathname in ipairs{kpse.lookup(language_map,
+ {all=true})} do
local file = io.open(pathname, "r")
if not file then goto continue end
local input = assert(file:read("*a"))
@@ -30749,20 +31494,20 @@ M.extensions.content_blocks = function(language_map)
suf = suf:lower()
if type == "onlineimage" then
return {"\\markdownRendererContentBlockOnlineImage{",suf,"}",
- "{",self.string(src),"}",
- "{",self.uri(src),"}",
- "{",self.string(tit or ""),"}"}
+ "{",self.string(src),"}",
+ "{",self.uri(src),"}",
+ "{",self.string(tit or ""),"}"}
elseif languages_json[suf] then
return {"\\markdownRendererContentBlockCode{",suf,"}",
- "{",self.string(languages_json[suf]),"}",
- "{",self.string(src),"}",
- "{",self.uri(src),"}",
- "{",self.string(tit or ""),"}"}
+ "{",self.string(languages_json[suf]),"}",
+ "{",self.string(src),"}",
+ "{",self.uri(src),"}",
+ "{",self.string(tit or ""),"}"}
else
return {"\\markdownRendererContentBlock{",suf,"}",
- "{",self.string(src),"}",
- "{",self.uri(src),"}",
- "{",self.string(tit or ""),"}"}
+ "{",self.string(src),"}",
+ "{",self.uri(src),"}",
+ "{",self.string(tit or ""),"}"}
end
end
end, extend_reader = function(self)
@@ -30797,8 +31542,8 @@ M.extensions.content_blocks = function(language_map)
return parser
end)("png", "jpg", "jpeg", "gif", "tif", "tiff")
- -- online image url for iA Writer content blocks with mandatory suffix,
- -- allowing nested brackets:
+ -- online image url for iA Writer content blocks with
+ -- mandatory suffix, allowing nested brackets:
local onlineimageurl
= (parsers.less
* Cs((parsers.anyescaped
@@ -30876,8 +31621,9 @@ M.extensions.definition_lists = function(tight_lists)
local function dlitem(term, defs)
local retVal = {"\\markdownRendererDlItem{",term,"}"}
for _, def in ipairs(defs) do
- retVal[#retVal+1] = {"\\markdownRendererDlDefinitionBegin ",def,
- "\\markdownRendererDlDefinitionEnd "}
+ retVal[#retVal+1]
+ = {"\\markdownRendererDlDefinitionBegin ",def,
+ "\\markdownRendererDlDefinitionEnd "}
end
retVal[#retVal+1] = "\\markdownRendererDlItemEnd "
return retVal
@@ -30903,17 +31649,26 @@ M.extensions.definition_lists = function(tight_lists)
local defstartchar = S("~:")
- local defstart = parsers.check_trail_length(0) * defstartchar * #parsers.spacing
- * (parsers.tab + parsers.space^-3)
- + parsers.check_trail_length(1) * defstartchar * #parsers.spacing
- * (parsers.tab + parsers.space^-2)
- + parsers.check_trail_length(2) * defstartchar * #parsers.spacing
- * (parsers.tab + parsers.space^-1)
- + parsers.check_trail_length(3) * defstartchar * #parsers.spacing
-
- local indented_line = (parsers.check_minimal_indent / "") * parsers.check_code_trail * parsers.line
-
- local blank = parsers.check_minimal_blank_indent_and_any_trail * parsers.optionalspace * parsers.newline
+ local defstart
+ = parsers.check_trail_length(0) * defstartchar
+ * #parsers.spacing
+ * (parsers.tab + parsers.space^-3)
+ + parsers.check_trail_length(1)
+ * defstartchar * #parsers.spacing
+ * (parsers.tab + parsers.space^-2)
+ + parsers.check_trail_length(2)
+ * defstartchar * #parsers.spacing
+ * (parsers.tab + parsers.space^-1)
+ + parsers.check_trail_length(3)
+ * defstartchar * #parsers.spacing
+
+ local indented_line
+ = (parsers.check_minimal_indent / "")
+ * parsers.check_code_trail * parsers.line
+
+ local blank
+ = parsers.check_minimal_blank_indent_and_any_trail
+ * parsers.optionalspace * parsers.newline
local dlchunk = Cs(parsers.line * (indented_line - blank)^0)
@@ -30930,24 +31685,24 @@ M.extensions.definition_lists = function(tight_lists)
end
local DefinitionListItemLoose
- = C(parsers.line) * blank^0
- * Ct((parsers.check_minimal_indent * (defstart
- * indented_blocks(dlchunk)
- / self.parser_functions.parse_blocks_nested))^1)
- * Cc(false) / definition_list_item
+ = C(parsers.line) * blank^0
+ * Ct((parsers.check_minimal_indent * (defstart
+ * indented_blocks(dlchunk)
+ / self.parser_functions.parse_blocks_nested))^1)
+ * Cc(false) / definition_list_item
local DefinitionListItemTight
- = C(parsers.line)
- * Ct((parsers.check_minimal_indent * (defstart * dlchunk
- / self.parser_functions.parse_blocks_nested))^1)
- * Cc(true) / definition_list_item
+ = C(parsers.line)
+ * Ct((parsers.check_minimal_indent * (defstart * dlchunk
+ / self.parser_functions.parse_blocks_nested))^1)
+ * Cc(true) / definition_list_item
local DefinitionList
- = ( Ct(DefinitionListItemLoose^1) * Cc(false)
- + Ct(DefinitionListItemTight^1)
- * (blank^0
- * -DefinitionListItemLoose * Cc(true))
- ) / writer.definitionlist
+ = ( Ct(DefinitionListItemLoose^1) * Cc(false)
+ + Ct(DefinitionListItemTight^1)
+ * (blank^0
+ * -DefinitionListItemLoose * Cc(true))
+ ) / writer.definitionlist
self.insert_pattern("Block after Heading",
DefinitionList, "DefinitionList")
@@ -31032,7 +31787,8 @@ M.extensions.fancy_lists = function()
return {"\\markdownRendererFancyOlItemWithNumber{",num,"}",s,
"\\markdownRendererFancyOlItemEnd "}
else
- return {"\\markdownRendererFancyOlItem ",s,"\\markdownRendererFancyOlItemEnd "}
+ return {"\\markdownRendererFancyOlItem ",s,
+ "\\markdownRendererFancyOlItemEnd "}
end
end
end, extend_reader = function(self)
@@ -31053,7 +31809,8 @@ M.extensions.fancy_lists = function()
continuation_marker = marker
end
for _,delim in ipairs(delims) do
- table.insert(markers_table, {start_marker, continuation_marker, delim})
+ table.insert(markers_table,
+ {start_marker, continuation_marker, delim})
end
end
return markers_table
@@ -31072,15 +31829,18 @@ M.extensions.fancy_lists = function()
local roman_marker = function(chars)
local m, d, c = P(chars[1]), P(chars[2]), P(chars[3])
- local l, x, v, i = P(chars[4]), P(chars[5]), P(chars[6]), P(chars[7])
+ local l, x, v, i
+ = P(chars[4]), P(chars[5]), P(chars[6]), P(chars[7])
return m^-3
* (c*m + c*d + d^-1 * c^-3)
* (x*c + x*l + l^-1 * x^-3)
* (i*x + i*v + v^-1 * i^-3)
end
- local lowercase_roman_marker = roman_marker({"m", "d", "c", "l", "x", "v", "i"})
- local uppercase_roman_marker = roman_marker({"M", "D", "C", "L", "X", "V", "I"})
+ local lowercase_roman_marker
+ = roman_marker({"m", "d", "c", "l", "x", "v", "i"})
+ local uppercase_roman_marker
+ = roman_marker({"M", "D", "C", "L", "X", "V", "I"})
local lowercase_opening_roman_marker = P("i")
local uppercase_opening_roman_marker = P("I")
@@ -31104,7 +31864,8 @@ M.extensions.fancy_lists = function()
local markers_table = combine_markers_and_delims(markers, delims)
- local function enumerator(start_marker, _, delimiter_type, interrupting)
+ local function enumerator(start_marker, _,
+ delimiter_type, interrupting)
local delimiter_range
local allowed_end
if interrupting then
@@ -31112,7 +31873,8 @@ M.extensions.fancy_lists = function()
allowed_end = C(parsers.spacechar^1) * #parsers.linechar
else
delimiter_range = start_marker
- allowed_end = C(parsers.spacechar^1) + #(parsers.newline + parsers.eof)
+ allowed_end = C(parsers.spacechar^1)
+ + #(parsers.newline + parsers.eof)
end
return parsers.check_trail
@@ -31134,13 +31896,15 @@ M.extensions.fancy_lists = function()
end
local function roman2number(roman)
- local romans = { ["M"] = 1000, ["D"] = 500, ["C"] = 100, ["L"] = 50, ["X"] = 10, ["V"] = 5, ["I"] = 1 }
+ local romans = { ["M"] = 1000, ["D"] = 500, ["C"] = 100,
+ ["L"] = 50, ["X"] = 10, ["V"] = 5, ["I"] = 1 }
local numeral = 0
local i = 1
local len = string.len(roman)
while i < len do
- local z1, z2 = romans[ string.sub(roman, i, i) ], romans[ string.sub(roman, i+1, i+1) ]
+ local z1, z2 = romans[ string.sub(roman, i, i) ],
+ romans[ string.sub(roman, i+1, i+1) ]
if z1 < z2 then
numeral = numeral + (z2 - z1)
i = i + 2
@@ -31149,7 +31913,9 @@ M.extensions.fancy_lists = function()
i = i + 1
end
end
- if i <= len then numeral = numeral + romans[ string.sub(roman,i,i) ] end
+ if i <= len then
+ numeral = numeral + romans[ string.sub(roman,i,i) ]
+ end
return numeral
end
@@ -31174,11 +31940,13 @@ M.extensions.fancy_lists = function()
end
num = numstr:match("^([A-Z])$")
if num then
- return string.byte(num) - string.byte("A") + 1, "UpperAlpha", numdelim
+ return string.byte(num) - string.byte("A") + 1,
+ "UpperAlpha", numdelim
end
num = numstr:match("^([a-z])$")
if num then
- return string.byte(num) - string.byte("a") + 1, "LowerAlpha", numdelim
+ return string.byte(num) - string.byte("a") + 1,
+ "LowerAlpha", numdelim
end
num = numstr:match("^([IVXLCDM]+)")
if num then
@@ -31192,30 +31960,39 @@ M.extensions.fancy_lists = function()
end
local function fancylist(items,tight,start)
- local startnum, numstyle, numdelim = sniffstyle(start[2][1], start[2][2])
+ local startnum, numstyle, numdelim
+ = sniffstyle(start[2][1], start[2][2])
return writer.fancylist(items,tight,
options.startNumber and startnum or 1,
numstyle or "Decimal",
numdelim or "Default")
end
- local FancyListOfType = function(start_marker, continuation_marker, delimiter_type)
- local enumerator_start = enumerator(start_marker, continuation_marker, delimiter_type)
- local enumerator_cont = enumerator(continuation_marker, continuation_marker, delimiter_type)
- return Cg(enumerator_start, "listtype")
- * (Ct( TightListItem(Cb("listtype"))
- * ((parsers.check_minimal_indent / "") * TightListItem(enumerator_cont))^0)
- * Cc(true)
- * -#((parsers.conditionally_indented_blankline^0 / "")
- * parsers.check_minimal_indent * enumerator_cont)
- + Ct( LooseListItem(Cb("listtype"))
- * ((parsers.conditionally_indented_blankline^0 / "")
- * (parsers.check_minimal_indent / "") * LooseListItem(enumerator_cont))^0)
- * Cc(false)
- ) * Ct(Cb("listtype")) / fancylist
- end
+ local FancyListOfType
+ = function(start_marker, continuation_marker, delimiter_type)
+ local enumerator_start
+ = enumerator(start_marker, continuation_marker,
+ delimiter_type)
+ local enumerator_cont
+ = enumerator(continuation_marker, continuation_marker,
+ delimiter_type)
+ return Cg(enumerator_start, "listtype")
+ * (Ct( TightListItem(Cb("listtype"))
+ * ((parsers.check_minimal_indent / "")
+ * TightListItem(enumerator_cont))^0)
+ * Cc(true)
+ * -#((parsers.conditionally_indented_blankline^0 / "")
+ * parsers.check_minimal_indent * enumerator_cont)
+ + Ct( LooseListItem(Cb("listtype"))
+ * ((parsers.conditionally_indented_blankline^0 / "")
+ * (parsers.check_minimal_indent / "")
+ * LooseListItem(enumerator_cont))^0)
+ * Cc(false)
+ ) * Ct(Cb("listtype")) / fancylist
+ end
- local FancyList = join_table_with_func(FancyListOfType, markers_table)
+ local FancyList
+ = join_table_with_func(FancyListOfType, markers_table)
local Endline = parsers.newline
* (parsers.check_minimal_indent
@@ -31271,14 +32048,17 @@ M.extensions.fenced_code = function(blank_before_code_fence,
s = s:gsub("\n$", "")
local buf = {}
if attr ~= nil then
- table.insert(buf, {"\\markdownRendererFencedCodeAttributeContextBegin",
- self.attributes(attr)})
+ table.insert(buf,
+ {"\\markdownRendererFencedCodeAttributeContextBegin",
+ self.attributes(attr)})
end
local name = util.cache_verbatim(options.cacheDir, s)
- table.insert(buf, {"\\markdownRendererInputFencedCode{",
- name,"}{",self.string(i),"}{",self.infostring(i),"}"})
+ table.insert(buf,
+ {"\\markdownRendererInputFencedCode{",
+ name,"}{",self.string(i),"}{",self.infostring(i),"}"})
if attr ~= nil then
- table.insert(buf, "\\markdownRendererFencedCodeAttributeContextEnd{}")
+ table.insert(buf,
+ "\\markdownRendererFencedCodeAttributeContextEnd{}")
end
return buf
end
@@ -31318,11 +32098,13 @@ M.extensions.fenced_code = function(blank_before_code_fence,
- parsers.newline)^0)
/ strip_enclosing_whitespaces)
- local backtick_infostring = Cs(Cs((V("HtmlEntity")
- + (-#(parsers.backslash * parsers.backtick) * parsers.anyescaped)
- - parsers.newline
- - parsers.backtick)^0)
- / strip_enclosing_whitespaces)
+ local backtick_infostring
+ = Cs( Cs((V("HtmlEntity")
+ + ( -#(parsers.backslash * parsers.backtick)
+ * parsers.anyescaped)
+ - parsers.newline
+ - parsers.backtick)^0)
+ / strip_enclosing_whitespaces)
local fenceindent
@@ -31344,77 +32126,93 @@ M.extensions.fenced_code = function(blank_before_code_fence,
end
end
- local function count_fenced_start_indent(_, _, indent_table, trail)
- local last_indent_name = get_last_indent_name(indent_table)
- fenceindent = 0
- if last_indent_name ~= "li" then
- fenceindent = #trail
+ local count_fenced_start_indent =
+ function(_, _, indent_table, trail)
+ local last_indent_name = get_last_indent_name(indent_table)
+ fenceindent = 0
+ if last_indent_name ~= "li" then
+ fenceindent = #trail
+ end
+ return true
end
- return true
- end
- local fencehead = function(char, infostring)
- return Cmt(Cb("indent_info") * parsers.check_trail, count_fenced_start_indent)
- * Cg(char^3, "fencelength")
- * parsers.optionalspace
- * infostring
- * (parsers.newline + parsers.eof)
+ local fencehead = function(char, infostring)
+ return Cmt( Cb("indent_info")
+ * parsers.check_trail, count_fenced_start_indent)
+ * Cg(char^3, "fencelength")
+ * parsers.optionalspace
+ * infostring
+ * (parsers.newline + parsers.eof)
end
- local fencetail = function(char)
- return parsers.check_trail_no_rem
- * Cmt(C(char^3) * Cb("fencelength"), captures_geq_length)
- * parsers.optionalspace * (parsers.newline + parsers.eof)
- + parsers.eof
+ local fencetail = function(char)
+ return parsers.check_trail_no_rem
+ * Cmt(C(char^3) * Cb("fencelength"), captures_geq_length)
+ * parsers.optionalspace * (parsers.newline + parsers.eof)
+ + parsers.eof
end
- local function process_fenced_line(s, i, indent_table, line_content, is_blank) -- luacheck: ignore s i
- local remainder = ""
- if has_trail(indent_table) then
- remainder = indent_table.trail.internal_remainder
- end
+ local process_fenced_line =
+ function(s, i, -- luacheck: ignore s i
+ indent_table, line_content, is_blank)
+ local remainder = ""
+ if has_trail(indent_table) then
+ remainder = indent_table.trail.internal_remainder
+ end
- if is_blank and get_last_indent_name(indent_table) == "li" then
- remainder = ""
- end
+ if is_blank
+ and get_last_indent_name(indent_table) == "li" then
+ remainder = ""
+ end
- local str = remainder .. line_content
- local index = 1
- local remaining = fenceindent
+ local str = remainder .. line_content
+ local index = 1
+ local remaining = fenceindent
- while true do
- local c = str:sub(index, index)
- if c == " " and remaining > 0 then
- remaining = remaining - 1
- index = index + 1
- elseif c == "\t" and remaining > 3 then
- remaining = remaining - 4
- index = index + 1
- else
- break
+ while true do
+ local c = str:sub(index, index)
+ if c == " " and remaining > 0 then
+ remaining = remaining - 1
+ index = index + 1
+ elseif c == "\t" and remaining > 3 then
+ remaining = remaining - 4
+ index = index + 1
+ else
+ break
+ end
end
- end
- return true, str:sub(index)
- end
+ return true, str:sub(index)
+ end
local fencedline = function(char)
- return Cmt(Cb("indent_info") * C(parsers.line - fencetail(char)) * Cc(false), process_fenced_line)
+ return Cmt( Cb("indent_info")
+ * C(parsers.line - fencetail(char))
+ * Cc(false), process_fenced_line)
end
- local blankfencedline = Cmt(Cb("indent_info") * C(parsers.blankline) * Cc(true), process_fenced_line)
+ local blankfencedline
+ = Cmt( Cb("indent_info")
+ * C(parsers.blankline)
+ * Cc(true), process_fenced_line)
local TildeFencedCode
- = fencehead(parsers.tilde, tilde_infostring)
- * Cs(((parsers.check_minimal_blank_indent / "") * blankfencedline
- + (parsers.check_minimal_indent / "") * fencedline(parsers.tilde))^0)
- * ((parsers.check_minimal_indent / "") * fencetail(parsers.tilde) + parsers.succeed)
+ = fencehead(parsers.tilde, tilde_infostring)
+ * Cs(( (parsers.check_minimal_blank_indent / "")
+ * blankfencedline
+ + ( parsers.check_minimal_indent / "")
+ * fencedline(parsers.tilde))^0)
+ * ( (parsers.check_minimal_indent / "")
+ * fencetail(parsers.tilde) + parsers.succeed)
local BacktickFencedCode
= fencehead(parsers.backtick, backtick_infostring)
- * Cs(((parsers.check_minimal_blank_indent / "") * blankfencedline
- + (parsers.check_minimal_indent / "") * fencedline(parsers.backtick))^0)
- * ((parsers.check_minimal_indent / "") * fencetail(parsers.backtick) + parsers.succeed)
+ * Cs(( (parsers.check_minimal_blank_indent / "")
+ * blankfencedline
+ + (parsers.check_minimal_indent / "")
+ * fencedline(parsers.backtick))^0)
+ * ( (parsers.check_minimal_indent / "")
+ * fencetail(parsers.backtick) + parsers.succeed)
local infostring_with_attributes
= Ct(C((parsers.linechar
@@ -31424,28 +32222,28 @@ M.extensions.fenced_code = function(blank_before_code_fence,
* Ct(parsers.attributes))
local FencedCode
- = ((TildeFencedCode + BacktickFencedCode)
- / function(infostring, code)
- local expanded_code = self.expandtabs(code)
-
- if allow_raw_blocks then
- local raw_attr = lpeg.match(parsers.raw_attribute,
- infostring)
- if raw_attr then
- return writer.rawBlock(expanded_code, raw_attr)
- end
- end
-
- local attr = nil
- if allow_attributes then
- local match = lpeg.match(infostring_with_attributes,
- infostring)
- if match then
- infostring, attr = table.unpack(match)
- end
- end
- return writer.fencedCode(expanded_code, infostring, attr)
- end)
+ = ((TildeFencedCode + BacktickFencedCode)
+ / function(infostring, code)
+ local expanded_code = self.expandtabs(code)
+
+ if allow_raw_blocks then
+ local raw_attr = lpeg.match(parsers.raw_attribute,
+ infostring)
+ if raw_attr then
+ return writer.rawBlock(expanded_code, raw_attr)
+ end
+ end
+
+ local attr = nil
+ if allow_attributes then
+ local match = lpeg.match(infostring_with_attributes,
+ infostring)
+ if match then
+ infostring, attr = table.unpack(match)
+ end
+ end
+ return writer.fencedCode(expanded_code, infostring, attr)
+ end)
self.insert_pattern("Block after Verbatim",
FencedCode, "FencedCode")
@@ -31497,10 +32295,13 @@ M.extensions.fenced_divs = function(blank_before_div_fence)
% \end{markdown}
% \begin{macrocode}
function self.div_begin(attributes)
- local start_output = {"\\markdownRendererFencedDivAttributeContextBegin\n",
- self.attributes(attributes)}
- local end_output = {"\\markdownRendererFencedDivAttributeContextEnd{}"}
- return self.push_attributes("div", attributes, start_output, end_output)
+ local start_output
+ = {"\\markdownRendererFencedDivAttributeContextBegin\n",
+ self.attributes(attributes)}
+ local end_output
+ = {"\\markdownRendererFencedDivAttributeContextEnd{}"}
+ return self.push_attributes(
+ "div", attributes, start_output, end_output)
end
% \end{macrocode}
% \par
@@ -31561,21 +32362,24 @@ M.extensions.fenced_divs = function(blank_before_div_fence)
self.initialize_named_group("fenced_div_num_opening_indents")
local function increment_div_level()
- local function push_indent_table(s, i, indent_table, -- luacheck: ignore s i
- fenced_div_num_opening_indents, fenced_div_level)
- fenced_div_level = tonumber(fenced_div_level) + 1
- local num_opening_indents = 0
- if indent_table.indents ~= nil then
- num_opening_indents = #indent_table.indents
+ local push_indent_table =
+ function(s, i, indent_table, -- luacheck: ignore s i
+ fenced_div_num_opening_indents, fenced_div_level)
+ fenced_div_level = tonumber(fenced_div_level) + 1
+ local num_opening_indents = 0
+ if indent_table.indents ~= nil then
+ num_opening_indents = #indent_table.indents
+ end
+ fenced_div_num_opening_indents[fenced_div_level]
+ = num_opening_indents
+ return true, fenced_div_num_opening_indents
end
- fenced_div_num_opening_indents[fenced_div_level] = num_opening_indents
- return true, fenced_div_num_opening_indents
- end
- local function increment_level(s, i, fenced_div_level) -- luacheck: ignore s i
- fenced_div_level = tonumber(fenced_div_level) + 1
- return true, tostring(fenced_div_level)
- end
+ local increment_level =
+ function(s, i, fenced_div_level) -- luacheck: ignore s i
+ fenced_div_level = tonumber(fenced_div_level) + 1
+ return true, tostring(fenced_div_level)
+ end
return Cg( Cmt( Cb("indent_info")
* Cb("fenced_div_num_opening_indents")
@@ -31586,11 +32390,13 @@ M.extensions.fenced_divs = function(blank_before_div_fence)
end
local function decrement_div_level()
- local function pop_indent_table(s, i, fenced_div_indent_table, fenced_div_level) -- luacheck: ignore s i
- fenced_div_level = tonumber(fenced_div_level)
- fenced_div_indent_table[fenced_div_level] = nil
- return true, tostring(fenced_div_level - 1)
- end
+ local pop_indent_table =
+ function(s, i, -- luacheck: ignore s i
+ fenced_div_indent_table, fenced_div_level)
+ fenced_div_level = tonumber(fenced_div_level)
+ fenced_div_indent_table[fenced_div_level] = nil
+ return true, tostring(fenced_div_level - 1)
+ end
return Cg( Cmt( Cb("fenced_div_num_opening_indents")
* Cb("fenced_div_level"), pop_indent_table)
@@ -31598,21 +32404,24 @@ M.extensions.fenced_divs = function(blank_before_div_fence)
end
- local non_fenced_div_block = parsers.check_minimal_indent * V("Block")
- - parsers.check_minimal_indent_and_trail * fenced_div_end
+ local non_fenced_div_block
+ = parsers.check_minimal_indent * V("Block")
+ - parsers.check_minimal_indent_and_trail * fenced_div_end
- local non_fenced_div_paragraph = parsers.check_minimal_indent * V("Paragraph")
- - parsers.check_minimal_indent_and_trail * fenced_div_end
+ local non_fenced_div_paragraph
+ = parsers.check_minimal_indent * V("Paragraph")
+ - parsers.check_minimal_indent_and_trail * fenced_div_end
local blank = parsers.minimally_indented_blank
- local block_separated = parsers.block_sep_group(blank)
- * non_fenced_div_block
+ local block_separated = parsers.block_sep_group(blank)
+ * non_fenced_div_block
- local loop_body_pair = parsers.create_loop_body_pair(block_separated,
- non_fenced_div_paragraph,
- parsers.block_sep_group(blank),
- parsers.par_sep_group(blank))
+ local loop_body_pair
+ = parsers.create_loop_body_pair(block_separated,
+ non_fenced_div_paragraph,
+ parsers.block_sep_group(blank),
+ parsers.par_sep_group(blank))
local content_loop = ( non_fenced_div_block
* loop_body_pair.block^0
@@ -31625,7 +32434,9 @@ M.extensions.fenced_divs = function(blank_before_div_fence)
local FencedDiv = fenced_div_begin
/ function (infostring)
- local attr = lpeg.match(Ct(parsers.attributes), infostring)
+ local attr
+ = lpeg.match(Ct(parsers.attributes),
+ infostring)
if attr == nil then
attr = {"." .. infostring}
end
@@ -31636,7 +32447,8 @@ M.extensions.fenced_divs = function(blank_before_div_fence)
* parsers.skipblanklines
* Ct(content_loop)
* parsers.minimally_indented_blank^0
- * parsers.check_minimal_indent_and_trail * fenced_div_end
+ * parsers.check_minimal_indent_and_trail
+ * fenced_div_end
* decrement_div_level()
* (Cc("") / writer.div_end)
@@ -31657,23 +32469,27 @@ M.extensions.fenced_divs = function(blank_before_div_fence)
% \end{markdown}
% \begin{macrocode}
local function is_inside_div()
- local function check_div_level(s, i, fenced_div_level) -- luacheck: ignore s i
- fenced_div_level = tonumber(fenced_div_level)
- return fenced_div_level > 0
- end
+ local check_div_level =
+ function(s, i, fenced_div_level) -- luacheck: ignore s i
+ fenced_div_level = tonumber(fenced_div_level)
+ return fenced_div_level > 0
+ end
return Cmt(Cb("fenced_div_level"), check_div_level)
end
local function check_indent()
- local function compare_indent(s, i, indent_table, -- luacheck: ignore s i
- fenced_div_num_opening_indents, fenced_div_level)
- fenced_div_level = tonumber(fenced_div_level)
- local num_current_indents = (indent_table.current_line_indents ~= nil and
- #indent_table.current_line_indents) or 0
- local num_opening_indents = fenced_div_num_opening_indents[fenced_div_level]
- return num_current_indents == num_opening_indents
- end
+ local compare_indent =
+ function(s, i, indent_table, -- luacheck: ignore s i
+ fenced_div_num_opening_indents, fenced_div_level)
+ fenced_div_level = tonumber(fenced_div_level)
+ local num_current_indents
+ = ( indent_table.current_line_indents ~= nil and
+ #indent_table.current_line_indents) or 0
+ local num_opening_indents
+ = fenced_div_num_opening_indents[fenced_div_level]
+ return num_current_indents == num_opening_indents
+ end
return Cmt( Cb("indent_info")
* Cb("fenced_div_num_opening_indents")
@@ -31745,26 +32561,31 @@ M.extensions.header_attributes = function()
* parsers.newline))^1
- parsers.thematic_break_lines
- local heading_text = heading_line
- * ((V("Endline") / "\n") * (heading_line - parsers.heading_level))^0
- * parsers.newline^-1
-
- local SetextHeading = parsers.freeze_trail * parsers.check_trail_no_rem
- * #(heading_text
- * (parsers.attributes
- * parsers.optionalspace
- * parsers.newline)^-1
- * parsers.check_minimal_indent * parsers.check_trail * parsers.heading_level)
- * Cs(heading_text) / strip_trailing_spaces
- / parsers.parse_heading_text
- * Cg(Ct((parsers.attributes
- * parsers.optionalspace
- * parsers.newline)^-1), "attributes")
- * parsers.check_minimal_indent_and_trail * parsers.heading_level
- * Cb("attributes")
- * parsers.newline
- * parsers.unfreeze_trail
- / writer.heading
+ local heading_text
+ = heading_line
+ * ( (V("Endline") / "\n")
+ * (heading_line - parsers.heading_level))^0
+ * parsers.newline^-1
+
+ local SetextHeading
+ = parsers.freeze_trail * parsers.check_trail_no_rem
+ * #(heading_text
+ * (parsers.attributes
+ * parsers.optionalspace
+ * parsers.newline)^-1
+ * parsers.check_minimal_indent
+ * parsers.check_trail
+ * parsers.heading_level)
+ * Cs(heading_text) / strip_trailing_spaces
+ / parsers.parse_heading_text
+ * Cg(Ct((parsers.attributes
+ * parsers.optionalspace
+ * parsers.newline)^-1), "attributes")
+ * parsers.check_minimal_indent_and_trail * parsers.heading_level
+ * Cb("attributes")
+ * parsers.newline
+ * parsers.unfreeze_trail
+ / writer.heading
local Heading = AtxHeading + SetextHeading
self.update_rule("Heading", Heading)
@@ -31838,18 +32659,18 @@ M.extensions.line_blocks = function()
local parsers = self.parsers
local writer = self.writer
- local LineBlock = Ct(
- (Cs(
- ( (parsers.pipe * parsers.space)/""
- * ((parsers.space)/entities.char_entity("nbsp"))^0
- * parsers.linechar^0 * (parsers.newline/""))
- * (-parsers.pipe
- * (parsers.space^1/" ")
- * parsers.linechar^1
- * (parsers.newline/"")
- )^0
- * (parsers.blankline/"")^0
- ) / self.parser_functions.parse_inlines)^1) / writer.lineblock
+ local LineBlock
+ = Ct((Cs(( (parsers.pipe * parsers.space) / ""
+ * ((parsers.space)/entities.char_entity("nbsp"))^0
+ * parsers.linechar^0 * (parsers.newline/""))
+ * (-parsers.pipe
+ * (parsers.space^1/" ")
+ * parsers.linechar^1
+ * (parsers.newline/"")
+ )^0
+ * (parsers.blankline/"")^0)
+ / self.parser_functions.parse_inlines)^1)
+ / writer.lineblock
self.insert_pattern("Block after Blockquote",
LineBlock, "LineBlock")
@@ -31889,8 +32710,9 @@ M.extensions.mark = function()
local doubleequals = P("==")
- local Mark = parsers.between(V("Inline"), doubleequals, doubleequals)
- / function (inlines) return writer.mark(inlines) end
+ local Mark
+ = parsers.between(V("Inline"), doubleequals, doubleequals)
+ / function (inlines) return writer.mark(inlines) end
self.add_special_character("=")
self.insert_pattern("Inline before LinkAndEmph",
@@ -31923,13 +32745,18 @@ M.extensions.link_attributes = function()
%
% \end{markdown}
% \begin{macrocode}
- local define_reference_parser = (parsers.check_trail / "") * parsers.link_label * parsers.colon
- * parsers.spnlc * parsers.url
- * ( parsers.spnlc_sep * parsers.title * (parsers.spnlc * Ct(parsers.attributes))
- * parsers.only_blank
- + parsers.spnlc_sep * parsers.title * parsers.only_blank
- + Cc("") * (parsers.spnlc * Ct(parsers.attributes)) * parsers.only_blank
- + Cc("") * parsers.only_blank)
+ local define_reference_parser
+ = (parsers.check_trail / "")
+ * parsers.link_label
+ * parsers.colon
+ * parsers.spnlc * parsers.url
+ * ( parsers.spnlc_sep * parsers.title
+ * (parsers.spnlc * Ct(parsers.attributes))
+ * parsers.only_blank
+ + parsers.spnlc_sep * parsers.title * parsers.only_blank
+ + Cc("") * (parsers.spnlc * Ct(parsers.attributes))
+ * parsers.only_blank
+ + Cc("") * parsers.only_blank)
local ReferenceWithAttributes = define_reference_parser
/ self.register_link
@@ -31944,8 +32771,10 @@ M.extensions.link_attributes = function()
% \end{markdown}
% \begin{macrocode}
- local LinkWithAttributesAndEmph = Ct(parsers.link_and_emph_table * Cg(Cc(true), "match_link_attributes"))
- / self.defer_link_and_emphasis_processing
+ local LinkWithAttributesAndEmph
+ = Ct(parsers.link_and_emph_table * Cg(Cc(true),
+ "match_link_attributes"))
+ / self.defer_link_and_emphasis_processing
self.update_rule("LinkAndEmph", LinkWithAttributesAndEmph)
@@ -32030,9 +32859,10 @@ M.extensions.notes = function(notes, inline_notes)
if inline_notes then
local InlineNote
- = parsers.circumflex
- * (parsers.link_label / self.parser_functions.parse_inlines_no_inline_note)
- / writer.note
+ = parsers.circumflex
+ * ( parsers.link_label
+ / self.parser_functions.parse_inlines_no_inline_note)
+ / writer.note
self.insert_pattern("Inline after LinkAndEmph",
InlineNote, "InlineNote")
@@ -32070,20 +32900,27 @@ M.extensions.notes = function(notes, inline_notes)
local NoteRef = RawNoteRef / lookup_note
- local optionally_indented_line = parsers.check_optional_indent_and_any_trail * parsers.line
+ local optionally_indented_line
+ = parsers.check_optional_indent_and_any_trail * parsers.line
- local blank = parsers.check_optional_blank_indent_and_any_trail * parsers.optionalspace * parsers.newline
+ local blank
+ = parsers.check_optional_blank_indent_and_any_trail
+ * parsers.optionalspace * parsers.newline
- local chunk = Cs(parsers.line * (optionally_indented_line - blank)^0)
+ local chunk
+ = Cs(parsers.line
+ * (optionally_indented_line - blank)^0)
local indented_blocks = function(bl)
return Cs( bl
- * (blank^1 * (parsers.check_optional_indent / "")
- * parsers.check_code_trail * -parsers.blankline * bl)^0)
+ * ( blank^1 * (parsers.check_optional_indent / "")
+ * parsers.check_code_trail
+ * -parsers.blankline * bl)^0)
end
local NoteBlock
- = parsers.check_trail_no_rem * RawNoteRef * parsers.colon
+ = parsers.check_trail_no_rem
+ * RawNoteRef * parsers.colon
* parsers.spnlc * indented_blocks(chunk)
/ register_note
@@ -32241,24 +33078,26 @@ M.extensions.pipe_tables = function(table_captions, table_attributes)
, table_hline_separator
, table_hline_column)
- local table_caption_beginning = (parsers.check_minimal_blank_indent_and_any_trail_no_rem
- * parsers.optionalspace * parsers.newline)^0
- * parsers.check_minimal_indent_and_trail
- * (P("Table")^-1 * parsers.colon)
- * parsers.optionalspace
+ local table_caption_beginning
+ = ( parsers.check_minimal_blank_indent_and_any_trail_no_rem
+ * parsers.optionalspace * parsers.newline)^0
+ * parsers.check_minimal_indent_and_trail
+ * (P("Table")^-1 * parsers.colon)
+ * parsers.optionalspace
local function strip_trailing_spaces(s)
return s:gsub("%s*$","")
end
- local table_row = pipe_table_row(true
- , (C((parsers.linechar - parsers.pipe)^1)
- / strip_trailing_spaces
- / self.parser_functions.parse_inlines)
- , parsers.pipe
- , (C((parsers.linechar - parsers.pipe)^0)
- / strip_trailing_spaces
- / self.parser_functions.parse_inlines))
+ local table_row
+ = pipe_table_row(true
+ , (C((parsers.linechar - parsers.pipe)^1)
+ / strip_trailing_spaces
+ / self.parser_functions.parse_inlines)
+ , parsers.pipe
+ , (C((parsers.linechar - parsers.pipe)^0)
+ / strip_trailing_spaces
+ / self.parser_functions.parse_inlines))
local table_caption
if table_captions then
@@ -32275,7 +33114,8 @@ M.extensions.pipe_tables = function(table_captions, table_attributes)
+ ( parsers.newline
* #( parsers.optionalspace
* parsers.linechar)
- * C(parsers.optionalspace) / writer.space))
+ * C(parsers.optionalspace)
+ / writer.space))
* (parsers.linechar
- parsers.lbrace)^0)^1)
/ self.parser_functions.parse_inlines)
@@ -32289,7 +33129,8 @@ M.extensions.pipe_tables = function(table_captions, table_attributes)
+ ( parsers.newline
* #( parsers.optionalspace
* parsers.linechar)
- * C(parsers.optionalspace) / writer.space))^1)
+ * C(parsers.optionalspace)
+ / writer.space))^1)
/ self.parser_functions.parse_inlines
* parsers.newline
end
@@ -32297,12 +33138,15 @@ M.extensions.pipe_tables = function(table_captions, table_attributes)
table_caption = parsers.fail
end
- local PipeTable = Ct(table_row * parsers.newline * (parsers.check_minimal_indent_and_trail / {})
- * table_hline * parsers.newline
- * ((parsers.check_minimal_indent / {}) * table_row * parsers.newline)^0)
- / make_pipe_table_rectangular
- * table_caption^-1
- / writer.table
+ local PipeTable
+ = Ct( table_row * parsers.newline
+ * (parsers.check_minimal_indent_and_trail / {})
+ * table_hline * parsers.newline
+ * ( (parsers.check_minimal_indent / {})
+ * table_row * parsers.newline)^0)
+ / make_pipe_table_rectangular
+ * table_caption^-1
+ / writer.table
self.insert_pattern("Block after Blockquote",
PipeTable, "PipeTable")
@@ -32470,7 +33314,8 @@ M.extensions.superscripts = function()
local writer = self.writer
local Superscript = (
- parsers.between(parsers.Str, parsers.circumflex, parsers.circumflex)
+ parsers.between(parsers.Str, parsers.circumflex,
+ parsers.circumflex)
) / writer.superscript
self.insert_pattern("Inline after LinkAndEmph",
@@ -32533,11 +33378,13 @@ M.extensions.tex_math = function(tex_math_dollars,
return str:gsub("^%s*(.-)$", "%1")
end
- local allowed_before_closing = B( parsers.backslash * parsers.any
- + parsers.any * (parsers.any - parsers.backslash))
+ local allowed_before_closing
+ = B( parsers.backslash * parsers.any
+ + parsers.any * (parsers.any - parsers.backslash))
- local allowed_before_closing_no_space = B( parsers.backslash * parsers.any
- + parsers.any * (parsers.nonspacechar - parsers.backslash))
+ local allowed_before_closing_no_space
+ = B( parsers.backslash * parsers.any
+ + parsers.any * (parsers.nonspacechar - parsers.backslash))
% \end{macrocode}
% \begin{markdown}
@@ -32546,18 +33393,20 @@ M.extensions.tex_math = function(tex_math_dollars,
%
% \end{markdown}
% \begin{macrocode}
- local dollar_math_content = (parsers.newline * (parsers.check_optional_indent / "")
- + parsers.backslash^-1
- * parsers.linechar)
- - parsers.blankline^2
- - parsers.dollar
+ local dollar_math_content
+ = (parsers.newline * (parsers.check_optional_indent / "")
+ + parsers.backslash^-1
+ * parsers.linechar)
+ - parsers.blankline^2
+ - parsers.dollar
local inline_math_opening_dollars = parsers.dollar
* #(parsers.nonspacechar)
- local inline_math_closing_dollars = allowed_before_closing_no_space
- * parsers.dollar
- * -#(parsers.digit)
+ local inline_math_closing_dollars
+ = allowed_before_closing_no_space
+ * parsers.dollar
+ * -#(parsers.digit)
local inline_math_dollars = between(Cs( dollar_math_content),
inline_math_opening_dollars,
@@ -32580,9 +33429,10 @@ M.extensions.tex_math = function(tex_math_dollars,
%
% \end{markdown}
% \begin{macrocode}
- local backslash_math_content = (parsers.newline * (parsers.check_optional_indent / "")
- + parsers.linechar)
- - parsers.blankline^2
+ local backslash_math_content
+ = (parsers.newline * (parsers.check_optional_indent / "")
+ + parsers.linechar)
+ - parsers.blankline^2
% \end{macrocode}
% \begin{markdown}
%
@@ -32702,11 +33552,15 @@ end
% \acro{yaml} metadata block syntax extension. When the
% `expect_jekyll_data` parameter is `true`, then a markdown document
% may begin directly with \acro{yaml} metadata and may contain nothing
-% but \acro{yaml} metadata.
+% but \acro{yaml} metadata. When both `expect_jekyll_data` and
+% `ensure_jekyll_data` parameters are `true`, then a a markdown document must
+% begin directly with \acro{yaml} metadata and must contain nothing but
+% \acro{yaml} metadata.
%
% \end{markdown}
% \begin{macrocode}
-M.extensions.jekyll_data = function(expect_jekyll_data)
+M.extensions.jekyll_data = function(expect_jekyll_data,
+ ensure_jekyll_data)
return {
name = "built-in jekyll_data syntax extension",
extend_writer = function(self)
@@ -32719,7 +33573,8 @@ M.extensions.jekyll_data = function(expect_jekyll_data)
% the key `p` in the parent table; if `p` is nil, then the table has no parent.
% All scalar keys and values encountered in the table will be cast to a string
% following \acro{yaml} serialization rules. String values will also be
-% transformed using the function `t`.
+% transformed using the function `t` for the typographic output format used by
+% the \mref{markdownRendererJekyllDataTypographicString} macro.
%
% \end{markdown}
% \begin{macrocode}
@@ -32764,17 +33619,18 @@ M.extensions.jekyll_data = function(expect_jekyll_data)
::not_a_sequence::
if is_sequence then
- table.insert(buf, "\\markdownRendererJekyllDataSequenceBegin{")
- table.insert(buf, self.identifier(p or "null"))
- table.insert(buf, "}{")
- table.insert(buf, #keys)
- table.insert(buf, "}")
+ table.insert(buf,
+ "\\markdownRendererJekyllDataSequenceBegin{")
+ table.insert(buf, self.identifier(p or "null"))
+ table.insert(buf, "}{")
+ table.insert(buf, #keys)
+ table.insert(buf, "}")
else
- table.insert(buf, "\\markdownRendererJekyllDataMappingBegin{")
- table.insert(buf, self.identifier(p or "null"))
- table.insert(buf, "}{")
- table.insert(buf, #keys)
- table.insert(buf, "}")
+ table.insert(buf, "\\markdownRendererJekyllDataMappingBegin{")
+ table.insert(buf, self.identifier(p or "null"))
+ table.insert(buf, "}{")
+ table.insert(buf, #keys)
+ table.insert(buf, "}")
end
for _, k in ipairs(keys) do
@@ -32802,7 +33658,14 @@ M.extensions.jekyll_data = function(expect_jekyll_data)
table.insert(buf, v)
table.insert(buf, "}")
elseif typ == "string" then
- table.insert(buf, "\\markdownRendererJekyllDataString{")
+ table.insert(buf,
+ "\\markdownRendererJekyllDataProgrammaticString{")
+ table.insert(buf, k)
+ table.insert(buf, "}{")
+ table.insert(buf, self.identifier(v))
+ table.insert(buf, "}")
+ table.insert(buf,
+ "\\markdownRendererJekyllDataTypographicString{")
table.insert(buf, k)
table.insert(buf, "}{")
table.insert(buf, t(v))
@@ -32812,8 +33675,10 @@ M.extensions.jekyll_data = function(expect_jekyll_data)
table.insert(buf, k)
table.insert(buf, "}")
else
- error(format("Unexpected type %s for value of " ..
- "YAML key %s", typ, k))
+ local error = self.error(format(
+ "Unexpected type %s for value of "
+ .. "YAML key %s", typ, k))
+ table.insert(buf, error)
end
end
end
@@ -32835,38 +33700,49 @@ M.extensions.jekyll_data = function(expect_jekyll_data)
local writer = self.writer
local JekyllData
- = Cmt( C((parsers.line - P("---") - P("..."))^0)
- , function(s, i, text) -- luacheck: ignore s i
- local data
- local ran_ok, _ = pcall(function()
- -- TODO: Replace with `require("tinyyaml")` in TeX Live 2023
- local tinyyaml = require("markdown-tinyyaml")
- data = tinyyaml.parse(text, {timestamps=false})
- end)
- if ran_ok and data ~= nil then
- return true, writer.jekyllData(data, function(s)
- return self.parser_functions.parse_blocks_nested(s)
- end, nil)
- else
- return false
- end
- end
- )
+ = Cmt( C((parsers.line - P("---") - P("..."))^0)
+ , function(s, i, text) -- luacheck: ignore s i
+ local data
+ local ran_ok, _ = pcall(function()
+ -- TODO: Use `require("tinyyaml")` in TeX Live 2023
+ local tinyyaml = require("markdown-tinyyaml")
+ data = tinyyaml.parse(text, {timestamps=false})
+ end)
+ if ran_ok and data ~= nil then
+ return true, writer.jekyllData(data, function(s)
+ return self.parser_functions.parse_blocks_nested(s)
+ end, nil)
+ else
+ return false
+ end
+ end
+ )
local UnexpectedJekyllData
- = P("---")
- * parsers.blankline / 0
- * #(-parsers.blankline) -- if followed by blank, it's thematic break
- * JekyllData
- * (P("---") + P("..."))
+ = P("---")
+ * parsers.blankline / 0
+ -- if followed by blank, it's thematic break
+ * #(-parsers.blankline)
+ * JekyllData
+ * (P("---") + P("..."))
local ExpectedJekyllData
- = ( P("---")
- * parsers.blankline / 0
- * #(-parsers.blankline) -- if followed by blank, it's thematic break
- )^-1
- * JekyllData
- * (P("---") + P("..."))^-1
+ = ( P("---")
+ * parsers.blankline / 0
+ -- if followed by blank, it's thematic break
+ * #(-parsers.blankline)
+ )^-1
+ * JekyllData
+ * (P("---") + P("..."))^-1
+
+ if ensure_jekyll_data then
+ ExpectedJekyllData = ExpectedJekyllData
+ * parsers.eof
+ else
+ ExpectedJekyllData = ( ExpectedJekyllData
+ * (V("Blank")^0 / writer.interblocksep)
+ )^-1
+ end
self.insert_pattern("Block before Blockquote",
UnexpectedJekyllData, "UnexpectedJekyllData")
@@ -32881,9 +33757,127 @@ end
%
%### Conversion from Markdown to Plain \TeX{}
%
-% The \luamref{new} function returns a conversion function that takes a
-% markdown string and turns it into a plain \TeX{} output. See Section
-% <#sec:lua-conversion>.
+% The \luamref{new} function of file `markdown.lua` loads file
+% `markdown-parser.lua` and calls its own function \luamref{new} unless option
+% \Opt{eagerCache} or \Opt{finalizeCache} has been enabled and a cached
+% conversion output exists, in which case it is returned without loading file
+% `markdown-parser.lua`.
+%
+% \end{markdown}
+% \iffalse
+%</lua>
+%<*lua-loader>
+% \fi
+% \begin{macrocode}
+local function warn(s)
+ io.stderr:write("Warning: " .. s .. "\n")
+end
+
+function M.new(options)
+% \end{macrocode}
+% \par
+% \begin{markdown}
+%
+% Make the `options` table inherit from the \luamref{defaultOptions} table.
+%
+% \end{markdown}
+% \begin{macrocode}
+ options = options or {}
+ setmetatable(options, { __index = function (_, key)
+ return defaultOptions[key] end })
+% \end{macrocode}
+% \par
+% \begin{markdown}
+%
+% Return a conversion function that tries to produce a cached conversion output
+% exists. If no cached conversion output exists, we load the file
+% `markdown-parser.lua` and use it to convert the input.
+%
+% \end{markdown}
+% \begin{macrocode}
+ local parser_convert = nil
+ return function(input)
+ local function convert(input)
+ if parser_convert == nil then
+% \end{macrocode}
+% \par
+% \begin{markdown}
+%
+% Lazy-load `markdown-parser.lua` and check that it originates from the same
+% version of the Markdown package.
+%
+% \end{markdown}
+% \begin{macrocode}
+ local parser = require("markdown-parser")
+ if metadata.version ~= parser.metadata.version then
+ warn("markdown.lua " .. metadata.version .. " used with " ..
+ "markdown-parser.lua " .. parser.metadata.version .. ".")
+ end
+ parser_convert = parser.new(options)
+ end
+ return parser_convert(input)
+ end
+% \end{macrocode}
+% \begin{markdown}
+% If we cache markdown documents, produce the cache file and transform its
+% filename to plain \TeX{} output.
+%
+% When determining the name of the cache file, create salt for the hashing
+% function out of the package version and the passed options recognized by the
+% Lua interface (see Section <#sec:lua-options>).
+% \end{markdown}
+% \begin{macrocode}
+ local output
+ if options.eagerCache or options.finalizeCache then
+ local salt = util.salt(options)
+ local name = util.cache(options.cacheDir, input, salt, convert,
+ ".md.tex")
+ output = [[\input{]] .. name .. [[}\relax]]
+% \end{macrocode}
+% \begin{markdown}
+% Otherwise, return the result of the conversion directly.
+% \end{markdown}
+% \begin{macrocode}
+ else
+ output = convert(input)
+ end
+% \end{macrocode}
+% \begin{markdown}
+% If the \Opt{finalizeCache} option is enabled, populate the frozen cache in
+% the file \Opt{frozenCacheFileName} with an entry for markdown document
+% number \Opt{frozenCacheCounter}.
+% \end{markdown}
+% \begin{macrocode}
+ if options.finalizeCache then
+ local file, mode
+ if options.frozenCacheCounter > 0 then
+ mode = "a"
+ else
+ mode = "w"
+ end
+ file = assert(io.open(options.frozenCacheFileName, mode),
+ [[Could not open file "]] .. options.frozenCacheFileName
+ .. [[" for writing]])
+ assert(file:write(
+ [[\expandafter\global\expandafter\def\csname ]]
+ .. [[markdownFrozenCache]] .. options.frozenCacheCounter
+ .. [[\endcsname{]] .. output .. [[}]] .. "\n"))
+ assert(file:close())
+ end
+ return output
+ end
+end
+% \end{macrocode}
+% \iffalse
+%</lua-loader>
+%<*lua>
+% \fi
+% \par
+% \begin{markdown}
+%
+% The \luamref{new} function from file `markdown-parser.lua` returns a
+% conversion function that takes a markdown string and turns it into a plain
+% \TeX{} output. See Section <#sec:lua-conversion>.
%
% \end{markdown}
% \begin{macrocode}
@@ -32916,7 +33910,15 @@ function M.new(options)
goto miss
end
end
- elseif singletonCache.options[k] ~= options[k] then
+% \end{macrocode}
+% \begin{markdown}
+%
+% The \Opt{cacheDir} option is disregarded.
+%
+% \end{markdown}
+% \begin{macrocode}
+ elseif k ~= "cacheDir"
+ and singletonCache.options[k] ~= options[k] then
goto miss
end
end
@@ -32977,7 +33979,7 @@ function M.new(options)
if options.jekyllData then
local jekyll_data_extension = M.extensions.jekyll_data(
- options.expectJekyllData)
+ options.expectJekyllData, options.ensureJekyllData)
table.insert(extensions, jekyll_data_extension)
end
@@ -33040,7 +34042,8 @@ function M.new(options)
end
if options.citations then
- local citations_extension = M.extensions.citations(options.citationNbsps)
+ local citations_extension
+ = M.extensions.citations(options.citationNbsps)
table.insert(extensions, citations_extension)
end
@@ -33065,7 +34068,9 @@ function M.new(options)
%
% \end{markdown}
% \begin{macrocode}
- local pathname = kpse.lookup(filename)
+ local pathname = assert(kpse.find_file(filename),
+ [[Could not locate user-defined syntax extension "]]
+ .. filename)
local input_file = assert(io.open(pathname, "r"),
[[Could not open user-defined syntax extension "]]
.. pathname .. [[" for reading]])
@@ -33095,7 +34100,8 @@ function M.new(options)
.. type(user_extension.api_version)
.. [[" but "number" was expected]])
assert(user_extension.api_version > 0
- and user_extension.api_version <= metadata.user_extension_api_version,
+ and user_extension.api_version
+ <= metadata.user_extension_api_version,
[[User-defined syntax extension "]] .. pathname
.. [[" uses syntax extension API version "]]
.. user_extension.api_version .. [[ but markdown.lua ]]
@@ -33113,7 +34119,8 @@ function M.new(options)
.. [[" but "number" was expected]])
assert(user_extension.grammar_version == metadata.grammar_version,
[[User-defined syntax extension "]] .. pathname
- .. [[" uses grammar version "]] .. user_extension.grammar_version
+ .. [[" uses grammar version "]]
+ .. user_extension.grammar_version
.. [[ but markdown.lua ]] .. metadata.version
.. [[ uses grammar version ]] .. metadata.grammar_version
.. [[, which is incompatible]])
@@ -33195,11 +34202,16 @@ function M.new(options)
% \begin{macrocode}
return convert
end
-
-return M
% \end{macrocode}
% \iffalse
%</lua>
+%<*lua,lua-loader>
+% \fi
+% \begin{macrocode}
+return M
+% \end{macrocode}
+% \iffalse
+%</lua,lua-loader>
%<*lua-cli>
% \fi
% \par
@@ -33553,18 +34565,22 @@ end
\def\markdownRendererUlEndTightPrototype{}%
\def\markdownRendererOlBeginPrototype{}%
\def\markdownRendererOlBeginTightPrototype{}%
-\def\markdownRendererFancyOlBeginPrototype#1#2{\markdownRendererOlBegin}%
-\def\markdownRendererFancyOlBeginTightPrototype#1#2{\markdownRendererOlBeginTight}%
+\def\markdownRendererFancyOlBeginPrototype#1#2{%
+ \markdownRendererOlBegin}%
+\def\markdownRendererFancyOlBeginTightPrototype#1#2{%
+ \markdownRendererOlBeginTight}%
\def\markdownRendererOlItemPrototype{}%
\def\markdownRendererOlItemWithNumberPrototype#1{}%
\def\markdownRendererOlItemEndPrototype{}%
\def\markdownRendererFancyOlItemPrototype{\markdownRendererOlItem}%
-\def\markdownRendererFancyOlItemWithNumberPrototype{\markdownRendererOlItemWithNumber}%
+\def\markdownRendererFancyOlItemWithNumberPrototype{%
+ \markdownRendererOlItemWithNumber}%
\def\markdownRendererFancyOlItemEndPrototype{}%
\def\markdownRendererOlEndPrototype{}%
\def\markdownRendererOlEndTightPrototype{}%
\def\markdownRendererFancyOlEndPrototype{\markdownRendererOlEnd}%
-\def\markdownRendererFancyOlEndTightPrototype{\markdownRendererOlEndTight}%
+\def\markdownRendererFancyOlEndTightPrototype{%
+ \markdownRendererOlEndTight}%
\def\markdownRendererDlBeginPrototype{}%
\def\markdownRendererDlBeginTightPrototype{}%
\def\markdownRendererDlItemPrototype#1{#1}%
@@ -33638,6 +34654,8 @@ end
\ExplSyntaxOff
\def\markdownRendererSectionBeginPrototype{}%
\def\markdownRendererSectionEndPrototype{}%
+\let\markdownRendererWarningPrototype\markdownWarning
+\let\markdownRendererErrorPrototype\markdownError
% \end{macrocode}
% \par
% \begin{markdown}
@@ -33652,7 +34670,7 @@ end
% \begin{macrocode}
\ExplSyntaxOn
\cs_new:Nn
- \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_inline:nn
{
\str_case:nn
{ #2 }
@@ -33662,7 +34680,7 @@ end
}
}
\cs_new:Nn
- \@@_plain_tex_default_input_raw_block_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_block:nn
{
\str_case:nn
{ #2 }
@@ -33674,14 +34692,14 @@ end
\cs_gset:Npn
\markdownRendererInputRawInlinePrototype#1#2
{
- \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_inline:nn
{ #1 }
{ #2 }
}
\cs_gset:Npn
\markdownRendererInputRawBlockPrototype#1#2
{
- \@@_plain_tex_default_input_raw_block_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_block:nn
{ #1 }
{ #2 }
}
@@ -33918,7 +34936,17 @@ end
{ #1 }
{ #2 }
}
-\def\markdownRendererJekyllDataStringPrototype#1#2{
+% \end{macrocode}
+% \par
+% \begin{markdown}
+%
+% We will process all string scalar values assuming that they may contain
+% markdown markup and are intended for typesetting.
+%
+% \end{markdown}
+% \begin{macrocode}
+\def\markdownRendererJekyllDataProgrammaticStringPrototype#1#2{}
+\def\markdownRendererJekyllDataTypographicStringPrototype#1#2{
\markdown_jekyll_data_set_keyvals:nn
{ #1 }
{ #2 }
@@ -34447,12 +35475,14 @@ end
\msg_new:nnn
{ markdown }
{ buffering-markinline }
- { Buffering~inline~markdown~input~into~the~temporary~input~file~"#1". }
+ { Buffering~inline~markdown~input~into~
+ the~temporary~input~file~"#1". }
\msg_new:nnnn
{ markdown }
{ markinline-peek-failure }
{ Use~of~\iow_char:N \\ markinline~doesn't~match~its~definition }
- { The~macro~should~be~followed~by~inline~markdown~text~in~curly~braces }
+ { The~macro~should~be~followed~by~inline~
+ markdown~text~in~curly~braces }
\ExplSyntaxOff
% \end{macrocode}
% \begin{markdown}
@@ -34471,6 +35501,13 @@ end
\markdownInput
#1
{
+ \@@_if_option:nTF
+ { frozenCache }
+ {
+ \markdownInputRaw
+ { #1 }
+ }
+ {
% \end{macrocode}
% \begin{markdown}
%
@@ -34480,19 +35517,23 @@ end
%
% \end{markdown}
% \begin{macrocode}
- \file_get_full_name:nNTF
- { #1 }
- \l_tmpa_tl
- {
- \exp_args:NV
- \markdownInputRaw
+ \tl_set:Nx
\l_tmpa_tl
- }
- {
- \msg_error:nnnV
- { markdown }
- { markdown-file-does-not-exist }
{ #1 }
+ \file_get_full_name:VNTF
+ \l_tmpa_tl
+ \l_tmpb_tl
+ {
+ \exp_args:NV
+ \markdownInputRaw
+ \l_tmpb_tl
+ }
+ {
+ \msg_error:nnV
+ { markdown }
+ { markdown-file-does-not-exist }
+ \l_tmpa_tl
+ }
}
}
\msg_new:nnn
@@ -34546,7 +35587,8 @@ end
|fi
|markdownInfo{Including markdown document number
"|the|markdownOptionFrozenCacheCounter" from frozen cache}%
- |csname markdownFrozenCache|the|markdownOptionFrozenCacheCounter|endcsname
+ |csname markdownFrozenCache%
+ |the|markdownOptionFrozenCacheCounter|endcsname
|global|advance|markdownOptionFrozenCacheCounter by 1|relax
}{%
|markdownInfo{Including markdown document "&1"}%
@@ -34770,13 +35812,26 @@ end
% we let the \mref{markdownReadAndConvert} macro process the rest of the
% \LaTeX{} environment.
%
+% We also make provision for using the \mref{markdown} command as a part of a
+% different \LaTeX{} environment as follows:
+%
+% ``` tex
+% \newenvironment{foo}\%
+% {code before \markdown[some, options]}\%
+% {\markdownEnd code after}
+% ```
+%
% \end{markdown}
% \begin{macrocode}
- \c { markdownReadAndConvert@markdown } { }
+ \c { exp_args:NV }
+ \c { markdownReadAndConvert@ }
+ \c { @currenvir }
}
{
\group_end:
- \markdownReadAndConvert@markdown { }
+ \exp_args:NV
+ \markdownReadAndConvert@
+ \@currenvir
}
}
{ \markdownEnd }
@@ -34790,7 +35845,8 @@ end
{ #1 }
\@@_setup:n
{ #1 }
- \markdownReadAndConvert@markdown *
+ \markdownReadAndConvert@
+ { markdown* }
}
{ \markdownEnd }
\msg_new:nnn
@@ -34800,6 +35856,9 @@ end
The~markdown*~LaTeX~environment~has~been~deprecated~and~will~
be~removed~in~the~next~major~version~of~the~Markdown~package.
}
+\cs_generate_variant:Nn
+ \@@_setup:n
+ { V }
\ExplSyntaxOff
\begingroup
% \end{macrocode}
@@ -34813,9 +35872,9 @@ end
% \begin{macrocode}
\catcode`\|=0\catcode`\<=1\catcode`\>=2%
\catcode`\\=12|catcode`|{=12|catcode`|}=12%
- |gdef|markdownReadAndConvert@markdown#1<%
- |markdownReadAndConvert<\end{markdown#1}>%
- <|end<markdown#1>>>%
+ |gdef|markdownReadAndConvert@#1<%
+ |markdownReadAndConvert<\end{#1}>%
+ <|end<#1>>>%
|endgroup
% \end{macrocode}
% \par
@@ -35030,7 +36089,8 @@ end
% \end{markdown}
% \begin{macrocode}
}{%
- \markdown@witiko@dot@oldRendererInputFencedCodePrototype{#1}{#2}{#3}%
+ \markdown@witiko@dot@oldRendererInputFencedCodePrototype
+ {#1}{#2}{#3}%
}%
}%
\next#2 \relax}%
@@ -35846,8 +36906,9 @@ end
\advance\markdownLaTeXCitationsCounter by 1\relax
\ifx\relax#4\relax
\ifx\relax#5\relax
- \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax
- \cite{#1#2#6}% Without prenotes and postnotes, just accumulate cites
+ \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal
+ \relax
+ \cite{#1#2#6}% No prenotes/postnotes, just accumulate cites
\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter
\@gobblethree
@@ -35857,7 +36918,8 @@ end
\cite{#1}%
\fi
\cite[#5]{#6}%
- \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax
+ \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal
+ \relax
\else
\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter
@@ -35884,7 +36946,8 @@ end
\space % Insert a space before the prenote in later citations
\fi
#4~\expandafter\cite\ifx\relax#5\relax{#6}\else[#5]{#6}\fi
- \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax
+ \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal
+ \relax
\else
\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter
@@ -35904,8 +36967,9 @@ end
\advance\markdownLaTeXCitationsCounter by 1\relax
\ifx\relax#3\relax
\ifx\relax#4\relax
- \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax
- \citep{#1,#5}% Without prenotes and postnotes, just accumulate cites
+ \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal
+ \relax
+ \citep{#1,#5}% No prenotes/postnotes, just accumulate cites
\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter
\@gobbletwo
@@ -35915,7 +36979,8 @@ end
\citep{#1}%
\fi
\citep[][#4]{#5}%
- \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax
+ \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal
+ \relax
\else
\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter
@@ -35935,7 +37000,8 @@ end
\citep{#1}%
\fi
\citep[#3][#4]{#5}%
- \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax
+ \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal
+ \relax
\else
\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter
@@ -35950,8 +37016,9 @@ end
\advance\markdownLaTeXCitationsCounter by 1\relax
\ifx\relax#3\relax
\ifx\relax#4\relax
- \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax
- \citet{#1,#5}% Without prenotes and postnotes, just accumulate cites
+ \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal
+ \relax
+ \citet{#1,#5}% No prenotes/postnotes, just accumulate cites
\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\expandafter
\@gobbletwo
@@ -35961,10 +37028,13 @@ end
\citet{#1}%
\fi
, \citet[#3][#4]{#5}%
- \ifnum\markdownLaTeXCitationsCounter<\markdownLaTeXCitationsTotal\relax
+ \ifnum\markdownLaTeXCitationsCounter<\markdownLaTeXCitationsTotal
+ \relax
,
\else
- \ifnum\markdownLaTeXCitationsCounter=\markdownLaTeXCitationsTotal\relax
+ \ifnum
+ \markdownLaTeXCitationsCounter=\markdownLaTeXCitationsTotal
+ \relax
,
\fi
\fi
@@ -35983,10 +37053,13 @@ end
\citet{#1}%
\fi
, \citet[#3][#4]{#5}%
- \ifnum\markdownLaTeXCitationsCounter<\markdownLaTeXCitationsTotal\relax
+ \ifnum\markdownLaTeXCitationsCounter<\markdownLaTeXCitationsTotal
+ \relax
,
\else
- \ifnum\markdownLaTeXCitationsCounter=\markdownLaTeXCitationsTotal\relax
+ \ifnum
+ \markdownLaTeXCitationsCounter=\markdownLaTeXCitationsTotal
+ \relax
,
\fi
\fi
@@ -36001,13 +37074,15 @@ end
% BibLaTeX implementation
\def\markdownLaTeXBibLaTeXCitations#1#2#3#4#5{%
\advance\markdownLaTeXCitationsCounter by 1\relax
- \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax
+ \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal
+ \relax
\autocites#1[#3][#4]{#5}%
\expandafter\@gobbletwo
\fi\markdownLaTeXBibLaTeXCitations{#1[#3][#4]{#5}}}
\def\markdownLaTeXBibLaTeXTextCitations#1#2#3#4#5{%
\advance\markdownLaTeXCitationsCounter by 1\relax
- \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax
+ \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal
+ \relax
\textcites#1[#3][#4]{#5}%
\expandafter\@gobbletwo
\fi\markdownLaTeXBibLaTeXTextCitations{#1[#3][#4]{#5}}}
@@ -36100,7 +37175,8 @@ end
{
\markdownLaTeXRendererAutolink { #2 } { #3 }
}{
- \markdownLaTeXRendererDirectOrIndirectLink { #1 } { #2 } { #3 } { #4 }
+ \markdownLaTeXRendererDirectOrIndirectLink
+ { #1 } { #2 } { #3 } { #4 }
}
}
\def\markdownLaTeXRendererAutolink#1#2{%
@@ -36399,13 +37475,13 @@ end
{
{ latex }
{
- \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_inline:nn
{ #1 }
{ tex }
}
}
{
- \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_inline:nn
{ #1 }
{ #2 }
}
@@ -36418,13 +37494,13 @@ end
{
{ latex }
{
- \@@_plain_tex_default_input_raw_block_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_block:nn
{ #1 }
{ tex }
}
}
{
- \@@_plain_tex_default_input_raw_block_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_block:nn
{ #1 }
{ #2 }
}
@@ -36607,7 +37683,7 @@ end
% \end{macrocode}
% \iffalse
%</context>
-%<*themes-witiko-markdown-defaults-context>
+%<*themes-witiko-markdown-defaults-ctx>
% \fi
% \par
% \begin{markdown}
@@ -36789,7 +37865,8 @@ end
\def\markdownRendererStrikeThroughPrototype#1{\overstrikes{#1}}
\def\markdownRendererSuperscriptPrototype#1{\high{#1}}
\def\markdownRendererSubscriptPrototype#1{\low{#1}}
-\def\markdownRendererDisplayMathPrototype#1{\startformula#1\stopformula}%
+\def\markdownRendererDisplayMathPrototype#1{%
+ \startformula#1\stopformula}%
% \end{macrocode}
% \par
% \begin{markdown}
@@ -36815,8 +37892,10 @@ end
\placetable{#1}{\the\markdownConTeXtTable}}%
\fi
\begingroup
- \setupTABLE[r][each][topframe=off, bottomframe=off, leftframe=off, rightframe=off]
- \setupTABLE[c][each][topframe=off, bottomframe=off, leftframe=off, rightframe=off]
+ \setupTABLE[r][each][topframe=off, bottomframe=off,
+ leftframe=off, rightframe=off]
+ \setupTABLE[c][each][topframe=off, bottomframe=off,
+ leftframe=off, rightframe=off]
\setupTABLE[r][1][topframe=on, bottomframe=on]
\setupTABLE[r][#1][bottomframe=on]
\markdownConTeXtRowCounter=0%
@@ -36854,14 +37933,16 @@ end
\fi\if#1r%
\setupTABLE[c][\the\markdownConTeXtColumnCounter][align=left]
\fi
- \ifnum\markdownConTeXtColumnCounter<\markdownConTeXtColumnTotal\relax\else
+ \ifnum\markdownConTeXtColumnCounter<\markdownConTeXtColumnTotal\relax
+ \else
\expandafter\gobbleoneargument
\fi\markdownConTeXtReadAlignments}
\def\markdownConTeXtRenderTableCell#1{%
\advance\markdownConTeXtColumnCounter by 1\relax
\markdownConTeXtTable=\expandafter{%
\the\markdownConTeXtTable\bTD#1\eTD}%
- \ifnum\markdownConTeXtColumnCounter<\markdownConTeXtColumnTotal\relax\else
+ \ifnum\markdownConTeXtColumnCounter<\markdownConTeXtColumnTotal\relax
+ \else
\expandafter\gobbleoneargument
\fi\markdownConTeXtRenderTableCell}
% \end{macrocode}
@@ -36884,13 +37965,13 @@ end
{
{ latex }
{
- \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_inline:nn
{ #1 }
{ context }
}
}
{
- \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_inline:nn
{ #1 }
{ #2 }
}
@@ -36903,13 +37984,13 @@ end
{
{ context }
{
- \@@_plain_tex_default_input_raw_block_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_block:nn
{ #1 }
{ tex }
}
}
{
- \@@_plain_tex_default_input_raw_block_renderer_prototype:nn
+ \@@_plain_tex_default_input_raw_block:nn
{ #1 }
{ #2 }
}
@@ -36923,7 +38004,7 @@ end
\protect
% \end{macrocode}
% \iffalse
-%</themes-witiko-markdown-defaults-context>
+%</themes-witiko-markdown-defaults-ctx>
%<*context>
% \fi
% \par
diff --git a/macros/generic/markdown/markdown.html b/macros/generic/markdown/markdown.html
index 81e62b2044..3f733cc73d 100644
--- a/macros/generic/markdown/markdown.html
+++ b/macros/generic/markdown/markdown.html
@@ -93,7 +93,7 @@
<header id="title-block-header">
<h1 class="title">Markdown Package User Manual</h1>
<p class="author">Vít Starý Novotný, Andrej Genčur</p>
-<p class="date">3.6.2-0-g6c30af7e 2024-07-14</p>
+<p class="date">3.7.0-0-g98dece19 2024-08-30</p>
</header>
<nav id="TOC" role="doc-toc">
<ul>
@@ -227,10 +227,10 @@ class="tex">T<sub>e</sub>X</span> distribution, you will need to install
it.</p>
<p>From <a href="https://github.com/witiko/markdown/releases"
title="Releases - witiko/markdown">Releases</a>, download <a
-href="https://github.com/witiko/markdown/releases/download/3.6.2/markdown.zip"
-title="Release 3.6.2 - witiko/markdown">an archive
+href="https://github.com/witiko/markdown/releases/download/3.7.0/markdown.zip"
+title="Release 3.7.0 - witiko/markdown">an archive
<code>markdown.zip</code> for this version of the Markdown package
-(3.6.2)</a> or a different version that you wish to install. Then, unzip
+(3.7.0)</a> or a different version that you wish to install. Then, unzip
the archive. If you downloaded an archive for a different version of the
Markdown package, you should now locate a file named
<code>markdown.html</code> with the user manual for that version, open
@@ -245,7 +245,8 @@ enter the directory named <code>markdown</code> and run the
<p>Either of the two abovelisted approaches should produce the following
files:</p>
<ul>
-<li><code>markdown.lua</code>: The Lua module</li>
+<li><code>markdown.lua</code> and <code>markdown-parser.lua</code>: The
+Lua module</li>
<li><code>libraries/markdown-tinyyaml.lua</code>: An external library
for reading <abbr>yaml</abbr></li>
<li><code>markdown-cli.lua</code>: The Lua command-line interface</li>
@@ -275,6 +276,7 @@ class="header-section-number">1.2.1</span> Local Installation</h3>
generally where the individual files should be placed:</p>
<ul>
<li><code>⟨TEXMF⟩/tex/luatex/markdown/markdown.lua</code></li>
+<li><code>⟨TEXMF⟩/tex/luatex/markdown/markdown-parser.lua</code></li>
<li><code>⟨TEXMF⟩/tex/luatex/markdown/markdown-tinyyaml.lua</code></li>
<li><code>⟨TEXMF⟩/scripts/markdown/markdown-cli.lua</code></li>
<li><code>⟨TEXMF⟩/tex/generic/markdown/markdown.tex</code></li>
@@ -302,6 +304,7 @@ them together. This way your document can be portably typeset on legacy
<p>This is where the individual files should be placed:</p>
<ul>
<li><code>./markdown.lua</code></li>
+<li><code>./markdown-parser.lua</code></li>
<li><code>./markdown-tinyyaml.lua</code></li>
<li><code>./markdown-cli.lua</code></li>
<li><code>./markdown/markdown.tex</code></li>
@@ -770,8 +773,8 @@ accepts the same options as the plain <span
class="tex">T<sub>e</sub>X</span> interface, but now the options are
specified as ⟨<em>key</em>⟩<span
class="math inline"> = </span>⟨<em>value</em>⟩ pairs and they are passed
-either as package options, in the <code>\markdownSetup</code> command,
-or as parameters for the <code>markdown*</code> <span
+either as package options, in the <code>markdownSetup</code> command, or
+as parameters for the <code>markdown*</code> <span
class="latex">L<sup>a</sup>T<sub>e</sub>X</span> environment.</p>
<p>Using a text editor, create a text document named
<code>document.tex</code> with the following content:</p>
@@ -858,19 +861,22 @@ class="tex">T<sub>e</sub>X</span>t interfaces.</p>
class="header-section-number">2.2.1.1</span> Option
<code>eagerCache</code></h4>
<dl>
-<dt><code>eagerCache</code> (default value: <code>false</code>)</dt>
+<dt><code>eagerCache</code> (default value: <code>true</code>)</dt>
<dd>
<dl>
<dt>true</dt>
<dd>
<p>Converted markdown documents will be cached in
-<strong><code>cacheDir</code></strong>. This can be useful for
+<code><strong>cacheDir</strong></code>. This can be useful for
post-processing the converted documents and for recovering historical
-versions of the documents from the cache. However, it also produces a
-large number of auxiliary files on the disk and obscures the output of
-the Lua command-line interface when it is used for plumbing.</p>
+versions of the documents from the cache. Furthermore, it can also
+significantly improve the processing speed for documents that require
+multiple compilation runs, since each markdown document is only
+converted once. However, it also produces a large number of auxiliary
+files on the disk and obscures the output of the Lua command-line
+interface when it is used for plumbing.</p>
<p>This behavior will always be used if the
-<strong><code>finalizeCache</code></strong> option is enabled.</p>
+<code><strong>finalizeCache</strong></code> option is enabled.</p>
</dd>
</dl>
</dd>
@@ -880,9 +886,14 @@ the Lua command-line interface when it is used for plumbing.</p>
<dd>
<p>Converted markdown documents will not be cached. This decreases the
number of auxiliary files that we produce and makes it easier to use the
-Lua command-line interface for plumbing.</p>
+Lua command-line interface for plumbing. However, it makes it impossible
+to post-process the converted documents and recover historical versions
+of the documents from the cache. Furthermore, it can significantly
+reduce the processing speed for documents that require multiple
+compilation runs, since each markdown document is converted multiple
+times needlessly.</p>
<p>This behavior will only be used when the
-<strong><code>finalizeCache</code></strong> option is disabled.</p>
+<code><strong>finalizeCache</strong></code> option is disabled.</p>
</dd>
</dl>
</dd>
@@ -893,7 +904,7 @@ Lua command-line interface for plumbing.</p>
<div class="sourceCode" id="cb46"><pre
class="sourceCode md"><code class="sourceCode markdown"><span id="cb46-1"><a href="#cb46-1" aria-hidden="true" tabindex="-1"></a>Hello *world*!</span></code></pre></div>
<p>Next, invoke LuaTeX from the terminal with the
-<strong><code>eagerCache</code></strong> option disabled:</p>
+<code><strong>eagerCache</strong></code> option disabled:</p>
<div class="sourceCode" id="cb47"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb47-1"><a href="#cb47-1" aria-hidden="true" tabindex="-1"></a><span class="ex">texlua</span> ⟨CLI pathname⟩ eagerCache=false <span class="at">--</span> hello.md hello.tex</span></code></pre></div>
<p>where ⟨<em>CLI pathname</em>⟩ corresponds to the location of the Lua
@@ -912,7 +923,7 @@ code:</p>
class="sourceCode tex"><code class="sourceCode latex"><span id="cb48-1"><a href="#cb48-1" aria-hidden="true" tabindex="-1"></a>Hello <span class="fu">\markdownRendererEmphasis</span>{world}!<span class="fu">\relax</span></span></code></pre></div>
<hr />
<p>Invoke LuaTeX from the terminal again, this time with the
-<strong><code>eagerCache</code></strong> option enabled:</p>
+<code><strong>eagerCache</strong></code> option enabled:</p>
<div class="sourceCode" id="cb49"><pre
class="sourceCode tex"><code class="sourceCode latex"><span id="cb49-1"><a href="#cb49-1" aria-hidden="true" tabindex="-1"></a>texlua ⟨CLI pathname⟩ eagerCache=true -- hello.md hello.tex</span></code></pre></div>
<p>A <span class="tex">T<sub>e</sub>X</span> document named
@@ -935,7 +946,7 @@ class="header-section-number">2.2.1.2</span> Option
<dt>true</dt>
<dd>
<p>Conversion functions produced by the function
-\luamref{new}<code>(options)</code> will be cached in an LRU cache of
+<code>new</code><code>(options)</code> will be cached in an LRU cache of
size 1 keyed by <code>options</code>. This is more time- and
space-efficient than always producing a new conversion function but may
expose bugs related to the idempotence of conversion functions.</p>
@@ -948,11 +959,12 @@ Markdown package.</p>
<dl>
<dt>false</dt>
<dd>
-<p>Every call to the function \luamref{new}<code>(options)</code> will
-produce a new conversion function that will not be cached. This is
+<p>Every call to the function <code>new</code><code>(options)</code>
+will produce a new conversion function that will not be cached. This is
slower than caching conversion functions and may expose bugs related to
-memory leaks in the creation of conversion functions, see also issue <a
-href="https://github.com/witiko/markdown/pull/226#issuecomment-1599641634">#226</a>.</p>
+memory leaks in the creation of conversion functions, see also <a
+href="https://github.com/witiko/markdown/pull/226#issuecomment-1599641634">#226
+(comment)</a>.</p>
<p>This was the default behavior until version 3.0.0 of the Markdown
package.</p>
</dd>
@@ -1003,7 +1015,7 @@ class="header-section-number">2.2.1.3</span> Option
href="https://unicode.org/faq/normalization.html">Unicode normalization
forms</a> before conversion. The Unicode normalization norm used is
determined by option
-<strong><code>unicodeNormalizationForm</code></strong>.</p>
+<code><strong>unicodeNormalizationForm</strong></code>.</p>
</dd>
</dl>
</dd>
@@ -1027,7 +1039,7 @@ class="header-section-number">2.2.1.4</span> Option
<dl>
<dt>nfc</dt>
<dd>
-<p>When option <strong><code>unicodeNormalization</code></strong> has
+<p>When option <code><strong>unicodeNormalization</strong></code> has
been enabled, markdown documents will be normalized using Unicode
Normalization Form C (NFC) before conversion.</p>
</dd>
@@ -1037,7 +1049,7 @@ Normalization Form C (NFC) before conversion.</p>
<dl>
<dt>nfd</dt>
<dd>
-<p>When option <strong><code>unicodeNormalization</code></strong> has
+<p>When option <code><strong>unicodeNormalization</strong></code> has
been enabled, markdown documents will be normalized using Unicode
Normalization Form D (NFD) before conversion.</p>
</dd>
@@ -1047,7 +1059,7 @@ Normalization Form D (NFD) before conversion.</p>
<dl>
<dt>nfkc</dt>
<dd>
-<p>When option <strong><code>unicodeNormalization</code></strong> has
+<p>When option <code><strong>unicodeNormalization</strong></code> has
been enabled, markdown documents will be normalized using Unicode
Normalization Form KC (NFKC) before conversion.</p>
</dd>
@@ -1057,7 +1069,7 @@ Normalization Form KC (NFKC) before conversion.</p>
<dl>
<dt>nfkd</dt>
<dd>
-<p>When option <strong><code>unicodeNormalization</code></strong> has
+<p>When option <code><strong>unicodeNormalization</strong></code> has
been enabled, markdown documents will be normalized using Unicode
Normalization Form KD (NFKD) before conversion.</p>
</dd>
@@ -1206,7 +1218,7 @@ class="header-section-number">2.2.1.6</span> Option
<dd>
<p>The filename of the <abbr>JSON</abbr> file that maps filename
extensions to programming language names in the iA Writer content blocks
-when the <strong><code>contentBlocks</code></strong> option is
+when the <code><strong>contentBlocks</strong></code> option is
enabled.</p>
</dd>
</dl>
@@ -1370,13 +1382,13 @@ class="header-section-number">2.2.1.7</span> Option
<code>"debug-extensions.json"</code>)</dt>
<dd>
<p>The filename of the <abbr>JSON</abbr> file that will be produced when
-the <strong><code>debugExtensions</code></strong> option is enabled.
+the <code><strong>debugExtensions</strong></code> option is enabled.
This file will contain the extensible subset of the <abbr>peg</abbr>
grammar of markdown after built-in syntax extensions (see options
-<strong><code>citations</code></strong>,
-<strong><code>contentBlocks</code></strong>,
-<strong><code>definitionLists</code></strong>, etc.) and user-defined
-syntax extensions (see option <strong><code>extensions</code></strong>)
+<code><strong>citations</strong></code>,
+<code><strong>contentBlocks</strong></code>,
+<code><strong>definitionLists</strong></code>, etc.) and user-defined
+syntax extensions (see option <code><strong>extensions</strong></code>)
have been applied.</p>
</dd>
</dl>
@@ -1388,13 +1400,13 @@ class="header-section-number">2.2.1.8</span> Option
<code>"frozenCache.tex"</code>)</dt>
<dd>
<p>A path to an output file (frozen cache) that will be created when the
-<strong><code>finalizeCache</code></strong> option is enabled and will
+<code><strong>finalizeCache</strong></code> option is enabled and will
contain a mapping between an enumeration of markdown documents and their
auxiliary cache files.</p>
<p>The frozen cache makes it possible to later typeset a plain <span
class="tex">T<sub>e</sub>X</span> document that contains markdown
documents without invoking Lua using the
-<strong><code>frozenCache</code></strong> plain <span
+<code><strong>frozenCache</strong></code> plain <span
class="tex">T<sub>e</sub>X</span> option. As a result, the plain <span
class="tex">T<sub>e</sub>X</span> document becomes more portable, but
further changes in the order and the content of markdown documents will
@@ -1611,7 +1623,7 @@ class="sourceCode md"><code class="sourceCode markdown"><span id="cb96-1"><a hre
</dd>
</dl>
<p>See also the option
-<strong><code>gfmAutoIdentifiers</code></strong>.</p>
+<code><strong>gfmAutoIdentifiers</strong></code>.</p>
<h4 data-number="2.2.1.10" id="option-blankbeforeblockquote"><span
class="header-section-number">2.2.1.10</span> Option
<code>blankBeforeBlockquote</code></h4>
@@ -3385,13 +3397,13 @@ class="header-section-number">2.2.1.22</span> Option
<dd>
<p>Produce a <abbr>JSON</abbr> file that will contain the extensible
subset of the <abbr>peg</abbr> grammar of markdown after built-in syntax
-extensions (see options <strong><code>citations</code></strong>,
-<strong><code>contentBlocks</code></strong>,
-<strong><code>definitionLists</code></strong>, etc.) and user-defined
-syntax extensions (see option <strong><code>extensions</code></strong>)
+extensions (see options <code><strong>citations</strong></code>,
+<code><strong>contentBlocks</strong></code>,
+<code><strong>definitionLists</strong></code>, etc.) and user-defined
+syntax extensions (see option <code><strong>extensions</strong></code>)
have been applied. This helps you to see how the different extensions
interact. The name of the produced <abbr>JSON</abbr> file is controlled
-by the <strong><code>debugExtensionsFileName</code></strong> option.</p>
+by the <code><strong>debugExtensionsFileName</strong></code> option.</p>
</dd>
</dl>
</dd>
@@ -3613,8 +3625,39 @@ contain the following text:</p>
</dd>
</dl>
</blockquote>
-<h4 data-number="2.2.1.24" id="option-expectjekylldata"><span
+<h4 data-number="2.2.1.24" id="option-ensurejekylldata"><span
class="header-section-number">2.2.1.24</span> Option
+<code>ensureJekyllData</code></h4>
+<dl>
+<dt><code>ensureJekyllData</code> (default value:
+<code>false</code>)</dt>
+<dd>
+<dl>
+<dt>false</dt>
+<dd>
+<p>When the <code><strong>jekyllData</strong></code> and
+<code><strong>expectJekyllData</strong></code> options are enabled, then
+a markdown document may begin directly with <abbr>yaml</abbr> metadata
+and may contain nothing but <abbr>yaml</abbr> metadata. Otherwise, the
+markdown document is processed as markdown text.</p>
+</dd>
+</dl>
+</dd>
+<dd>
+<dl>
+<dt>true</dt>
+<dd>
+<p>When the <code><strong>jekyllData</strong></code> and
+<code><strong>expectJekyllData</strong></code> options are enabled, then
+a markdown document must begin directly with <abbr>yaml</abbr> metadata
+and must contain nothing but <abbr>yaml</abbr> metadata. Otherwise, an
+error is produced.</p>
+</dd>
+</dl>
+</dd>
+</dl>
+<h4 data-number="2.2.1.25" id="option-expectjekylldata"><span
+class="header-section-number">2.2.1.25</span> Option
<code>expectJekyllData</code></h4>
<dl>
<dt><code>expectJekyllData</code> (default value:
@@ -3623,7 +3666,7 @@ class="header-section-number">2.2.1.24</span> Option
<dl>
<dt>false</dt>
<dd>
-<p>When the <strong><code>jekyllData</code></strong> option is enabled,
+<p>When the <code><strong>jekyllData</strong></code> option is enabled,
then a markdown document may begin with <abbr>yaml</abbr> metadata if
and only if the metadata begin with the end-of-directives marker
(<code>---</code>) and they end with either the end-of-directives or the
@@ -3655,7 +3698,7 @@ class="sourceCode latex"><code class="sourceCode latex"><span id="cb216-1"><a hr
<dl>
<dt>true</dt>
<dd>
-<p>When the <strong><code>jekyllData</code></strong> option is enabled,
+<p>When the <code><strong>jekyllData</strong></code> option is enabled,
then a markdown document may begin directly with <abbr>yaml</abbr>
metadata and may contain nothing but <abbr>yaml</abbr> metadata.</p>
<div class="sourceCode" id="cb217"><pre
@@ -3713,14 +3756,14 @@ contain the following text:</p>
<blockquote>
<p>Jane Doe is 99 years old.</p>
</blockquote>
-<h4 data-number="2.2.1.25" id="option-extensions"><span
-class="header-section-number">2.2.1.25</span> Option
+<h4 data-number="2.2.1.26" id="option-extensions"><span
+class="header-section-number">2.2.1.26</span> Option
<code>extensions</code></h4>
<dl>
<dt><code>extensions</code> (default value: <code>{}</code>)</dt>
<dd>
<p>The filenames of user-defined syntax extensions that will be applied
-to the markdown reader. If the <strong><code>kpathsea</code></strong>
+to the markdown reader. If the <code><strong>kpathsea</strong></code>
library is available, files will be searched for not only in the current
working directory but also in the <span
class="tex">T<sub>e</sub>X</span> directory structure.</p>
@@ -3773,8 +3816,8 @@ contain the following text:</p>
<blockquote>
<p>This is <del>a lunar roving vehicle</del> strike-through text.</p>
</blockquote>
-<h4 data-number="2.2.1.26" id="option-fancylists"><span
-class="header-section-number">2.2.1.26</span> Option
+<h4 data-number="2.2.1.27" id="option-fancylists"><span
+class="header-section-number">2.2.1.27</span> Option
<code>fancyLists</code></h4>
<dl>
<dt><code>fancyLists</code> (default value: <code>false</code>)</dt>
@@ -3854,8 +3897,8 @@ contain the following text:</p>
<li>third item</li>
</ol>
</blockquote>
-<h4 data-number="2.2.1.27" id="option-fencedcode"><span
-class="header-section-number">2.2.1.27</span> Option
+<h4 data-number="2.2.1.28" id="option-fencedcode"><span
+class="header-section-number">2.2.1.28</span> Option
<code>fencedCode</code></h4>
<dl>
<dt><code>fencedCode</code> (default value: <code>true</code>)</dt>
@@ -3990,8 +4033,8 @@ class="sourceCode html"><code class="sourceCode html"><span id="cb237-1"><a href
<span id="cb237-7"><a href="#cb237-7" aria-hidden="true" tabindex="-1"></a> <span class="dt">&lt;/</span><span class="kw">code</span><span class="dt">&gt;</span></span>
<span id="cb237-8"><a href="#cb237-8" aria-hidden="true" tabindex="-1"></a><span class="dt">&lt;/</span><span class="kw">pre</span><span class="dt">&gt;</span></span></code></pre></div>
</blockquote>
-<h4 data-number="2.2.1.28" id="option-fencedcodeattributes"><span
-class="header-section-number">2.2.1.28</span> Option
+<h4 data-number="2.2.1.29" id="option-fencedcodeattributes"><span
+class="header-section-number">2.2.1.29</span> Option
<code>fencedCodeAttributes</code></h4>
<dl>
<dt><code>fencedCodeAttributes</code> (default value:
@@ -4067,8 +4110,8 @@ class="sourceCode js linenos"><code class="sourceCode javascript"><span id="cb24
<span id="cb241-2"><a href="#cb241-2" aria-hidden="true" tabindex="-1"></a><span class="fl">2.</span> <span class="fu">moveShip</span>(<span class="dv">5</span> <span class="op">*</span> gravity<span class="op">,</span> DOWN)<span class="op">;</span></span>
<span id="cb241-3"><a href="#cb241-3" aria-hidden="true" tabindex="-1"></a><span class="fl">3.</span> }</span></code></pre></div>
</blockquote>
-<h4 data-number="2.2.1.29" id="fenced-divs"><span
-class="header-section-number">2.2.1.29</span> Option
+<h4 data-number="2.2.1.30" id="fenced-divs"><span
+class="header-section-number">2.2.1.30</span> Option
<code>fencedDivs</code></h4>
<dl>
<dt><code>fencedDivs</code> (default value: <code>false</code>)</dt>
@@ -4123,20 +4166,20 @@ contain the following text:</p>
<blockquote>
<p>Here is a special paragraph.</p>
</blockquote>
-<h4 data-number="2.2.1.30" id="option-finalizecache"><span
-class="header-section-number">2.2.1.30</span> Option
+<h4 data-number="2.2.1.31" id="option-finalizecache"><span
+class="header-section-number">2.2.1.31</span> Option
<code>finalizeCache</code></h4>
<dl>
<dt><code>finalizeCache</code> (default value: <code>false</code>)</dt>
<dd>
<p>Whether an output file specified with the
-<strong><code>frozenCacheFileName</code></strong> option (frozen cache)
+<code><strong>frozenCacheFileName</strong></code> option (frozen cache)
that contains a mapping between an enumeration of markdown documents and
their auxiliary cache files will be created.</p>
<p>The frozen cache makes it possible to later typeset a plain <span
class="tex">T<sub>e</sub>X</span> document that contains markdown
documents without invoking Lua using the
-<strong><code>frozenCache</code></strong> plain <span
+<code><strong>frozenCache</strong></code> plain <span
class="tex">T<sub>e</sub>X</span> option. As a result, the plain <span
class="tex">T<sub>e</sub>X</span> document becomes more portable, but
further changes in the order and the content of markdown documents will
@@ -4255,15 +4298,15 @@ contents of the frozen cache using the
the document without accessing the shell or invoking Lua, but the change
in the content of the markdown document from “Hello <em>world</em>!” to
“Hi <em>world</em>!” was not reflected.</p>
-<h4 data-number="2.2.1.31" id="option-frozencachecounter"><span
-class="header-section-number">2.2.1.31</span> Option
+<h4 data-number="2.2.1.32" id="option-frozencachecounter"><span
+class="header-section-number">2.2.1.32</span> Option
<code>frozenCacheCounter</code></h4>
<dl>
<dt><code>frozenCacheCounter</code> (default value: <code>0</code>)</dt>
<dd>
<p>The number of the current markdown document that will be stored in an
output file (frozen cache) when the
-<strong><code>finalizeCache</code></strong> is enabled. When the
+<code><strong>finalizeCache</strong></code> is enabled. When the
document number is 0, then a new frozen cache will be created.
Otherwise, the frozen cache will be appended.</p>
<p>Each frozen cache entry will define a <span
@@ -4296,8 +4339,8 @@ class="sourceCode sh"><code class="sourceCode bash"><span id="cb258-1"><a href="
contain the text “Hello <em>world</em>!” A frozen cache with two entries
will also be produced as we requested using the
<code>frozenCacheCounter</code> option.</p>
-<h4 data-number="2.2.1.32" id="option-gfmautoidentifiers"><span
-class="header-section-number">2.2.1.32</span> Option
+<h4 data-number="2.2.1.33" id="option-gfmautoidentifiers"><span
+class="header-section-number">2.2.1.33</span> Option
<code>gfmAutoIdentifiers</code></h4>
<dl>
<dt><code>gfmAutoIdentifiers</code> (default value:
@@ -4323,9 +4366,9 @@ extension.</p>
</dd>
</dl>
<p>See also the option
-<strong><code>autoIdentifiers</code></strong>.</p>
-<h4 data-number="2.2.1.33" id="option-hashenumerators"><span
-class="header-section-number">2.2.1.33</span> Option
+<code><strong>autoIdentifiers</strong></code>.</p>
+<h4 data-number="2.2.1.34" id="option-hashenumerators"><span
+class="header-section-number">2.2.1.34</span> Option
<code>hashEnumerators</code></h4>
<dl>
<dt><code>hashEnumerators</code> (default value:
@@ -4427,8 +4470,8 @@ contain the following text:</p>
<li>Parish</li>
</ol>
</blockquote>
-<h4 data-number="2.2.1.34" id="header-attributes"><span
-class="header-section-number">2.2.1.34</span> Option
+<h4 data-number="2.2.1.35" id="header-attributes"><span
+class="header-section-number">2.2.1.35</span> Option
<code>headerAttributes</code></h4>
<dl>
<dt><code>headerAttributes</code> (default value:
@@ -4457,8 +4500,8 @@ class="sourceCode md"><code class="sourceCode markdown"><span id="cb265-1"><a hr
</dl>
</dd>
</dl>
-<h4 data-number="2.2.1.35" id="option-html"><span
-class="header-section-number">2.2.1.35</span> Option
+<h4 data-number="2.2.1.36" id="option-html"><span
+class="header-section-number">2.2.1.36</span> Option
<code>html</code></h4>
<dl>
<dt><code>html</code> (default value: <code>true</code>)</dt>
@@ -4695,8 +4738,8 @@ comment –&gt; support. There is no &lt;? HTML instruction ?&gt;
support.</p>
<p>There is support. There is support. There is support.</p>
</blockquote>
-<h4 data-number="2.2.1.36" id="option-hybrid"><span
-class="header-section-number">2.2.1.36</span> Option
+<h4 data-number="2.2.1.37" id="option-hybrid"><span
+class="header-section-number">2.2.1.37</span> Option
<code>hybrid</code></h4>
<dl>
<dt><code>hybrid</code> (default value: <code>false</code>)</dt>
@@ -4887,8 +4930,8 @@ contain the following text:</p>
<p><math><msqrt><mo>−</mo><mn>1</mn></msqrt></math> <em>equals</em>
<math><mi>i</mi></math>.</p>
</blockquote>
-<h4 data-number="2.2.1.37" id="option-inlinecodeattributes"><span
-class="header-section-number">2.2.1.37</span> Option
+<h4 data-number="2.2.1.38" id="option-inlinecodeattributes"><span
+class="header-section-number">2.2.1.38</span> Option
<code>inlineCodeAttributes</code></h4>
<dl>
<dt><code>inlineCodeAttributes</code> (default value:
@@ -4962,8 +5005,8 @@ contain the following text:</p>
<p>Here is some <span
style="color: red"><code>colored text</code></span>.</p>
</blockquote>
-<h4 data-number="2.2.1.38" id="option-inlinenotes"><span
-class="header-section-number">2.2.1.38</span> Option
+<h4 data-number="2.2.1.39" id="option-inlinenotes"><span
+class="header-section-number">2.2.1.39</span> Option
<code>inlineNotes</code></h4>
<dl>
<dt><code>inlineNotes</code> (default value: <code>false</code>)</dt>
@@ -5036,8 +5079,8 @@ contain the following text:</p>
<p>Here is an inline note.<a href="#fn2" class="footnote-ref"
id="fnref2" role="doc-noteref"><sup>2</sup></a></p>
</blockquote>
-<h4 data-number="2.2.1.39" id="option-jekylldata"><span
-class="header-section-number">2.2.1.39</span> Option
+<h4 data-number="2.2.1.40" id="option-jekylldata"><span
+class="header-section-number">2.2.1.40</span> Option
<code>jekyllData</code></h4>
<dl>
<dt><code>jekyllData</code> (default value: <code>false</code>)</dt>
@@ -5175,8 +5218,8 @@ contain the following text:</p>
<blockquote>
<p>Jane Doe is 99 years old.</p>
</blockquote>
-<h4 data-number="2.2.1.40" id="option-linkattributes"><span
-class="header-section-number">2.2.1.40</span> Option
+<h4 data-number="2.2.1.41" id="option-linkattributes"><span
+class="header-section-number">2.2.1.41</span> Option
<code>linkAttributes</code></h4>
<dl>
<dt><code>linkAttributes</code> (default value: <code>false</code>)</dt>
@@ -5247,8 +5290,8 @@ class="sourceCode sh"><code class="sourceCode bash"><span id="cb305-1"><a href="
contain an example image (from <a href="https://ctan.org/pkg/mwe"
title="mwe – Packages and image files for MWEs">Martin Scharrer’s mwe
package</a>) displayed at size 5cm × 4cm.</p>
-<h4 data-number="2.2.1.41" id="option-lineblocks"><span
-class="header-section-number">2.2.1.41</span> Option
+<h4 data-number="2.2.1.42" id="option-lineblocks"><span
+class="header-section-number">2.2.1.42</span> Option
<code>lineBlocks</code></h4>
<dl>
<dt><code>lineBlocks</code> (default value: <code>false</code>)</dt>
@@ -5354,8 +5397,8 @@ But I, being poor, have only my dreams;<br />
I have spread my dreams under your feet;<br />
Tread softly because you tread on my dreams.</div>
</blockquote>
-<h4 data-number="2.2.1.42" id="option-mark"><span
-class="header-section-number">2.2.1.42</span> Option
+<h4 data-number="2.2.1.43" id="option-mark"><span
+class="header-section-number">2.2.1.43</span> Option
<code>mark</code></h4>
<dl>
<dt><code>mark</code> (default value: <code>false</code>)</dt>
@@ -5402,8 +5445,8 @@ contain the following text:</p>
<blockquote>
<p>This <mark>is highlighted text.</mark></p>
</blockquote>
-<h4 data-number="2.2.1.43" id="option-notes"><span
-class="header-section-number">2.2.1.43</span> Option
+<h4 data-number="2.2.1.44" id="option-notes"><span
+class="header-section-number">2.2.1.44</span> Option
<code>notes</code></h4>
<dl>
<dt><code>notes</code> (default value: <code>false</code>)</dt>
@@ -5534,8 +5577,8 @@ work like multi-paragraph list items.</code></pre>
<p>This paragraph won’t be part of the note, because it isn’t
indented.</p>
</blockquote>
-<h4 data-number="2.2.1.44" id="pipe-tables"><span
-class="header-section-number">2.2.1.44</span> Option
+<h4 data-number="2.2.1.45" id="pipe-tables"><span
+class="header-section-number">2.2.1.45</span> Option
<code>pipeTables</code></h4>
<dl>
<dt><code>pipeTables</code> (default value: <code>false</code>)</dt>
@@ -5669,8 +5712,8 @@ contain the following text:</p>
</tbody>
</table>
</blockquote>
-<h4 data-number="2.2.1.45" id="option-preservetabs"><span
-class="header-section-number">2.2.1.45</span> Option
+<h4 data-number="2.2.1.46" id="option-preservetabs"><span
+class="header-section-number">2.2.1.46</span> Option
<code>preserveTabs</code></h4>
<dl>
<dt><code>preserveTabs</code> (default value: <code>true</code>)</dt>
@@ -5691,8 +5734,8 @@ class="header-section-number">2.2.1.45</span> Option
</dl>
</dd>
</dl>
-<h4 data-number="2.2.1.46" id="option-rawattribute"><span
-class="header-section-number">2.2.1.46</span> Option
+<h4 data-number="2.2.1.47" id="option-rawattribute"><span
+class="header-section-number">2.2.1.47</span> Option
<code>rawAttribute</code></h4>
<dl>
<dt><code>rawAttribute</code> (default value: <code>false</code>)</dt>
@@ -5705,7 +5748,7 @@ href="https://pandoc.org/MANUAL.html#extension-raw_attribute">raw
attribute syntax extension</a>:</p>
<div class="sourceCode" id="cb330"><pre
class="sourceCode md"><code class="sourceCode markdown"><span id="cb330-1"><a href="#cb330-1" aria-hidden="true" tabindex="-1"></a><span class="in">`$H_2 O$`</span>{=tex} is a liquid.</span></code></pre></div>
-<p>To enable raw blocks, the <strong><code>fencedCode</code></strong>
+<p>To enable raw blocks, the <code><strong>fencedCode</strong></code>
option must also be enabled:</p>
<div class="sourceCode" id="cb331"><pre
class="sourceCode md"><code class="sourceCode markdown"><span id="cb331-1"><a href="#cb331-1" aria-hidden="true" tabindex="-1"></a><span class="an">Here is a mathematical formula:</span></span>
@@ -5717,10 +5760,10 @@ class="sourceCode md"><code class="sourceCode markdown"><span id="cb331-1"><a hr
<span id="cb331-7"><a href="#cb331-7" aria-hidden="true" tabindex="-1"></a><span class="in"> \end{dcases}</span></span>
<span id="cb331-8"><a href="#cb331-8" aria-hidden="true" tabindex="-1"></a><span class="in">\]</span></span>
<span id="cb331-9"><a href="#cb331-9" aria-hidden="true" tabindex="-1"></a><span class="in">```</span></span></code></pre></div>
-<p>The <strong><code>rawAttribute</code></strong> option is a good
-alternative to the <strong><code>hybrid</code></strong> option. Unlike
-the <strong><code>hybrid</code></strong> option, which affects the
-entire document, the <strong><code>rawAttribute</code></strong> option
+<p>The <code><strong>rawAttribute</strong></code> option is a good
+alternative to the <code><strong>hybrid</strong></code> option. Unlike
+the <code><strong>hybrid</strong></code> option, which affects the
+entire document, the <code><strong>rawAttribute</strong></code> option
allows you to isolate the parts of your documents that use TeX:</p>
</dd>
</dl>
@@ -5759,8 +5802,8 @@ contain the following text:</p>
<blockquote>
<p>H<sub>2</sub>O is a liquid.</p>
</blockquote>
-<h4 data-number="2.2.1.47" id="option-relativereferences"><span
-class="header-section-number">2.2.1.47</span> Option
+<h4 data-number="2.2.1.48" id="option-relativereferences"><span
+class="header-section-number">2.2.1.48</span> Option
<code>relativeReferences</code></h4>
<dl>
<dt><code>relativeReferences</code> (default value:
@@ -5824,8 +5867,8 @@ contain the following text:</p>
<p>In this paper, we have discovered that most grandmas would rather eat
dinner with their grandchildren than get eaten. Begone, wolf!</p>
</blockquote>
-<h4 data-number="2.2.1.48" id="option-shiftheadings"><span
-class="header-section-number">2.2.1.48</span> Option
+<h4 data-number="2.2.1.49" id="option-shiftheadings"><span
+class="header-section-number">2.2.1.49</span> Option
<code>shiftHeadings</code></h4>
<dl>
<dt><code>shiftHeadings</code> (default value: <code>0</code>)</dt>
@@ -5926,8 +5969,8 @@ contain the following text:</p>
<h2 id="a-section-7">A section</h2>
<h3 id="a-section-8">A section</h3>
</blockquote>
-<h4 data-number="2.2.1.49" id="option-slice"><span
-class="header-section-number">2.2.1.49</span> Option
+<h4 data-number="2.2.1.50" id="option-slice"><span
+class="header-section-number">2.2.1.50</span> Option
<code>slice</code></h4>
<dl>
<dt><code>slice</code> (default value: <code>^ $</code>)</dt>
@@ -6094,8 +6137,8 @@ contain the following text:</p>
<h2 id="act-v-2">Act V</h2>
<p>Hamlet dies.</p>
</blockquote>
-<h4 data-number="2.2.1.50" id="option-smartellipses"><span
-class="header-section-number">2.2.1.50</span> Option
+<h4 data-number="2.2.1.51" id="option-smartellipses"><span
+class="header-section-number">2.2.1.51</span> Option
<code>smartEllipses</code></h4>
<dl>
<dt><code>smartEllipses</code> (default value: <code>false</code>)</dt>
@@ -6104,7 +6147,7 @@ class="header-section-number">2.2.1.50</span> Option
<dt>true</dt>
<dd>
<p>Convert any ellipses in the input to the
-<code>\markdownRendererEllipsis</code> <span
+<code>markdownRendererEllipsis</code> <span
class="tex">T<sub>e</sub>X</span> macro.</p>
</dd>
</dl>
@@ -6278,8 +6321,8 @@ contain the following text:</p>
<p>These are just three regular dots …</p>
<p>. . . and this is a victorian ellipsis.</p>
</blockquote>
-<h4 data-number="2.2.1.51" id="option-startnumber"><span
-class="header-section-number">2.2.1.51</span> Option
+<h4 data-number="2.2.1.52" id="option-startnumber"><span
+class="header-section-number">2.2.1.52</span> Option
<code>startNumber</code></h4>
<dl>
<dt><code>startNumber</code> (default value: <code>true</code>)</dt>
@@ -6289,7 +6332,7 @@ class="header-section-number">2.2.1.51</span> Option
<dd>
<p>Make the number in the first item of an ordered lists significant.
The item numbers will be passed to the
-<code>\markdownRendererOlItemWithNumber</code> <span
+<code>markdownRendererOlItemWithNumber</code> <span
class="tex">T<sub>e</sub>X</span> macro.</p>
</dd>
</dl>
@@ -6299,7 +6342,7 @@ class="tex">T<sub>e</sub>X</span> macro.</p>
<dt>false</dt>
<dd>
<p>Ignore the numbers in the ordered list items. Each item will only
-produce a <code>\markdownRendererOlItem</code> <span
+produce a <code>markdownRendererOlItem</code> <span
class="tex">T<sub>e</sub>X</span> macro.</p>
</dd>
</dl>
@@ -6397,8 +6440,8 @@ markup:</p>
<li>fifth item</li>
</ol>
</blockquote>
-<h4 data-number="2.2.1.52" id="option-strikethrough"><span
-class="header-section-number">2.2.1.52</span> Option
+<h4 data-number="2.2.1.53" id="option-strikethrough"><span
+class="header-section-number">2.2.1.53</span> Option
<code>strikeThrough</code></h4>
<dl>
<dt><code>strikeThrough</code> (default value: <code>false</code>)</dt>
@@ -6491,8 +6534,8 @@ contain the following text:</p>
<blockquote>
<p>This is <del>a lunar roving vehicle</del> strike-through text.</p>
</blockquote>
-<h4 data-number="2.2.1.53" id="option-stripindent"><span
-class="header-section-number">2.2.1.53</span> Option
+<h4 data-number="2.2.1.54" id="option-stripindent"><span
+class="header-section-number">2.2.1.54</span> Option
<code>stripIndent</code></h4>
<dl>
<dt><code>stripIndent</code> (default value: <code>false</code>)</dt>
@@ -6502,7 +6545,7 @@ class="header-section-number">2.2.1.53</span> Option
<dd>
<p>Strip the minimal indentation of non-blank lines from all lines in a
markdown document. Requires that the
-<strong><code>preserveTabs</code></strong> Lua option is disabled:</p>
+<code><strong>preserveTabs</strong></code> Lua option is disabled:</p>
<div class="sourceCode" id="cb375"><pre
class="sourceCode tex"><code class="sourceCode latex"><span id="cb375-1"><a href="#cb375-1" aria-hidden="true" tabindex="-1"></a><span class="bu">\documentclass</span>{<span class="ex">article</span>}</span>
<span id="cb375-2"><a href="#cb375-2" aria-hidden="true" tabindex="-1"></a><span class="bu">\usepackage</span>[stripIndent]{<span class="ex">markdown</span>}</span>
@@ -6574,8 +6617,8 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb380-1"><a href
class="sourceCode sh"><code class="sourceCode bash"><span id="cb381-1"><a href="#cb381-1" aria-hidden="true" tabindex="-1"></a><span class="ex">context</span> <span class="at">--luatex</span> document.tex</span></code></pre></div>
<p>A PDF document named <code>document.pdf</code> should be produced and
contain the text “Hello <em>world</em>!”</p>
-<h4 data-number="2.2.1.54" id="option-subscripts"><span
-class="header-section-number">2.2.1.54</span> Option
+<h4 data-number="2.2.1.55" id="option-subscripts"><span
+class="header-section-number">2.2.1.55</span> Option
<code>subscripts</code></h4>
<dl>
<dt><code>subscripts</code> (default value: <code>false</code>)</dt>
@@ -6640,8 +6683,8 @@ contain the following text:</p>
<blockquote>
<p>H<sub>2</sub>O is a liquid.</p>
</blockquote>
-<h4 data-number="2.2.1.55" id="option-superscripts"><span
-class="header-section-number">2.2.1.55</span> Option
+<h4 data-number="2.2.1.56" id="option-superscripts"><span
+class="header-section-number">2.2.1.56</span> Option
<code>superscripts</code></h4>
<dl>
<dt><code>superscripts</code> (default value: <code>false</code>)</dt>
@@ -6706,8 +6749,8 @@ contain the following text:</p>
<blockquote>
<p>2<sup>10</sup> is 1024.</p>
</blockquote>
-<h4 data-number="2.2.1.56" id="option-tableattributes"><span
-class="header-section-number">2.2.1.56</span> Option
+<h4 data-number="2.2.1.57" id="option-tableattributes"><span
+class="header-section-number">2.2.1.57</span> Option
<code>tableAttributes</code></h4>
<dl>
<dt><code>tableAttributes</code> (default value:
@@ -6829,8 +6872,8 @@ contain the following text:</p>
</tbody>
</table>
</blockquote>
-<h4 data-number="2.2.1.57" id="table-captions"><span
-class="header-section-number">2.2.1.57</span> Option
+<h4 data-number="2.2.1.58" id="table-captions"><span
+class="header-section-number">2.2.1.58</span> Option
<code>tableCaptions</code></h4>
<dl>
<dt><code>tableCaptions</code> (default value: <code>false</code>)</dt>
@@ -6978,8 +7021,8 @@ contain the following text:</p>
</tbody>
</table>
</blockquote>
-<h4 data-number="2.2.1.58" id="option-tasklists"><span
-class="header-section-number">2.2.1.58</span> Option
+<h4 data-number="2.2.1.59" id="option-tasklists"><span
+class="header-section-number">2.2.1.59</span> Option
<code>taskLists</code></h4>
<dl>
<dt><code>taskLists</code> (default value: <code>false</code>)</dt>
@@ -7068,8 +7111,8 @@ contain the following text:</p>
<li>Yes I can!</li>
</ul>
</blockquote>
-<h4 data-number="2.2.1.59" id="option-texcomments"><span
-class="header-section-number">2.2.1.59</span> Option
+<h4 data-number="2.2.1.60" id="option-texcomments"><span
+class="header-section-number">2.2.1.60</span> Option
<code>texComments</code></h4>
<dl>
<dt><code>texComments</code> (default value: <code>false</code>)</dt>
@@ -7087,7 +7130,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb405-1"><a href
<span id="cb405-6"><a href="#cb405-6" aria-hidden="true" tabindex="-1"></a> lo *world*!</span>
<span id="cb405-7"><a href="#cb405-7" aria-hidden="true" tabindex="-1"></a><span class="kw">\end</span>{<span class="ex">markdown</span>}</span>
<span id="cb405-8"><a href="#cb405-8" aria-hidden="true" tabindex="-1"></a><span class="kw">\end</span>{<span class="ex">document</span>}</span></code></pre></div>
-<p>Always enabled when <strong><code>hybrid</code></strong> is
+<p>Always enabled when <code><strong>hybrid</strong></code> is
enabled.</p>
</dd>
</dl>
@@ -7155,8 +7198,8 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb410-1"><a href
class="sourceCode sh"><code class="sourceCode bash"><span id="cb411-1"><a href="#cb411-1" aria-hidden="true" tabindex="-1"></a><span class="ex">context</span> <span class="at">--luatex</span> document.tex</span></code></pre></div>
<p>A PDF document named <code>document.pdf</code> should be produced and
contain the text “Hello <em>world</em>!”</p>
-<h4 data-number="2.2.1.60" id="option-texmathdollars"><span
-class="header-section-number">2.2.1.60</span> Option
+<h4 data-number="2.2.1.61" id="option-texmathdollars"><span
+class="header-section-number">2.2.1.61</span> Option
<code>texMathDollars</code></h4>
<dl>
<dt><code>texMathDollars</code> (default value: <code>false</code>)</dt>
@@ -7339,8 +7382,8 @@ class="math inline"><em>E</em> = <em>m</em><em>c</em><sup>2</sup></span></p>
<p><span
class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup>∞</sup><em>f</em>(<em>x</em>)<em>e</em><sup>−<em>i</em>2<em>π</em><em>ξ</em><em>x</em></sup><em>d</em><em>x</em></span></p>
</blockquote>
-<h4 data-number="2.2.1.61" id="option-texmathdoublebackslash"><span
-class="header-section-number">2.2.1.61</span> Option
+<h4 data-number="2.2.1.62" id="option-texmathdoublebackslash"><span
+class="header-section-number">2.2.1.62</span> Option
<code>texMathDoubleBackslash</code></h4>
<dl>
<dt><code>texMathDoubleBackslash</code> (default value:
@@ -7524,8 +7567,8 @@ class="math inline"><em>E</em> = <em>m</em><em>c</em><sup>2</sup></span></p>
<p><span
class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup>∞</sup><em>f</em>(<em>x</em>)<em>e</em><sup>−<em>i</em>2<em>π</em><em>ξ</em><em>x</em></sup><em>d</em><em>x</em></span></p>
</blockquote>
-<h4 data-number="2.2.1.62" id="option-texmathsinglebackslash"><span
-class="header-section-number">2.2.1.62</span> Option
+<h4 data-number="2.2.1.63" id="option-texmathsinglebackslash"><span
+class="header-section-number">2.2.1.63</span> Option
<code>texMathSingleBackslash</code></h4>
<dl>
<dt><code>texMathSingleBackslash</code> (default value:
@@ -7709,8 +7752,8 @@ class="math inline"><em>E</em> = <em>m</em><em>c</em><sup>2</sup></span></p>
<p><span
class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup>∞</sup><em>f</em>(<em>x</em>)<em>e</em><sup>−<em>i</em>2<em>π</em><em>ξ</em><em>x</em></sup><em>d</em><em>x</em></span></p>
</blockquote>
-<h4 data-number="2.2.1.63" id="option-tightlists"><span
-class="header-section-number">2.2.1.63</span> Option
+<h4 data-number="2.2.1.64" id="option-tightlists"><span
+class="header-section-number">2.2.1.64</span> Option
<code>tightLists</code></h4>
<dl>
<dt><code>tightLists</code> (default value: <code>true</code>)</dt>
@@ -7806,8 +7849,8 @@ contain the following text:</p>
<li><p>third item</p></li>
</ul>
</blockquote>
-<h4 data-number="2.2.1.64" id="option-underscores"><span
-class="header-section-number">2.2.1.64</span> Option
+<h4 data-number="2.2.1.65" id="option-underscores"><span
+class="header-section-number">2.2.1.65</span> Option
<code>underscores</code></h4>
<dl>
<dt><code>underscores</code> (default value: <code>true</code>)</dt>
@@ -7831,7 +7874,7 @@ class="sourceCode md"><code class="sourceCode markdown"><span id="cb451-1"><a hr
<dd>
<p>Only asterisks can be used to denote emphasis and strong emphasis.
This makes it easy to write math with the
-<strong><code>hybrid</code></strong> option without the need to
+<code><strong>hybrid</strong></code> option without the need to
constantly escape subscripts.</p>
</dd>
</dl>
@@ -7940,7 +7983,7 @@ class="header-section-number">2.2.2.1</span> Setting Lua options from
plain <span class="tex">T<sub>e</sub>X</span></h4>
<p>As a rule of thumb, you can set all Lua options directly from plain
<span class="tex">T<sub>e</sub>X</span>. For example, to set the
-<strong><code>taskLists</code></strong> Lua option to <code>true</code>,
+<code><strong>taskLists</strong></code> Lua option to <code>true</code>,
you would include the following code in your plain <span
class="tex">T<sub>e</sub>X</span> document:</p>
<div class="sourceCode" id="cb458"><pre
@@ -7948,7 +7991,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb458-1"><a href
<p>Alternatively, you can also set plain <span
class="tex">T<sub>e</sub>X</span> options using the
<code>\markdownSetup</code> <span class="tex">T<sub>e</sub>X</span>
-macro. For example, to set the <strong><code>taskLists</code></strong>
+macro. For example, to set the <code><strong>taskLists</strong></code>
Lua option to <code>true</code>, you would include the following code in
your plain <span class="tex">T<sub>e</sub>X</span> document:</p>
<div class="sourceCode" id="cb459"><pre
@@ -7956,29 +7999,29 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb459-1"><a href
<h4 data-number="2.2.2.2" id="finalizing-and-freezing-the-cache"><span
class="header-section-number">2.2.2.2</span> Finalizing and Freezing the
Cache</h4>
-<p>The <code>\markdownOptionFrozenCache</code> option uses the mapping
+<p>The <code>markdownOptionFrozenCache</code> option uses the mapping
previously created by the Lua interface
-<strong><code>finalizeCache</code></strong> option, and uses it to
+<code><strong>finalizeCache</strong></code> option, and uses it to
typeset the plain <span class="tex">T<sub>e</sub>X</span> document
without invoking Lua. As a result, the plain <span
class="tex">T<sub>e</sub>X</span> document becomes more portable, but
further changes in the order and the content of markdown documents will
not be reflected. It defaults to <code>false</code>.</p>
-<p>The standard usage of the <strong><code>finalizeCache</code></strong>
-and <strong><code>frozenCache</code></strong> options is as follows:</p>
+<p>The standard usage of the <code><strong>finalizeCache</strong></code>
+and <code><strong>frozenCache</strong></code> options is as follows:</p>
<ol type="1">
-<li>Remove the <strong><code>cacheDir</code></strong> cache directory
+<li>Remove the <code><strong>cacheDir</strong></code> cache directory
with stale auxiliary cache files.</li>
-<li>Enable the <strong><code>finalizeCache</code></strong> option.</li>
+<li>Enable the <code><strong>finalizeCache</strong></code> option.</li>
<li>Typeset the plain <span class="tex">T<sub>e</sub>X</span> document
to populate and finalize the cache.</li>
-<li>Enable the <strong><code>frozenCache</code></strong> option.</li>
+<li>Enable the <code><strong>frozenCache</strong></code> option.</li>
<li>Publish the source code of the plain <span
class="tex">T<sub>e</sub>X</span> document and the
-<strong><code>cacheDir</code></strong> directory.</li>
+<code><strong>cacheDir</strong></code> directory.</li>
</ol>
<p>For more information, see the examples for the
-<strong><code>finalizeCache</code></strong> option.</p>
+<code><strong>finalizeCache</strong></code> option.</p>
<h4 data-number="2.2.2.3" id="file-and-directory-names"><span
class="header-section-number">2.2.2.3</span> File and Directory
Names</h4>
@@ -8045,7 +8088,7 @@ class="latex">L<sup>a</sup>T<sub>e</sub>X</span> and Con<span
class="tex">T<sub>e</sub>X</span>t. Furthermore, the default definitions
may change at any time, which may pose a problem for maintainers of
Markdown themes and templates who may require a stable output.</p>
-<p>The <code>\markdownOptionPlain</code> macro specifies whether
+<p>The <code>markdownOptionPlain</code> macro specifies whether
higher-level <span class="tex">T<sub>e</sub>X</span> formats should only
use the plain <span class="tex">T<sub>e</sub>X</span> default
definitions or whether they should also use the format-specific default
@@ -8069,7 +8112,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb464-1"><a href
<span id="cb464-2"><a href="#cb464-2" aria-hidden="true" tabindex="-1"></a><span class="fu">\usemodule</span>[t][markdown]</span></code></pre></div>
<p>The macro must be set before or during the loading of the package.
Setting the macro after loading the package has no effect.</p>
-<p>The <code>\markdownOptionNoDefaults</code> macro specifies whether we
+<p>The <code>markdownOptionNoDefaults</code> macro specifies whether we
should prevent the loading of default definitions or not. This is useful
in contexts, where we want to have total control over how all elements
are rendered.</p>
@@ -8086,7 +8129,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb466-1"><a href
Setting the macro after loading the package has no effect.</p>
<h4 data-number="2.2.2.5" id="package-documentation"><span
class="header-section-number">2.2.2.5</span> Package Documentation</h4>
-<p>The <code>\markdownOptionStripPercentSigns</code> macro controls
+<p>The <code>markdownOptionStripPercentSigns</code> macro controls
whether a percent sign (<code>\%</code>) at the beginning of a line will
be discarded when reading Markdown input from a <span
class="tex">T<sub>e</sub>X</span> document. This enables the use of
@@ -8125,10 +8168,10 @@ low-level programming.</p>
<p>Built-in plain <span class="tex">T<sub>e</sub>X</span> themes
provided with the Markdown package include:</p>
<dl>
-<dt><strong><code>witiko/tilde</code></strong></dt>
+<dt><code><strong>witiko/tilde</strong></code></dt>
<dd>
<p>A theme that makes tilde (<code>~</code>) always typeset the
-non-breaking space even when the <strong><code>hybrid</code></strong>
+non-breaking space even when the <code><strong>hybrid</strong></code>
Lua option is disabled.</p>
</dd>
</dl>
@@ -8153,7 +8196,7 @@ non-breaking space:</p>
<p>Bartel·Leendert van·der·Waerden</p>
</blockquote>
<dl>
-<dt><strong><code>witiko/markdown/defaults</code></strong></dt>
+<dt><code><strong>witiko/markdown/defaults</strong></code></dt>
<dd>
<p>A plain <span class="tex">T<sub>e</sub>X</span> theme with the
default definitions of token renderer prototypes for plain <span
@@ -8276,7 +8319,7 @@ class="tex">T<sub>e</sub>X</span> options from <span
class="latex">L<sup>a</sup>T<sub>e</sub>X</span></h4>
<p>As a rule of thumb, we can set all Lua options directly from <span
class="latex">L<sup>a</sup>T<sub>e</sub>X</span>. For example, to set
-the <strong><code>taskLists</code></strong> Lua option to
+the <code><strong>taskLists</strong></code> Lua option to
<code>true</code>, we would include the following code in our <span
class="latex">L<sup>a</sup>T<sub>e</sub>X</span> document:</p>
<div class="sourceCode" id="cb476"><pre
@@ -8318,7 +8361,7 @@ where different code is needed for different <span
class="tex">T<sub>e</sub>X</span> formats. To enable code reuse,
developers can load the <code>.tex</code> theme file from the
<code>.sty</code> theme file using the
-<code>\markdownLoadPlainTeXTheme</code> macro.</p>
+<code>markdownLoadPlainTeXTheme</code> macro.</p>
<p>For example, to load themes named <code>witiko/beamer/MU</code> and
<code>witiko/dot</code>, you would use the following code in the
preamble of your document:</p>
@@ -8334,14 +8377,14 @@ class="latex">L<sup>a</sup>T<sub>e</sub>X</span> document.</p>
<p>Built-in <span class="latex">L<sup>a</sup>T<sub>e</sub>X</span>
themes provided with the Markdown package include:</p>
<dl>
-<dt><strong><code>witiko/dot</code></strong></dt>
+<dt><code><strong>witiko/dot</strong></code></dt>
<dd>
<p>A theme that typesets fenced code blocks with the <code>dot …</code>
infostring as images of directed graphs rendered by the Graphviz tools.
The right tail of the infostring is used as the image title. The theme
requires a Unix-like operating system with GNU Diffutils and Graphviz
installed. The theme also requires shell access unless the
-<strong><code>frozenCache</code></strong> plain <span
+<code><strong>frozenCache</strong></code> plain <span
class="tex">T<sub>e</sub>X</span> option is enabled.</p>
</dd>
</dl>
@@ -8400,15 +8443,15 @@ href="http://ceur-ws.org/Vol-2696/paper_235.pdf"
class="uri">http://ceur-ws.org/Vol-2696/paper_235.pdf</a></p>
</blockquote>
<dl>
-<dt><strong><code>witiko/graphicx/http</code></strong></dt>
+<dt><code><strong>witiko/graphicx/http</strong></code></dt>
<dd>
<p>A theme that adds support for downloading images whose URL has the
http or https protocol. The theme requires the
-<strong><code>catchfile</code></strong> <span
+<code><strong>catchfile</strong></code> <span
class="latex">L<sup>a</sup>T<sub>e</sub>X</span> package and a Unix-like
operating system with GNU Coreutils <code>md5sum</code> and either GNU
Wget or cURL installed. The theme also requires shell access unless the
-<strong><code>frozenCache</code></strong> plain <span
+<code><strong>frozenCache</strong></code> plain <span
class="tex">T<sub>e</sub>X</span> option is enabled.</p>
</dd>
</dl>
@@ -8438,7 +8481,7 @@ title="The banner of the Markdown package" alt="img" />
</figure>
</blockquote>
<dl>
-<dt><strong><code>witiko/markdown/defaults</code></strong></dt>
+<dt><code><strong>witiko/markdown/defaults</strong></code></dt>
<dd>
<p>A <span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> theme with
the default definitions of token renderer prototypes for plain <span
@@ -8471,7 +8514,7 @@ where different code is needed for different <span
class="tex">T<sub>e</sub>X</span> formats. To enable code reuse,
developers can load the <code>.tex</code> theme file from the
<code>t-*.tex</code> theme file using the
-<code>\markdownLoadPlainTeXTheme</code> macro.</p>
+<code>markdownLoadPlainTeXTheme</code> macro.</p>
<p>For example, to load a theme named <code>witiko/tilde</code> in your
document:</p>
<div class="sourceCode" id="cb483"><pre
@@ -8480,7 +8523,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb483-1"><a href
<p>Built-in Con<span class="tex">T<sub>e</sub>X</span>t themes provided
with the Markdown package include:</p>
<dl>
-<dt><strong><code>witiko/markdown/defaults</code></strong></dt>
+<dt><code><strong>witiko/markdown/defaults</strong></code></dt>
<dd>
<p>A Con<span class="tex">T<sub>e</sub>X</span>t theme with the default
definitions of token renderer prototypes for plain <span
@@ -8507,26 +8550,26 @@ class="header-section-number">2.3.1.1</span> Attribute Renderers</h4>
following options for markdown attributes on different elements is
enabled:</p>
<ul>
-<li><strong><code>autoIdentifiers</code></strong></li>
-<li><strong><code>fencedCodeAttributes</code></strong></li>
-<li><strong><code>gfmAutoIdentifiers</code></strong></li>
-<li><strong><code>headerAttributes</code></strong></li>
-<li><strong><code>inlineCodeAttributes</code></strong></li>
-<li><strong><code>linkAttributes</code></strong></li>
+<li><code><strong>autoIdentifiers</strong></code></li>
+<li><code><strong>fencedCodeAttributes</strong></code></li>
+<li><code><strong>gfmAutoIdentifiers</strong></code></li>
+<li><code><strong>headerAttributes</strong></code></li>
+<li><code><strong>inlineCodeAttributes</strong></code></li>
+<li><code><strong>linkAttributes</strong></code></li>
</ul>
-<p><code>\markdownRendererAttributeIdentifier</code> represents the
+<p><code>markdownRendererAttributeIdentifier</code> represents the
⟨<em>identifier</em>⟩ of a markdown element
(<code>id="</code>⟨<em>identifier</em>⟩<code>"</code> in HTML and
<code>#</code>⟨<em>identifier</em>⟩ in markdown attributes). The macro
receives a single attribute that corresponds to the
⟨<em>identifier</em>⟩.</p>
-<p><code>\markdownRendererAttributeClassName</code> represents the
+<p><code>markdownRendererAttributeClassName</code> represents the
⟨<em>class name</em>⟩ of a markdown element
(<code>class="</code>⟨<em>class name</em>⟩ …<code>"</code> in HTML and
<code>.</code>⟨<em>class name</em>⟩ in markdown attributes). The macro
receives a single attribute that corresponds to the ⟨<em>class
name</em>⟩.</p>
-<p><code>\markdownRendererAttributeKeyValue</code> represents a HTML
+<p><code>markdownRendererAttributeKeyValue</code> represents a HTML
attribute in the form ⟨<em>key</em>⟩<code>=</code>⟨<em>value</em>⟩ that
is neither an identifier nor a class name. The macro receives two
attributes that correspond to the ⟨<em>key</em>⟩ and the
@@ -8583,9 +8626,9 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.2" id="block-quote-renderers"><span
class="header-section-number">2.3.1.2</span> Block Quote Renderers</h4>
-<p>The <code>\markdownRendererBlockQuoteBegin</code> macro represents
-the beginning of a block quote. The macro receives no arguments.</p>
-<p>The <code>\markdownRendererBlockQuoteEnd</code> macro represents the
+<p>The <code>markdownRendererBlockQuoteBegin</code> macro represents the
+beginning of a block quote. The macro receives no arguments.</p>
+<p>The <code>markdownRendererBlockQuoteEnd</code> macro represents the
end of a block quote. The macro receives no arguments.</p>
<h5 class="unnumbered" id="plain-tex-example-25">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -8698,12 +8741,11 @@ id="bracketed-spans-attribute-context-renderers"><span
class="header-section-number">2.3.1.3</span> Bracketed Spans Attribute
Context Renderers</h4>
<p>The following macros are only produced, when the
-<strong><code>bracketedSpans</code></strong> option is enabled.</p>
-<p>The <code>\markdownRendererBracketedSpanAttributeContextBegin</code>
-and <code>\markdownRendererBracketedSpanAttributeContextEnd</code>
-macros represent the beginning and the end of a context in which the
-attributes of an inline bracketed span apply. The macros receive no
-arguments.</p>
+<code><strong>bracketedSpans</strong></code> option is enabled.</p>
+<p>The <code>markdownRendererBracketedSpanAttributeContextBegin</code>
+and <code>markdownRendererBracketedSpanAttributeContextEnd</code> macros
+represent the beginning and the end of a context in which the attributes
+of an inline bracketed span apply. The macros receive no arguments.</p>
<h5 class="unnumbered" id="latex-example-58"><span
class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5>
<p>Using a text editor, create a text document named
@@ -8734,26 +8776,26 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.4" id="bullet-list-renderers"><span
class="header-section-number">2.3.1.4</span> Bullet List Renderers</h4>
-<p>The <code>\markdownRendererUlBegin</code> macro represents the
+<p>The <code>markdownRendererUlBegin</code> macro represents the
beginning of a bulleted list that contains an item with several
paragraphs of text (the list is not tight). The macro receives no
arguments.</p>
-<p>The <code>\markdownRendererUlBeginTight</code> macro represents the
+<p>The <code>markdownRendererUlBeginTight</code> macro represents the
beginning of a bulleted list that contains no item with several
paragraphs of text (the list is tight). This macro will only be
-produced, when the <strong><code>tightLists</code></strong> option is
+produced, when the <code><strong>tightLists</strong></code> option is
disabled. The macro receives no arguments.</p>
-<p>The <code>\markdownRendererUlItem</code> macro represents an item in
-a bulleted list. The macro receives no arguments.</p>
-<p>The <code>\markdownRendererUlItemEnd</code> macro represents the end
+<p>The <code>markdownRendererUlItem</code> macro represents an item in a
+bulleted list. The macro receives no arguments.</p>
+<p>The <code>markdownRendererUlItemEnd</code> macro represents the end
of an item in a bulleted list. The macro receives no arguments.</p>
-<p>The <code>\markdownRendererUlEnd</code> macro represents the end of a
+<p>The <code>markdownRendererUlEnd</code> macro represents the end of a
bulleted list that contains an item with several paragraphs of text (the
list is not tight). The macro receives no arguments.</p>
-<p>The <code>\markdownRendererUlEndTight</code> macro represents the end
+<p>The <code>markdownRendererUlEndTight</code> macro represents the end
of a bulleted list that contains no item with several paragraphs of text
(the list is tight). This macro will only be produced, when the
-<strong><code>tightLists</code></strong> option is disabled. The macro
+<code><strong>tightLists</strong></code> option is disabled. The macro
receives no arguments.</p>
<h5 class="unnumbered" id="plain-tex-example-26">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -8949,9 +8991,9 @@ item).</p>
</blockquote>
<h4 data-number="2.3.1.5" id="citation-renderers"><span
class="header-section-number">2.3.1.5</span> Citation Renderers</h4>
-<p>The <code>\markdownRendererCite</code> macro represents a string of
+<p>The <code>markdownRendererCite</code> macro represents a string of
one or more parenthetical citations. This macro will only be produced,
-when the <strong><code>citations</code></strong> option is enabled. The
+when the <code><strong>citations</strong></code> option is enabled. The
macro receives the parameter <code>{</code>⟨<em>number of
citations</em>⟩<code>}</code> followed by ⟨<em>suppress author</em>⟩
<code>{</code>⟨<em>prenote</em>⟩<code>}{</code>⟨<em>postnote</em>⟩<code>}{</code>⟨<em>name</em>⟩<code>}</code>
@@ -9013,11 +9055,11 @@ contain the following text:</p>
see and a postfix <em>pp. 12</em>, and a citation <em>eijkhout91</em>
with a postfix <em>pp. 34</em>.</p>
</blockquote>
-<p>The <code>\markdownRendererTextCite</code> macro represents a string
+<p>The <code>markdownRendererTextCite</code> macro represents a string
of one or more text citations. This macro will only be produced, when
-the <strong><code>citations</code></strong> option is enabled. The macro
+the <code><strong>citations</strong></code> option is enabled. The macro
receives parameters in the same format as the
-<code>\markdownRendererCite</code> macro.</p>
+<code>markdownRendererCite</code> macro.</p>
<h5 class="unnumbered" id="latex-example-61"><span
class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5>
<p>Using a text editor, create a text document named
@@ -9075,12 +9117,12 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.6" id="code-block-renderers"><span
class="header-section-number">2.3.1.6</span> Code Block Renderers</h4>
-<p>The <code>\markdownRendererInputVerbatim</code> macro represents a
+<p>The <code>markdownRendererInputVerbatim</code> macro represents a
code block. The macro receives a single argument that corresponds to the
filename of a file containing the code block contents.</p>
-<p>The <code>\markdownRendererInputFencedCode</code> macro represents a
+<p>The <code>markdownRendererInputFencedCode</code> macro represents a
fenced code block. This macro will only be produced, when the
-<strong><code>fencedCode</code></strong> option is enabled. The macro
+<code><strong>fencedCode</strong></code> option is enabled. The macro
receives three arguments that correspond to the filename of a file
containing the code block contents, the fully escaped code fence
infostring that can be directly typeset, and the raw code fence
@@ -9165,7 +9207,7 @@ class="sourceCode py"><code class="sourceCode python"><span id="cb507-1"><a href
</blockquote>
<h4 data-number="2.3.1.7" id="code-span-renderer"><span
class="header-section-number">2.3.1.7</span> Code Span Renderer</h4>
-<p>The <code>\markdownRendererCodeSpan</code> macro represents inline
+<p>The <code>markdownRendererCodeSpan</code> macro represents inline
code span in the input text. It receives a single argument that
corresponds to the inline code span.</p>
<h5 class="unnumbered" id="plain-tex-example-27">Plain <span
@@ -9274,10 +9316,10 @@ id="code-span-attribute-context-renderers"><span
class="header-section-number">2.3.1.8</span> Code Span Attribute Context
Renderers</h4>
<p>The following macros are only produced, when the
-<strong><code>inlineCodeAttributes</code></strong> option is
+<code><strong>inlineCodeAttributes</strong></code> option is
enabled.</p>
-<p>The <code>\markdownRendererCodeSpanAttributeContextBegin</code> and
-<code>\markdownRendererCodeSpanAttributeContextEnd</code> macros
+<p>The <code>markdownRendererCodeSpanAttributeContextBegin</code> and
+<code>markdownRendererCodeSpanAttributeContextEnd</code> macros
represent the beginning and the end of a context in which the attributes
of an inline code span apply. The macros receive no arguments.</p>
<h5 class="unnumbered" id="latex-example-64"><span
@@ -9312,21 +9354,21 @@ contain the following text:</p>
<h4 data-number="2.3.1.9" id="texcontentblockrenderers"><span
class="header-section-number">2.3.1.9</span> Content Block
Renderers</h4>
-<p>The <code>\markdownRendererContentBlock</code> macro represents an
+<p>The <code>markdownRendererContentBlock</code> macro represents an
iA Writer content block. It receives four arguments: the local file or
online image filename extension cast to the lower case, the fully
escaped <abbr>uri</abbr> that can be directly typeset, the raw
<abbr>uri</abbr> that can be used outside typesetting, and the title of
the content block.</p>
-<p>The <code>\markdownRendererContentBlockOnlineImage</code> macro
+<p>The <code>markdownRendererContentBlockOnlineImage</code> macro
represents an iA Writer online image content block. The macro receives
-the same arguments as <code>\markdownRendererContentBlock</code>.</p>
-<p>The <code>\markdownRendererContentBlockCode</code> macro represents
-an iA Writer content block that was recognized as a file in a known
+the same arguments as <code>markdownRendererContentBlock</code>.</p>
+<p>The <code>markdownRendererContentBlockCode</code> macro represents an
+iA Writer content block that was recognized as a file in a known
programming language by its filename extension <span
class="math inline"><em>s</em></span>. If any
<code>markdown-languages.json</code> file found by
-<strong><code>kpathsea</code></strong><a href="#fn3"
+<code><strong>kpathsea</strong></code><a href="#fn3"
class="footnote-ref" id="fnref3" role="doc-noteref"><sup>3</sup></a>
contains a record <span
class="math inline">(<em>k</em>,<em>v</em>)</span>, then a
@@ -9484,34 +9526,34 @@ the logotype of TUGboat.</p>
class="header-section-number">2.3.1.10</span> Definition List
Renderers</h4>
<p>The following macros are only produced, when the
-<strong><code>definitionLists</code></strong> option is enabled.</p>
-<p>The <code>\markdownRendererDlBegin</code> macro represents the
+<code><strong>definitionLists</strong></code> option is enabled.</p>
+<p>The <code>markdownRendererDlBegin</code> macro represents the
beginning of a definition list that contains an item with several
paragraphs of text (the list is not tight). The macro receives no
arguments.</p>
-<p>The <code>\markdownRendererDlBeginTight</code> macro represents the
+<p>The <code>markdownRendererDlBeginTight</code> macro represents the
beginning of a definition list that contains no item with several
paragraphs of text (the list is tight). This macro will only be
-produced, when the <strong><code>tightLists</code></strong> option is
+produced, when the <code><strong>tightLists</strong></code> option is
disabled. The macro receives no arguments.</p>
-<p>The <code>\markdownRendererDlItem</code> macro represents a term in a
+<p>The <code>markdownRendererDlItem</code> macro represents a term in a
definition list. The macro receives a single argument that corresponds
to the term being defined.</p>
-<p>The <code>\markdownRendererDlItemEnd</code> macro represents the end
+<p>The <code>markdownRendererDlItemEnd</code> macro represents the end
of a list of definitions for a single term.</p>
-<p>The <code>\markdownRendererDlDefinitionBegin</code> macro represents
+<p>The <code>markdownRendererDlDefinitionBegin</code> macro represents
the beginning of a definition in a definition list. There can be several
definitions for a single term.</p>
-<p>The <code>\markdownRendererDlDefinitionEnd</code> macro represents
-the end of a definition in a definition list. There can be several
+<p>The <code>markdownRendererDlDefinitionEnd</code> macro represents the
+end of a definition in a definition list. There can be several
definitions for a single term.</p>
-<p>The <code>\markdownRendererDlEnd</code> macro represents the end of a
+<p>The <code>markdownRendererDlEnd</code> macro represents the end of a
definition list that contains an item with several paragraphs of text
(the list is not tight). The macro receives no arguments.</p>
-<p>The <code>\markdownRendererDlEndTight</code> macro represents the end
+<p>The <code>markdownRendererDlEndTight</code> macro represents the end
of a definition list that contains no item with several paragraphs of
text (the list is tight). This macro will only be produced, when the
-<strong><code>tightLists</code></strong> option is disabled. The macro
+<code><strong>tightLists</strong></code> option is disabled. The macro
receives no arguments.</p>
<h5 class="unnumbered" id="plain-tex-example-29">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -9840,9 +9882,9 @@ nutrient-rich, and produced on an industrial scale.</p>
</blockquote>
<h4 data-number="2.3.1.11" id="ellipsis-renderer"><span
class="header-section-number">2.3.1.11</span> Ellipsis Renderer</h4>
-<p>The <code>\markdownRendererEllipsis</code> macro replaces any
+<p>The <code>markdownRendererEllipsis</code> macro replaces any
occurrence of ASCII ellipses in the input text. This macro will only be
-produced, when the <strong><code>smartEllipses</code></strong> option is
+produced, when the <code><strong>smartEllipses</strong></code> option is
enabled. The macro receives no arguments.</p>
<h5 class="unnumbered" id="plain-tex-example-30">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -9914,10 +9956,10 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.12" id="emphasis-renderers"><span
class="header-section-number">2.3.1.12</span> Emphasis Renderers</h4>
-<p>The <code>\markdownRendererEmphasis</code> macro represents an
+<p>The <code>markdownRendererEmphasis</code> macro represents an
emphasized span of text. The macro receives a single argument that
corresponds to the emphasized span of text.</p>
-<p>The <code>\markdownRendererStrongEmphasis</code> macro represents a
+<p>The <code>markdownRendererStrongEmphasis</code> macro represents a
strongly emphasized span of text. The macro receives a single argument
that corresponds to the emphasized span of text.</p>
<h5 class="unnumbered" id="plain-tex-example-31">Plain <span
@@ -10001,9 +10043,11 @@ id="fenced-code-attribute-context-renderers"><span
class="header-section-number">2.3.1.13</span> Fenced Code Attribute
Context Renderers</h4>
<p>The following macros are only produced, when the
-<strong><code>fencedCode</code></strong> option is enabled.</p>
-<p>The <code>\markdownRendererFencedCodeAttributeContextBegin</code> and
-<code>\markdownRendererFencedCodeAttributeContextEnd</code> macros
+<code><strong>fencedCode</strong></code> and
+<code><strong>fencedCodeAttributes</strong></code> options are
+enabled.</p>
+<p>The <code>markdownRendererFencedCodeAttributeContextBegin</code> and
+<code>markdownRendererFencedCodeAttributeContextEnd</code> macros
represent the beginning and the end of a context in which the attributes
of a fenced code apply. The macros receive no arguments.</p>
<h5 class="unnumbered" id="latex-example-69"><span
@@ -10057,9 +10101,9 @@ id="fenced-div-attribute-context-renderers"><span
class="header-section-number">2.3.1.14</span> Fenced Div Attribute
Context Renderers</h4>
<p>The following macros are only produced, when the
-<strong><code>fencedDiv</code></strong> option is enabled.</p>
-<p>The <code>\markdownRendererFencedDivAttributeContextBegin</code> and
-<code>\markdownRendererFencedDivAttributeContextEnd</code> macros
+<code><strong>fencedDiv</strong></code> option is enabled.</p>
+<p>The <code>markdownRendererFencedDivAttributeContextBegin</code> and
+<code>markdownRendererFencedDivAttributeContextEnd</code> macros
represent the beginning and the end of a context in which the attributes
of a div apply. The macros receive no arguments.</p>
<h5 class="unnumbered" id="latex-example-70"><span
@@ -10126,11 +10170,11 @@ contain the following text:</p>
class="header-section-number">2.3.1.15</span> Header Attribute Context
Renderers</h4>
<p>The following macros are only produced, when the
-<strong><code>autoIdentifiers</code></strong>,
-<strong><code>gfmAutoIdentifiers</code></strong>, or
-<strong><code>headerAttributes</code></strong> options are enabled.</p>
-<p>The <code>\markdownRendererHeaderAttributeContextBegin</code> and
-<code>\markdownRendererHeaderAttributeContextEnd</code> macros represent
+<code><strong>autoIdentifiers</strong></code>,
+<code><strong>gfmAutoIdentifiers</strong></code>, or
+<code><strong>headerAttributes</strong></code> options are enabled.</p>
+<p>The <code>markdownRendererHeaderAttributeContextBegin</code> and
+<code>markdownRendererHeaderAttributeContextEnd</code> macros represent
the beginning and the end of a context in which the attributes of a
heading apply. The macros receive no arguments.</p>
<h5 class="unnumbered" id="latex-example-71"><span
@@ -10181,22 +10225,22 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.16" id="heading-renderers"><span
class="header-section-number">2.3.1.16</span> Heading Renderers</h4>
-<p>The <code>\markdownRendererHeadingOne</code> macro represents a first
+<p>The <code>markdownRendererHeadingOne</code> macro represents a first
level heading. The macro receives a single argument that corresponds to
the heading text.</p>
-<p>The <code>\markdownRendererHeadingTwo</code> macro represents a
-second level heading. The macro receives a single argument that
-corresponds to the heading text.</p>
-<p>The <code>\markdownRendererHeadingThree</code> macro represents a
+<p>The <code>markdownRendererHeadingTwo</code> macro represents a second
+level heading. The macro receives a single argument that corresponds to
+the heading text.</p>
+<p>The <code>markdownRendererHeadingThree</code> macro represents a
third level heading. The macro receives a single argument that
corresponds to the heading text.</p>
-<p>The <code>\markdownRendererHeadingFour</code> macro represents a
+<p>The <code>markdownRendererHeadingFour</code> macro represents a
fourth level heading. The macro receives a single argument that
corresponds to the heading text.</p>
-<p>The <code>\markdownRendererHeadingFive</code> macro represents a
-fifth level heading. The macro receives a single argument that
-corresponds to the heading text.</p>
-<p>The <code>\markdownRendererHeadingSix</code> macro represents a sixth
+<p>The <code>markdownRendererHeadingFive</code> macro represents a fifth
+level heading. The macro receives a single argument that corresponds to
+the heading text.</p>
+<p>The <code>markdownRendererHeadingSix</code> macro represents a sixth
level heading. The macro receives a single argument that corresponds to
the heading text.</p>
<h5 class="unnumbered" id="plain-tex-example-32">Plain <span
@@ -10296,9 +10340,9 @@ contain the following text:</p>
<h4 data-number="2.3.1.17" id="inline-html-comment-renderer"><span
class="header-section-number">2.3.1.17</span> Inline HTML Comment
Renderer</h4>
-<p>The <code>\markdownRendererInlineHtmlComment</code> macro represents
+<p>The <code>markdownRendererInlineHtmlComment</code> macro represents
the contents of an inline <abbr>HTML</abbr> comment. This macro will
-only be produced, when the <strong><code>html</code></strong> option is
+only be produced, when the <code><strong>html</strong></code> option is
enabled. The macro receives a single argument that corresponds to the
contents of the <abbr>HTML</abbr> comment.</p>
<h5 class="unnumbered" id="latex-example-73"><span
@@ -10339,14 +10383,14 @@ find</em> than notes.</p>
<h4 data-number="2.3.1.18" id="html-tag-and-element-renderers"><span
class="header-section-number">2.3.1.18</span> HTML Tag and Element
Renderers</h4>
-<p>The <code>\markdownRendererInlineHtmlTag</code> macro represents an
+<p>The <code>markdownRendererInlineHtmlTag</code> macro represents an
opening, closing, or empty inline <abbr>HTML</abbr> tag. This macro will
-only be produced, when the <strong><code>html</code></strong> option is
+only be produced, when the <code><strong>html</strong></code> option is
enabled. The macro receives a single argument that corresponds to the
contents of the <abbr>HTML</abbr> tag.</p>
-<p>The <code>\markdownRendererInputBlockHtmlElement</code> macro
+<p>The <code>markdownRendererInputBlockHtmlElement</code> macro
represents a block <abbr>HTML</abbr> element. This macro will only be
-produced, when the <strong><code>html</code></strong> option is enabled.
+produced, when the <code><strong>html</strong></code> option is enabled.
The macro receives a single argument that filename of a file containing
the contents of the <abbr>HTML</abbr> element.</p>
<h5 class="unnumbered" id="latex-example-74"><span
@@ -10383,7 +10427,7 @@ contain the following body text:</p>
</blockquote>
<h4 data-number="2.3.1.19" id="image-renderer"><span
class="header-section-number">2.3.1.19</span> Image Renderer</h4>
-<p>The <code>\markdownRendererImage</code> macro represents an image. It
+<p>The <code>markdownRendererImage</code> macro represents an image. It
receives four arguments: the label, the fully escaped <abbr>uri</abbr>
that can be directly typeset, the raw <abbr>uri</abbr> that can be used
outside typesetting, and the title of the link.</p>
@@ -10447,9 +10491,9 @@ title="The Communications of the TeX Users Group" alt="TUGboat" />
class="header-section-number">2.3.1.20</span> Image Attribute Context
Renderers</h4>
<p>The following macros are only produced, when the
-<strong><code>linkAttributes</code></strong> option is enabled.</p>
-<p>The <code>\markdownRendererImageAttributeContextBegin</code> and
-<code>\markdownRendererImageAttributeContextEnd</code> macros represent
+<code><strong>linkAttributes</strong></code> option is enabled.</p>
+<p>The <code>markdownRendererImageAttributeContextBegin</code> and
+<code>markdownRendererImageAttributeContextEnd</code> macros represent
the beginning and the end of a context in which the attributes of an
image apply. The macros receive no arguments.</p>
<h5 class="unnumbered" id="latex-example-76"><span
@@ -10484,9 +10528,9 @@ contain the following text:</p>
<h4 data-number="2.3.1.21" id="interblock-separator-renderers"><span
class="header-section-number">2.3.1.21</span> Interblock Separator
Renderers</h4>
-<p>The <code>\markdownRendererInterblockSeparator</code> macro
-represents an interblock separator between two markdown block elements.
-The macro receives no arguments.</p>
+<p>The <code>markdownRendererInterblockSeparator</code> macro represents
+an interblock separator between two markdown block elements. The macro
+receives no arguments.</p>
<h5 class="unnumbered" id="plain-tex-example-33">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
<p>Using a text editor, create a text document named
@@ -10586,7 +10630,7 @@ indicate the end of a series of blocks that make up a logical paragraph.
This produces a paragraph separator instead of an interblock separator.
Between some blocks, such as markdown paragraphs, a paragraph separator
is always produced.</p>
-<p>The <code>\markdownRendererParagraphSeparator</code> macro represents
+<p>The <code>markdownRendererParagraphSeparator</code> macro represents
a paragraph separator. The macro receives no arguments.</p>
<h5 class="unnumbered" id="latex-example-78"><span
class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5>
@@ -10624,11 +10668,10 @@ contain the following text:</p>
<h4 data-number="2.3.1.22" id="line-block-renderers"><span
class="header-section-number">2.3.1.22</span> Line Block Renderers</h4>
<p>The following macros are only produced, when the
-<strong><code>lineBlocks</code></strong> option is enabled.</p>
-<p>The <code>\markdownRendererLineBlockBegin</code> and
-<code>\markdownRendererLineBlockEnd</code> macros represent the
-beginning and the end of a line block. The macros receive no
-arguments.</p>
+<code><strong>lineBlocks</strong></code> option is enabled.</p>
+<p>The <code>markdownRendererLineBlockBegin</code> and
+<code>markdownRendererLineBlockEnd</code> macros represent the beginning
+and the end of a line block. The macros receive no arguments.</p>
<h5 class="unnumbered" id="plain-tex-example-34">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
<p>Using a text editor, create a text document named
@@ -10708,7 +10751,7 @@ Tread softly because you tread on my dreams.</div>
</blockquote>
<h4 data-number="2.3.1.23" id="line-break-renderers"><span
class="header-section-number">2.3.1.23</span> Line Break Renderers</h4>
-<p>The <code>\markdownRendererSoftLineBreak</code> macro represents a
+<p>The <code>markdownRendererSoftLineBreak</code> macro represents a
soft line break. The macro receives no arguments.</p>
<h5 class="unnumbered" id="plain-tex-example-35">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -10772,7 +10815,7 @@ contain the following text:</p>
<p><em>(A soft line break)</em></p>
<p><em>Foo</em> bar!</p>
</blockquote>
-<p>The <code>\markdownRendererHardLineBreak</code> macro represents a
+<p>The <code>markdownRendererHardLineBreak</code> macro represents a
hard line break. The macro receives no arguments.</p>
<h5 class="unnumbered" id="plain-tex-example-36">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -10842,7 +10885,7 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.24" id="link-renderer"><span
class="header-section-number">2.3.1.24</span> Link Renderer</h4>
-<p>The <code>\markdownRendererLink</code> macro represents a hyperlink.
+<p>The <code>markdownRendererLink</code> macro represents a hyperlink.
It receives four arguments: the label, the fully escaped
<abbr>uri</abbr> that can be directly typeset, the raw <abbr>uri</abbr>
that can be used outside typesetting, and the title of the link.</p>
@@ -10935,9 +10978,9 @@ Archive Network</em>.</p>
class="header-section-number">2.3.1.25</span> Link Attribute Context
Renderers</h4>
<p>The following macros are only produced, when the
-<strong><code>linkAttributes</code></strong> option is enabled.</p>
-<p>The <code>\markdownRendererLinkAttributeContextBegin</code> and
-<code>\markdownRendererLinkAttributeContextEnd</code> macros represent
+<code><strong>linkAttributes</strong></code> option is enabled.</p>
+<p>The <code>markdownRendererLinkAttributeContextBegin</code> and
+<code>markdownRendererLinkAttributeContextEnd</code> macros represent
the beginning and the end of a context in which the attributes of a
hyperlink apply. The macros receive no arguments.</p>
<h5 class="unnumbered" id="latex-example-83"><span
@@ -10972,8 +11015,8 @@ contain the following text:</p>
<h4 data-number="2.3.1.26" id="marked-text-renderer"><span
class="header-section-number">2.3.1.26</span> Marked Text Renderer</h4>
<p>The following macro is only produced, when the
-<strong><code>mark</code></strong> option is enabled.</p>
-<p>The <code>\markdownRendererMark</code> macro represents a span of
+<code><strong>mark</strong></code> option is enabled.</p>
+<p>The <code>markdownRendererMark</code> macro represents a span of
marked or highlighted text. The macro receives a single argument that
corresponds to the marked text.</p>
<h5 class="unnumbered" id="latex-example-84"><span
@@ -11007,8 +11050,8 @@ contain the following text:</p>
<h4 data-number="2.3.1.27" id="markdown-document-renderers"><span
class="header-section-number">2.3.1.27</span> Markdown Document
Renderers</h4>
-<p>The <code>\markdownRendererDocumentBegin</code> and
-<code>\markdownRendererDocumentEnd</code> macros represent the beginning
+<p>The <code>markdownRendererDocumentBegin</code> and
+<code>markdownRendererDocumentEnd</code> macros represent the beginning
and the end of a <em>markdown</em> document. The macros receive no
arguments.</p>
<p>A <span class="tex">T<sub>e</sub>X</span> document may contain any
@@ -11108,8 +11151,8 @@ contain the following text:</p>
<h4 data-number="2.3.1.28" id="non-breaking-space-renderer"><span
class="header-section-number">2.3.1.28</span> Non-Breaking Space
Renderer</h4>
-<p>The <code>\markdownRendererNbsp</code> macro represents a
-non-breaking space.</p>
+<p>The <code>markdownRendererNbsp</code> macro represents a non-breaking
+space.</p>
<h5 class="unnumbered" id="latex-example-86"><span
class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5>
<p>Using a text editor, create a text document named
@@ -11160,9 +11203,9 @@ typesetting.</em> Addison-Wesley, 1984.</p>
</blockquote>
<h4 data-number="2.3.1.29" id="note-renderer"><span
class="header-section-number">2.3.1.29</span> Note Renderer</h4>
-<p>The <code>\markdownRendererNote</code> macro represents a note. This
+<p>The <code>markdownRendererNote</code> macro represents a note. This
macro will only be produced, when the
-<strong><code>notes</code></strong> option is enabled. The macro
+<code><strong>notes</strong></code> option is enabled. The macro
receives a single argument that corresponds to the note text.</p>
<h5 class="unnumbered" id="plain-tex-example-38">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -11248,87 +11291,87 @@ contain the following text:</p>
<h4 data-number="2.3.1.30" id="ordered-list-renderers"><span
class="header-section-number">2.3.1.30</span> Ordered List
Renderers</h4>
-<p>The <code>\markdownRendererOlBegin</code> macro represents the
+<p>The <code>markdownRendererOlBegin</code> macro represents the
beginning of an ordered list that contains an item with several
paragraphs of text (the list is not tight). This macro will only be
-produced, when the <strong><code>fancyLists</code></strong> option is
+produced, when the <code><strong>fancyLists</strong></code> option is
disabled. The macro receives no arguments.</p>
-<p>The <code>\markdownRendererOlBeginTight</code> macro represents the
+<p>The <code>markdownRendererOlBeginTight</code> macro represents the
beginning of an ordered list that contains no item with several
paragraphs of text (the list is tight). This macro will only be
-produced, when the <strong><code>tightLists</code></strong> option is
-enabled and the <strong><code>fancyLists</code></strong> option is
+produced, when the <code><strong>tightLists</strong></code> option is
+enabled and the <code><strong>fancyLists</strong></code> option is
disabled. The macro receives no arguments.</p>
-<p>The <code>\markdownRendererFancyOlBegin</code> macro represents the
+<p>The <code>markdownRendererFancyOlBegin</code> macro represents the
beginning of a fancy ordered list that contains an item with several
paragraphs of text (the list is not tight). This macro will only be
-produced, when the <strong><code>fancyLists</code></strong> option is
+produced, when the <code><strong>fancyLists</strong></code> option is
enabled. The macro receives two arguments: the style of the list item
labels (<code>Decimal</code>, <code>LowerRoman</code>,
<code>UpperRoman</code>, <code>LowerAlpha</code>, and
<code>UpperAlpha</code>), and the style of delimiters between list item
labels and texts (<code>Default</code>, <code>OneParen</code>, and
<code>Period</code>).</p>
-<p>The <code>\markdownRendererFancyOlBeginTight</code> macro represents
+<p>The <code>markdownRendererFancyOlBeginTight</code> macro represents
the beginning of a fancy ordered list that contains no item with several
paragraphs of text (the list is tight). This macro will only be
-produced, when the <strong><code>fancyLists</code></strong> and
-<strong><code>tightLists</code></strong> options are enabled. The macro
+produced, when the <code><strong>fancyLists</strong></code> and
+<code><strong>tightLists</strong></code> options are enabled. The macro
receives two arguments: the style of the list item labels, and the style
of delimiters between list item labels and texts. See the
-<code>\markdownRendererFancyOlBegin</code> macro for the valid style
+<code>markdownRendererFancyOlBegin</code> macro for the valid style
values.</p>
-<p>The <code>\markdownRendererOlItem</code> macro represents an item in
+<p>The <code>markdownRendererOlItem</code> macro represents an item in
an ordered list. This macro will only be produced, when the
-<strong><code>startNumber</code></strong> option is disabled and the
-<strong><code>fancyLists</code></strong> option is disabled. The macro
+<code><strong>startNumber</strong></code> option is disabled and the
+<code><strong>fancyLists</strong></code> option is disabled. The macro
receives no arguments.</p>
-<p>The <code>\markdownRendererOlItemEnd</code> macro represents the end
+<p>The <code>markdownRendererOlItemEnd</code> macro represents the end
of an item in an ordered list. This macro will only be produced, when
-the <strong><code>fancyLists</code></strong> option is disabled. The
+the <code><strong>fancyLists</strong></code> option is disabled. The
macro receives no arguments.</p>
-<p>The <code>\markdownRendererOlItemWithNumber</code> macro represents
-an item in an ordered list. This macro will only be produced, when the
-<strong><code>startNumber</code></strong> option is enabled and the
-<strong><code>fancyLists</code></strong> option is disabled. The macro
+<p>The <code>markdownRendererOlItemWithNumber</code> macro represents an
+item in an ordered list. This macro will only be produced, when the
+<code><strong>startNumber</strong></code> option is enabled and the
+<code><strong>fancyLists</strong></code> option is disabled. The macro
receives a single numeric argument that corresponds to the item
number.</p>
-<p>The <code>\markdownRendererFancyOlItem</code> macro represents an
-item in a fancy ordered list. This macro will only be produced, when the
-<strong><code>startNumber</code></strong> option is disabled and the
-<strong><code>fancyLists</code></strong> option is enabled. The macro
+<p>The <code>markdownRendererFancyOlItem</code> macro represents an item
+in a fancy ordered list. This macro will only be produced, when the
+<code><strong>startNumber</strong></code> option is disabled and the
+<code><strong>fancyLists</strong></code> option is enabled. The macro
receives no arguments.</p>
-<p>The <code>\markdownRendererFancyOlItemEnd</code> macro represents the
+<p>The <code>markdownRendererFancyOlItemEnd</code> macro represents the
end of an item in a fancy ordered list. This macro will only be
-produced, when the <strong><code>fancyLists</code></strong> option is
+produced, when the <code><strong>fancyLists</strong></code> option is
enabled. The macro receives no arguments.</p>
-<p>The <code>\markdownRendererFancyOlItemWithNumber</code> macro
+<p>The <code>markdownRendererFancyOlItemWithNumber</code> macro
represents an item in a fancy ordered list. This macro will only be
-produced, when the <strong><code>startNumber</code></strong> and
-<strong><code>fancyLists</code></strong> options are enabled. The macro
+produced, when the <code><strong>startNumber</strong></code> and
+<code><strong>fancyLists</strong></code> options are enabled. The macro
receives a single numeric argument that corresponds to the item
number.</p>
-<p>The <code>\markdownRendererOlEnd</code> macro represents the end of
-an ordered list that contains an item with several paragraphs of text
-(the list is not tight). This macro will only be produced, when the
-<strong><code>fancyLists</code></strong> option is disabled. The macro
+<p>The <code>markdownRendererOlEnd</code> macro represents the end of an
+ordered list that contains an item with several paragraphs of text (the
+list is not tight). This macro will only be produced, when the
+<code><strong>fancyLists</strong></code> option is disabled. The macro
receives no arguments.</p>
-<p>The <code>\markdownRendererOlEndTight</code> macro represents the end
+<p>The <code>markdownRendererOlEndTight</code> macro represents the end
of an ordered list that contains no item with several paragraphs of text
(the list is tight). This macro will only be produced, when the
-<strong><code>tightLists</code></strong> option is enabled and the
-<strong><code>fancyLists</code></strong> option is disabled. The macro
+<code><strong>tightLists</strong></code> option is enabled and the
+<code><strong>fancyLists</strong></code> option is disabled. The macro
receives no arguments.</p>
-<p>The <code>\markdownRendererFancyOlEnd</code> macro represents the end
+<p>The <code>markdownRendererFancyOlEnd</code> macro represents the end
of a fancy ordered list that contains an item with several paragraphs of
text (the list is not tight). This macro will only be produced, when the
-<strong><code>fancyLists</code></strong> option is enabled. The macro
+<code><strong>fancyLists</strong></code> option is enabled. The macro
receives no arguments.</p>
-<p>The <code>\markdownRendererFancyOlEndTight</code> macro represents
-the end of a fancy ordered list that contains no item with several
+<p>The <code>markdownRendererFancyOlEndTight</code> macro represents the
+end of a fancy ordered list that contains no item with several
paragraphs of text (the list is tight). This macro will only be
-produced, when the <strong><code>fancyLists</code></strong> and
-<strong><code>tightLists</code></strong> options are enabled. The macro
+produced, when the <code><strong>fancyLists</strong></code> and
+<code><strong>tightLists</strong></code> options are enabled. The macro
receives no arguments.</p>
<h5 class="unnumbered" id="plain-tex-example-39">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -11579,18 +11622,18 @@ item).</p>
</blockquote>
<h4 data-number="2.3.1.31" id="raw-content-renderers"><span
class="header-section-number">2.3.1.31</span> Raw Content Renderers</h4>
-<p>The <code>\markdownRendererInputRawInline</code> macro represents an
+<p>The <code>markdownRendererInputRawInline</code> macro represents an
inline raw span. The macro receives two arguments: the filename of a
file containing the inline raw span contents and the raw attribute that
designates the format of the inline raw span. This macro will only be
-produced, when the <strong><code>rawAttribute</code></strong> option is
+produced, when the <code><strong>rawAttribute</strong></code> option is
enabled.</p>
-<p>The <code>\markdownRendererInputRawBlock</code> macro represents a
-raw block. The macro receives two arguments: the filename of a file
+<p>The <code>markdownRendererInputRawBlock</code> macro represents a raw
+block. The macro receives two arguments: the filename of a file
containing the raw block and the raw attribute that designates the
format of the raw block. This macro will only be produced, when the
-<strong><code>rawAttribute</code></strong> and
-<strong><code>fencedCode</code></strong> options are enabled.</p>
+<code><strong>rawAttribute</strong></code> and
+<code><strong>fencedCode</strong></code> options are enabled.</p>
<h5 class="unnumbered" id="latex-example-89"><span
class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5>
<p>Using a text editor, create a text document named
@@ -11637,13 +11680,13 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.32" id="section-renderers"><span
class="header-section-number">2.3.1.32</span> Section Renderers</h4>
-<p>The <code>\markdownRendererSectionBegin</code> and
-<code>\markdownRendererSectionEnd</code> macros represent the beginning
+<p>The <code>markdownRendererSectionBegin</code> and
+<code>markdownRendererSectionEnd</code> macros represent the beginning
and the end of a section based on headings.</p>
<h4 data-number="2.3.1.33" id="replacement-character-renderers"><span
class="header-section-number">2.3.1.33</span> Replacement Character
Renderers</h4>
-<p>The <code>\markdownRendererReplacementCharacter</code> macro
+<p>The <code>markdownRendererReplacementCharacter</code> macro
represents the U+0000 and U+FFFD Unicode characters. The macro receives
no arguments.</p>
<h4 data-number="2.3.1.34" id="special-character-renderers"><span
@@ -11654,27 +11697,27 @@ class="tex">T<sub>e</sub>X</span> characters, including the active pipe
character (<code>|</code>) of Con<span
class="tex">T<sub>e</sub>X</span>t, in the input text:</p>
<ul>
-<li><code>\markdownRendererAmpersand</code> replaces the ampersand
+<li><code>markdownRendererAmpersand</code> replaces the ampersand
(<code>&amp;</code>).</li>
-<li><code>\markdownRendererBackslash</code> replaces the backslash
+<li><code>markdownRendererBackslash</code> replaces the backslash
(<code>\</code>).</li>
-<li><code>\markdownRendererCircumflex</code> replaces the circumflex
+<li><code>markdownRendererCircumflex</code> replaces the circumflex
(<code>^</code>).</li>
-<li><code>\markdownRendererDollarSign</code> replaces the dollar sign
+<li><code>markdownRendererDollarSign</code> replaces the dollar sign
(<code>$</code>).</li>
-<li><code>\markdownRendererHash</code> replaces the hash sign
+<li><code>markdownRendererHash</code> replaces the hash sign
(<code>#</code>).</li>
-<li><code>\markdownRendererLeftBrace</code> replaces the left brace
+<li><code>markdownRendererLeftBrace</code> replaces the left brace
(<code>{</code>).</li>
-<li><code>\markdownRendererPercentSign</code> replaces the percent sign
+<li><code>markdownRendererPercentSign</code> replaces the percent sign
(<code>%</code>).</li>
-<li><code>\markdownRendererPipe</code> replaces the pipe character
+<li><code>markdownRendererPipe</code> replaces the pipe character
(<code>|</code>).</li>
-<li><code>\markdownRendererRightBrace</code> replaces the right brace
+<li><code>markdownRendererRightBrace</code> replaces the right brace
(<code>}</code>).</li>
-<li><code>\markdownRendererTilde</code> replaces the tilde
+<li><code>markdownRendererTilde</code> replaces the tilde
(<code>~</code>).</li>
-<li><code>\markdownRendererUnderscore</code> replaces the underscore
+<li><code>markdownRendererUnderscore</code> replaces the underscore
(<code>_</code>).</li>
</ul>
<h5 class="unnumbered" id="plain-tex-example-40">Plain <span
@@ -11756,10 +11799,10 @@ non-breaking space:</p>
<h4 data-number="2.3.1.35" id="strike-through-renderer"><span
class="header-section-number">2.3.1.35</span> Strike-Through
Renderer</h4>
-<p>The <code>\markdownRendererStrikeThrough</code> macro represents a
+<p>The <code>markdownRendererStrikeThrough</code> macro represents a
strike-through span of text. The macro receives a single argument that
corresponds to the striked-out span of text. This macro will only be
-produced, when the <strong><code>strikeThrough</code></strong> option is
+produced, when the <code><strong>strikeThrough</strong></code> option is
enabled.</p>
<h5 class="unnumbered" id="plain-tex-example-41">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -11831,10 +11874,10 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.36" id="subscript-renderer"><span
class="header-section-number">2.3.1.36</span> Subscript Renderer</h4>
-<p>The <code>\markdownRendererSubscript</code> macro represents a
+<p>The <code>markdownRendererSubscript</code> macro represents a
subscript span of text. The macro receives a single argument that
corresponds to the subscript span of text. This macro will only be
-produced, when the <strong><code>subscripts</code></strong> option is
+produced, when the <code><strong>subscripts</strong></code> option is
enabled.</p>
<h5 class="unnumbered" id="plain-tex-example-42">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -11904,10 +11947,10 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.37" id="superscript-renderer"><span
class="header-section-number">2.3.1.37</span> Superscript Renderer</h4>
-<p>The <code>\markdownRendererSuperscript</code> macro represents a
+<p>The <code>markdownRendererSuperscript</code> macro represents a
superscript span of text. The macro receives a single argument that
corresponds to the superscript span of text. This macro will only be
-produced, when the <strong><code>superscripts</code></strong> option is
+produced, when the <code><strong>superscripts</strong></code> option is
enabled.</p>
<h5 class="unnumbered" id="plain-tex-example-43">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -11979,10 +12022,10 @@ contain the following text:</p>
class="header-section-number">2.3.1.38</span> Table Attribute Context
Renderers</h4>
<p>The following macros are only produced, when the
-<strong><code>tableCaptions</code></strong> and
-<strong><code>tableAttributes</code></strong> options are enabled.</p>
-<p>The <code>\markdownRendererTableAttributeContextBegin</code> and
-<code>\markdownRendererTableAttributeContextEnd</code> macros represent
+<code><strong>tableCaptions</strong></code> and
+<code><strong>tableAttributes</strong></code> options are enabled.</p>
+<p>The <code>markdownRendererTableAttributeContextBegin</code> and
+<code>markdownRendererTableAttributeContextEnd</code> macros represent
the beginning and the end of a context in which the attributes of a
table apply. The macros receive no arguments.</p>
<h5 class="unnumbered" id="latex-example-94"><span
@@ -12078,9 +12121,9 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.39" id="table-renderer"><span
class="header-section-number">2.3.1.39</span> Table Renderer</h4>
-<p>The <code>\markdownRendererTable</code> macro represents a table.
-This macro will only be produced, when the
-<strong><code>pipeTables</code></strong> option is enabled. The macro
+<p>The <code>markdownRendererTable</code> macro represents a table. This
+macro will only be produced, when the
+<code><strong>pipeTables</strong></code> option is enabled. The macro
receives the parameters
<code>{</code>⟨<em>caption</em>⟩<code>}{</code>⟨<em>number of
rows</em>⟩<code>}{</code>⟨<em>number of columns</em>⟩<code>}</code>
@@ -12184,14 +12227,14 @@ column number 3 says <em>1</em>, and column number 4 says
<h4 data-number="2.3.1.40" id="tex-math-renderers"><span
class="header-section-number">2.3.1.40</span> <span
class="tex">T<sub>e</sub>X</span> Math Renderers</h4>
-<p>The <code>\markdownRendererInlineMath</code> and
-<code>\markdownRendererDisplayMath</code> macros represent inline and
+<p>The <code>markdownRendererInlineMath</code> and
+<code>markdownRendererDisplayMath</code> macros represent inline and
display <span class="tex">T<sub>e</sub>X</span> math. Both macros
receive a single argument that corresponds to the <span
class="tex">T<sub>e</sub>X</span> math content. These macros will only
-be produced, when the <strong><code>texMathDollars</code></strong>,
-<strong><code>texMathSingleBackslash</code></strong>, or
-<strong><code>texMathDoubleBackslash</code></strong> option are
+be produced, when the <code><strong>texMathDollars</strong></code>,
+<code><strong>texMathSingleBackslash</strong></code>, or
+<code><strong>texMathDoubleBackslash</strong></code> option are
enabled.</p>
<h5 class="unnumbered" id="plain-tex-example-44">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -12277,7 +12320,7 @@ class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup>
<h4 data-number="2.3.1.41" id="thematic-break-renderer"><span
class="header-section-number">2.3.1.41</span> Thematic Break
Renderer</h4>
-<p>The <code>\markdownRendererThematicBreak</code> macro represents a
+<p>The <code>markdownRendererThematicBreak</code> macro represents a
thematic break. The macro receives no arguments.</p>
<h5 class="unnumbered" id="plain-tex-example-45">Plain <span
class="tex">T<sub>e</sub>X</span> Example</h5>
@@ -12363,11 +12406,11 @@ contain the following text:</p>
</blockquote>
<h4 data-number="2.3.1.42" id="tickbox-renderers"><span
class="header-section-number">2.3.1.42</span> Tickbox Renderers</h4>
-<p>The macros named <code>\markdownRendererTickedBox</code>,
-<code>\markdownRendererHalfTickedBox</code>, and
-<code>\markdownRendererUntickedBox</code> represent ticked and unticked
+<p>The macros named <code>markdownRendererTickedBox</code>,
+<code>markdownRendererHalfTickedBox</code>, and
+<code>markdownRendererUntickedBox</code> represent ticked and unticked
boxes, respectively. These macros will either be produced, when the
-<strong><code>taskLists</code></strong> option is enabled, or when the
+<code><strong>taskLists</strong></code> option is enabled, or when the
Ballot Box with X (☒, U+2612), Hourglass (⌛, U+231B) or Ballot Box (☐,
U+2610) Unicode characters are encountered in the markdown input,
respectively.</p>
@@ -12427,62 +12470,91 @@ contain the following text:</p>
<li>Yes I can!</li>
</ul>
</blockquote>
-<h4 data-number="2.3.1.43" id="yamlmetadatarenderers"><span
-class="header-section-number">2.3.1.43</span> YAML Metadata
+<h4 data-number="2.3.1.43" id="warning-and-error-renderers"><span
+class="header-section-number">2.3.1.43</span> Warning and Error
+Renderers</h4>
+<p>The <code>markdownRendererWarning</code> and
+<code>markdownRendererError</code> macros represent warnings and errors
+produced by the markdown parser. Both macros receive a single parameter
+with the text of the warning or error.</p>
+<h4 data-number="2.3.1.44" id="yamlmetadatarenderers"><span
+class="header-section-number">2.3.1.44</span> YAML Metadata
Renderers</h4>
-<p>The <code>\markdownRendererJekyllDataBegin</code> macro represents
-the beginning of a <abbr>yaml</abbr> document. This macro will only be
-produced when the <strong><code>jekyllData</code></strong> option is
+<p>The <code>markdownRendererJekyllDataBegin</code> macro represents the
+beginning of a <abbr>yaml</abbr> document. This macro will only be
+produced when the <code><strong>jekyllData</strong></code> option is
enabled. The macro receives no arguments.</p>
-<p>The <code>\markdownRendererJekyllDataEnd</code> macro represents the
+<p>The <code>markdownRendererJekyllDataEnd</code> macro represents the
end of a <abbr>yaml</abbr> document. This macro will only be produced
-when the <strong><code>jekyllData</code></strong> option is enabled. The
+when the <code><strong>jekyllData</strong></code> option is enabled. The
macro receives no arguments.</p>
-<p>The <code>\markdownRendererJekyllDataMappingBegin</code> macro
+<p>The <code>markdownRendererJekyllDataMappingBegin</code> macro
represents the beginning of a mapping in a <abbr>yaml</abbr> document.
This macro will only be produced when the
-<strong><code>jekyllData</code></strong> option is enabled. The macro
+<code><strong>jekyllData</strong></code> option is enabled. The macro
receives two arguments: the scalar key in the parent structure, cast to
a string following <abbr>yaml</abbr> serialization rules, and the number
of items in the mapping.</p>
-<p>The <code>\markdownRendererJekyllDataMappingEnd</code> macro
+<p>The <code>markdownRendererJekyllDataMappingEnd</code> macro
represents the end of a mapping in a <abbr>yaml</abbr> document. This
macro will only be produced when the
-<strong><code>jekyllData</code></strong> option is enabled. The macro
+<code><strong>jekyllData</strong></code> option is enabled. The macro
receives no arguments.</p>
-<p>The <code>\markdownRendererJekyllDataSequenceBegin</code> macro
+<p>The <code>markdownRendererJekyllDataSequenceBegin</code> macro
represents the beginning of a sequence in a <abbr>yaml</abbr> document.
This macro will only be produced when the
-<strong><code>jekyllData</code></strong> option is enabled. The macro
+<code><strong>jekyllData</strong></code> option is enabled. The macro
receives two arguments: the scalar key in the parent structure, cast to
a string following <abbr>yaml</abbr> serialization rules, and the number
of items in the sequence.</p>
-<p>The <code>\markdownRendererJekyllDataSequenceEnd</code> macro
+<p>The <code>markdownRendererJekyllDataSequenceEnd</code> macro
represents the end of a sequence in a <abbr>yaml</abbr> document. This
macro will only be produced when the
-<strong><code>jekyllData</code></strong> option is enabled. The macro
+<code><strong>jekyllData</strong></code> option is enabled. The macro
receives no arguments.</p>
-<p>The <code>\markdownRendererJekyllDataBoolean</code> macro represents
-a boolean scalar value in a <abbr>yaml</abbr> document. This macro will
-only be produced when the <strong><code>jekyllData</code></strong>
+<p>The <code>markdownRendererJekyllDataBoolean</code> macro represents a
+boolean scalar value in a <abbr>yaml</abbr> document. This macro will
+only be produced when the <code><strong>jekyllData</strong></code>
option is enabled. The macro receives two arguments: the scalar key in
the parent structure, and the scalar value, both cast to a string
following <abbr>yaml</abbr> serialization rules.</p>
-<p>The <code>\markdownRendererJekyllDataNumber</code> macro represents a
+<p>The <code>markdownRendererJekyllDataNumber</code> macro represents a
numeric scalar value in a <abbr>yaml</abbr> document. This macro will
-only be produced when the <strong><code>jekyllData</code></strong>
+only be produced when the <code><strong>jekyllData</strong></code>
option is enabled. The macro receives two arguments: the scalar key in
the parent structure, and the scalar value, both cast to a string
following <abbr>yaml</abbr> serialization rules.</p>
-<p>The <code>\markdownRendererJekyllDataString</code> macro represents a
-string scalar value in a <abbr>yaml</abbr> document. This macro will
-only be produced when the <strong><code>jekyllData</code></strong>
-option is enabled. The macro receives two arguments: the scalar key in
-the parent structure, cast to a string following <abbr>yaml</abbr>
-serialization rules, and the scalar value.</p>
-<p>The <code>\markdownRendererJekyllDataEmpty</code> macro represents an
+<p>The <code>markdownRendererJekyllDataTypographicString</code> and
+<code>markdownRendererJekyllDataProgrammaticString</code> macros
+represent string scalar values in a <abbr>yaml</abbr> document. This
+macro will only be produced when the
+<code><strong>jekyllData</strong></code> option is enabled. The macro
+receives two arguments: the scalar key in the parent structure, cast to
+a string following <abbr>yaml</abbr> serialization rules, and the scalar
+value.</p>
+<p>For each string scalar value, both macros are produced. Whereas
+<code>markdownRendererJekyllDataTypographicString</code> receives the
+scalar value after all markdown markup and special <span
+class="tex">T<sub>e</sub>X</span> characters in the string have been
+replaced by <span class="tex">T<sub>e</sub>X</span> macros,
+<code>markdownRendererJekyllDataProgrammaticString</code> receives the
+raw scalar value. Therefore, whereas the
+<code>markdownRendererJekyllDataTypographicString</code> macro is more
+appropriate for texts that are supposed to be typeset with <span
+class="tex">T<sub>e</sub>X</span>, such as document titles, author
+names, or exam questions, the
+<code>markdownRendererJekyllDataProgrammaticString</code> macro is more
+appropriate for identifiers and other programmatic text that won’t be
+typeset by <span class="tex">T<sub>e</sub>X</span>.</p>
+<p>Before Markdown 3.7.0, the
+<code>markdownRendererJekyllDataTypographicString</code> macro was named
+<code>markdownRendererJekyllDataString</code> and the
+<code>markdownRendererJekyllDataProgrammaticString</code> macro was not
+produced. The <code>markdownRendererJekyllDataString</code> has been
+deprecated and will be removed in Markdown 4.0.0.</p>
+<p>The <code>markdownRendererJekyllDataEmpty</code> macro represents an
empty scalar value in a <abbr>yaml</abbr> document. This macro will only
-be produced when the <strong><code>jekyllData</code></strong> option is
+be produced when the <code><strong>jekyllData</strong></code> option is
enabled. The macro receives one argument: the scalar key in the parent
structure, cast to a string following <abbr>yaml</abbr> serialization
rules.</p>
@@ -12493,7 +12565,7 @@ class="tex">T<sub>e</sub>X</span> Example</h5>
<div class="sourceCode" id="cb664"><pre
class="sourceCode tex"><code class="sourceCode latex"><span id="cb664-1"><a href="#cb664-1" aria-hidden="true" tabindex="-1"></a><span class="fu">\input</span> markdown</span>
<span id="cb664-2"><a href="#cb664-2" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownOptionJekyllData</span>{true}</span>
-<span id="cb664-3"><a href="#cb664-3" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataString</span>#1#2{<span class="fu">\gdef\name</span>{#2}}</span>
+<span id="cb664-3"><a href="#cb664-3" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataTypographicString</span>#1#2{<span class="fu">\gdef\name</span>{#2}}</span>
<span id="cb664-4"><a href="#cb664-4" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataNumber</span>#1#2{<span class="fu">\gdef\age</span>{#2}}</span>
<span id="cb664-5"><a href="#cb664-5" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataEnd</span>{<span class="co">%</span></span>
<span id="cb664-6"><a href="#cb664-6" aria-hidden="true" tabindex="-1"></a> <span class="fu">\name</span>{} is <span class="fu">\age</span>{} years old.}</span>
@@ -12521,7 +12593,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb666-1"><a href
<span id="cb666-2"><a href="#cb666-2" aria-hidden="true" tabindex="-1"></a><span class="bu">\usepackage</span>[jekyllData]{<span class="ex">markdown</span>}</span>
<span id="cb666-3"><a href="#cb666-3" aria-hidden="true" tabindex="-1"></a><span class="fu">\markdownSetup</span>{</span>
<span id="cb666-4"><a href="#cb666-4" aria-hidden="true" tabindex="-1"></a> renderers = {</span>
-<span id="cb666-5"><a href="#cb666-5" aria-hidden="true" tabindex="-1"></a> jekyllDataString = {<span class="fu">\gdef\name</span>{#2}},</span>
+<span id="cb666-5"><a href="#cb666-5" aria-hidden="true" tabindex="-1"></a> jekyllDataTypographicString = {<span class="fu">\gdef\name</span>{#2}},</span>
<span id="cb666-6"><a href="#cb666-6" aria-hidden="true" tabindex="-1"></a> jekyllDataNumber = {<span class="fu">\gdef\age</span>{#2}},</span>
<span id="cb666-7"><a href="#cb666-7" aria-hidden="true" tabindex="-1"></a> jekyllDataEnd = {<span class="fu">\name</span>{} is <span class="fu">\age</span>{} years old.},</span>
<span id="cb666-8"><a href="#cb666-8" aria-hidden="true" tabindex="-1"></a> }</span>
@@ -12551,7 +12623,7 @@ class="tex">T<sub>e</sub>X</span>t Example</h5>
<div class="sourceCode" id="cb668"><pre
class="sourceCode tex"><code class="sourceCode latex"><span id="cb668-1"><a href="#cb668-1" aria-hidden="true" tabindex="-1"></a><span class="fu">\usemodule</span>[t][markdown]</span>
<span id="cb668-2"><a href="#cb668-2" aria-hidden="true" tabindex="-1"></a><span class="fu">\setupmarkdown</span>[jekyllData = yes]</span>
-<span id="cb668-3"><a href="#cb668-3" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataString</span>#1#2{<span class="fu">\gdef\name</span>{#2}}</span>
+<span id="cb668-3"><a href="#cb668-3" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataTypographicString</span>#1#2{<span class="fu">\gdef\name</span>{#2}}</span>
<span id="cb668-4"><a href="#cb668-4" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataNumber</span>#1#2{<span class="fu">\gdef\age</span>{#2}}</span>
<span id="cb668-5"><a href="#cb668-5" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataEnd</span>{<span class="co">%</span></span>
<span id="cb668-6"><a href="#cb668-6" aria-hidden="true" tabindex="-1"></a> <span class="fu">\name</span>{} is <span class="fu">\age</span>{} years old.}</span>
diff --git a/macros/generic/markdown/markdown.ins b/macros/generic/markdown/markdown.ins
index 4261ddfdd4..152fe4832b 100644
--- a/macros/generic/markdown/markdown.ins
+++ b/macros/generic/markdown/markdown.ins
@@ -2,7 +2,8 @@
\generate{
\usepreamble\luapreamble
\usepostamble\luapostamble
- \file{markdown.lua}{\from{markdown.dtx}{lua}}
+ \file{markdown.lua}{\from{markdown.dtx}{lua-loader}}
+ \file{markdown-parser.lua}{\from{markdown.dtx}{lua}}
\file{markdown-cli.lua}{\from{markdown.dtx}{lua-cli}}
\usepreamble\texpreamble
\usepostamble\texpostamble
@@ -14,7 +15,7 @@
\file{markdownthemewitiko_tilde.tex}{\from{markdown.dtx}{themes-witiko-tilde}}
\file{markdownthemewitiko_markdown_defaults.tex}{\from{markdown.dtx}{themes-witiko-markdown-defaults-tex}}
\file{markdownthemewitiko_markdown_defaults.sty}{\from{markdown.dtx}{themes-witiko-markdown-defaults-latex}}
- \file{t-markdownthemewitiko_markdown_defaults.tex}{\from{markdown.dtx}{themes-witiko-markdown-defaults-context}}
+ \file{t-markdownthemewitiko_markdown_defaults.tex}{\from{markdown.dtx}{themes-witiko-markdown-defaults-ctx}}
\file{markdownthemewitiko_markdown_techdoc.sty}{\from{markdown.dtx}{themes-witiko-markdown-techdoc}}
\usepreamble\empty
\usepostamble\empty
@@ -25,6 +26,6 @@
\file{markdown.css}{\from{markdown.dtx}{manual-css}}
\file{markdown-figure-block-diagram.tex}{\from{markdown.dtx}{techdoc-block-diagram}}
\file{markdown.bib}{\from{markdown.dtx}{techdoc-bibliography}}
- \file{DEPENDS.txt}{\from{markdown.dtx}{depends}}
+ \file{DEPENDS-raw.txt}{\from{markdown.dtx}{depends}}
}
\endbatchfile
diff --git a/macros/generic/markdown/markdown.pdf b/macros/generic/markdown/markdown.pdf
index 3787cdbe80..f8522dab51 100644
--- a/macros/generic/markdown/markdown.pdf
+++ b/macros/generic/markdown/markdown.pdf
Binary files differ