summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/luatex/markdown/markdown.lua
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2022-10-04 19:52:01 +0000
committerKarl Berry <karl@freefriends.org>2022-10-04 19:52:01 +0000
commit0a699b79f2bd98ae97c6a6e007a5fdeb5d40a800 (patch)
treebaf533a397ae8250c605710b9a301a4441b5619f /Master/texmf-dist/tex/luatex/markdown/markdown.lua
parentfc8804ff77020ea4f918b632bcfde3e1e4b26667 (diff)
markdown (4oct22)
git-svn-id: svn://tug.org/texlive/trunk@64609 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/luatex/markdown/markdown.lua')
-rw-r--r--Master/texmf-dist/tex/luatex/markdown/markdown.lua137
1 files changed, 117 insertions, 20 deletions
diff --git a/Master/texmf-dist/tex/luatex/markdown/markdown.lua b/Master/texmf-dist/tex/luatex/markdown/markdown.lua
index 2081d0d3ff5..9ad26df6dbe 100644
--- a/Master/texmf-dist/tex/luatex/markdown/markdown.lua
+++ b/Master/texmf-dist/tex/luatex/markdown/markdown.lua
@@ -58,7 +58,7 @@
-- those in the standard .ins files.
--
local metadata = {
- version = "2.17.0-0-g6428569",
+ version = "2.17.1-0-g8ca83f5",
comment = "A module for the conversion from markdown to plain TeX",
author = "John MacFarlane, Hans Hagen, Vít Novotný",
copyright = {"2009-2016 John MacFarlane, Hans Hagen",
@@ -113,6 +113,8 @@ local walkable_syntax = {
}
local defaultOptions = {}
defaultOptions.cacheDir = "."
+defaultOptions.contentBlocksLanguageMap = "markdown-languages.json"
+defaultOptions.debugExtensionsFileName = "debug-extensions.json"
defaultOptions.frozenCacheFileName = "frozenCache.tex"
defaultOptions.blankBeforeBlockquote = false
defaultOptions.blankBeforeCodeFence = false
@@ -122,10 +124,10 @@ defaultOptions.citationNbsps = true
defaultOptions.citations = false
defaultOptions.codeSpans = true
defaultOptions.contentBlocks = false
-defaultOptions.contentBlocksLanguageMap = "markdown-languages.json"
+defaultOptions.debugExtensions = false
defaultOptions.definitionLists = false
defaultOptions.eagerCache = true
-metadata.user_extension_api_version = 1
+metadata.user_extension_api_version = 2
metadata.grammar_version = 1
defaultOptions.extensions = {}
defaultOptions.expectJekyllData = false
@@ -188,6 +190,11 @@ function util.table_copy(t)
for k, v in pairs(t) do u[k] = v end
return setmetatable(u, getmetatable(t))
end
+function util.encode_json_string(s)
+ s = s:gsub([[\]], [[\\]])
+ s = s:gsub([["]], [[\"]])
+ return [["]] .. s .. [["]]
+end
util.lookup_files = (function()
local ran_ok, kpse = pcall(require, "kpse")
if ran_ok then
@@ -3630,7 +3637,9 @@ function M.reader.new(writer, options)
end
return local_walkable_syntax
end)(walkable_syntax)
- self.insert_pattern = function(selector, pattern)
+ 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+)$")
assert(lhs ~= nil,
[[Expected selector in form "LHS (before|after|instead of) RHS", not "]]
@@ -3654,10 +3663,19 @@ function M.reader.new(writer, options)
assert(index ~= nil,
[[Rule ]] .. lhs .. [[ -> ]] .. rhs
.. [[ does not exist in markdown grammar]])
+ local accountable_pattern
+ if current_extension_name then
+ accountable_pattern = { pattern, current_extension_name, pattern_name }
+ else
+ assert(type(pattern) == "string",
+ [[reader->insert_pattern() was called outside an extension with ]]
+ .. [[a PEG pattern instead of a rule name]])
+ accountable_pattern = pattern
+ end
if pos == "instead of" then
- rule[index] = pattern
+ rule[index] = accountable_pattern
else
- table.insert(rule, index, pattern)
+ table.insert(rule, index, accountable_pattern)
end
end
local syntax =
@@ -3709,9 +3727,11 @@ function M.reader.new(writer, options)
SpecialChar = parsers.fail,
}
self.update_rule = function(rule_name, pattern)
+ assert(current_extension_name ~= nil)
assert(syntax[rule_name] ~= nil,
[[Rule ]] .. rule_name .. [[ -> ... does not exist in markdown grammar]])
- walkable_syntax[rule_name] = { pattern }
+ local accountable_pattern = { pattern, current_extension_name, rule_name }
+ walkable_syntax[rule_name] = { accountable_pattern }
end
local special_characters = {}
self.add_special_character = function(c)
@@ -3727,9 +3747,59 @@ function M.reader.new(writer, options)
self.add_special_character("!")
self.add_special_character("\\")
for _, extension in ipairs(extensions) do
+ current_extension_name = extension.name
extension.extend_writer(writer)
extension.extend_reader(self)
end
+ current_extension_name = nil
+ if options.debugExtensions then
+ local sorted_lhs = {}
+ for lhs, _ in pairs(walkable_syntax) do
+ table.insert(sorted_lhs, lhs)
+ end
+ table.sort(sorted_lhs)
+
+ local output_lines = {"{"}
+ for lhs_index, lhs in ipairs(sorted_lhs) do
+ local encoded_lhs = util.encode_json_string(lhs)
+ table.insert(output_lines, [[ ]] ..encoded_lhs .. [[: []])
+ local rule = walkable_syntax[lhs]
+ for rhs_index, rhs in ipairs(rule) do
+ local human_readable_rhs
+ if type(rhs) == "string" then
+ human_readable_rhs = rhs
+ else
+ local pattern_name
+ if rhs[3] then
+ pattern_name = rhs[3]
+ else
+ pattern_name = "Anonymous Pattern"
+ end
+ local extension_name = rhs[2]
+ human_readable_rhs = pattern_name .. [[ (]] .. extension_name .. [[)]]
+ end
+ local encoded_rhs = util.encode_json_string(human_readable_rhs)
+ local output_line = [[ ]] .. encoded_rhs
+ if rhs_index < #rule then
+ output_line = output_line .. ","
+ end
+ table.insert(output_lines, output_line)
+ end
+ local output_line = " ]"
+ if lhs_index < #sorted_lhs then
+ output_line = output_line .. ","
+ end
+ table.insert(output_lines, output_line)
+ end
+ table.insert(output_lines, "}")
+
+ 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]])
+ assert(output_file:write(output))
+ assert(output_file:close())
+ end
walkable_syntax["IndentedInline"] = util.table_copy(
walkable_syntax["Inline"])
self.insert_pattern(
@@ -3742,7 +3812,10 @@ function M.reader.new(writer, options)
if type(rhs) == "string" then
pattern = V(rhs)
else
- pattern = rhs
+ pattern = rhs[1]
+ if type(pattern) == "string" then
+ pattern = V(pattern)
+ end
end
syntax[lhs] = syntax[lhs] + pattern
end
@@ -3863,6 +3936,7 @@ M.extensions.citations = function(citation_nbsps)
["#"] = "\\markdownRendererHash{}",
}
return {
+ name = "built-in citations syntax extension",
extend_writer = function(self)
local options = self.options
@@ -3992,7 +4066,8 @@ M.extensions.citations = function(citation_nbsps)
local Citations = TextCitations + ParenthesizedCitations
- self.insert_pattern("Inline after Emph", Citations)
+ self.insert_pattern("Inline after Emph",
+ Citations, "Citations")
self.add_special_character("@")
self.add_special_character("-")
@@ -4023,6 +4098,7 @@ M.extensions.content_blocks = function(language_map)
end)()
return {
+ name = "built-in content_blocks syntax extension",
extend_writer = function(self)
function self.contentblock(src,suf,type,tit)
if not self.is_writing then return "" end
@@ -4121,12 +4197,14 @@ M.extensions.content_blocks = function(language_map)
* contentblock_tail
/ writer.contentblock
- self.insert_pattern("Block before Blockquote", ContentBlock)
+ self.insert_pattern("Block before Blockquote",
+ ContentBlock, "ContentBlock")
end
}
end
M.extensions.definition_lists = function(tight_lists)
return {
+ name = "built-in definition_lists syntax extension",
extend_writer = function(self)
local function dlitem(term, defs)
local retVal = {"\\markdownRendererDlItem{",term,"}"}
@@ -4196,12 +4274,14 @@ M.extensions.definition_lists = function(tight_lists)
* -DefinitionListItemLoose * Cc(true))
) / writer.definitionlist
- self.insert_pattern("Block after Heading", DefinitionList)
+ self.insert_pattern("Block after Heading",
+ DefinitionList, "DefinitionList")
end
}
end
M.extensions.fenced_code = function(blank_before_code_fence)
return {
+ name = "built-in fenced_code syntax extension",
extend_writer = function(self)
local options = self.options
@@ -4276,7 +4356,7 @@ M.extensions.fenced_code = function(blank_before_code_fence)
end
self.insert_pattern("Block after Verbatim",
- FencedCode)
+ FencedCode, "FencedCode")
local fencestart
if blank_before_code_fence then
@@ -4296,6 +4376,7 @@ end
M.extensions.footnotes = function(footnotes, inline_footnotes)
assert(footnotes or inline_footnotes)
return {
+ name = "built-in footnotes syntax extension",
extend_writer = function(self)
function self.note(s)
return {"\\markdownRendererFootnote{",s,"}"}
@@ -4310,7 +4391,8 @@ M.extensions.footnotes = function(footnotes, inline_footnotes)
* (parsers.tag / self.parser_functions.parse_inlines_no_inline_note)
/ writer.note
- self.insert_pattern("Inline after Emph", InlineNote)
+ self.insert_pattern("Inline after Emph",
+ InlineNote, "InlineNote")
end
if footnotes then
local function strip_first_char(s)
@@ -4352,7 +4434,8 @@ M.extensions.footnotes = function(footnotes, inline_footnotes)
local Blank = NoteBlock + parsers.Blank
self.update_rule("Blank", Blank)
- self.insert_pattern("Inline after Emph", NoteRef)
+ self.insert_pattern("Inline after Emph",
+ NoteRef, "NoteRef")
end
self.add_special_character("^")
@@ -4361,6 +4444,7 @@ M.extensions.footnotes = function(footnotes, inline_footnotes)
end
M.extensions.header_attributes = function()
return {
+ name = "built-in header_attributes syntax extension",
extend_writer = function()
end, extend_reader = function(self)
local parsers = self.parsers
@@ -4415,6 +4499,7 @@ M.extensions.header_attributes = function()
end
M.extensions.jekyll_data = function(expect_jekyll_data)
return {
+ name = "built-in jekyll_data syntax extension",
extend_writer = function(self)
function self.jekyllData(d, t, p)
if not self.is_writing then return "" end
@@ -4535,7 +4620,8 @@ M.extensions.jekyll_data = function(expect_jekyll_data)
* JekyllData
* (P("---") + P("..."))^-1
- self.insert_pattern("Block before Blockquote", UnexpectedJekyllData)
+ self.insert_pattern("Block before Blockquote",
+ UnexpectedJekyllData, "UnexpectedJekyllData")
if expect_jekyll_data then
self.update_rule("ExpectedJekyllData", ExpectedJekyllData)
end
@@ -4598,6 +4684,7 @@ M.extensions.pipe_tables = function(table_captions)
end
return {
+ name = "built-in pipe_tables syntax extension",
extend_writer = function(self)
function self.table(rows, caption)
if not self.is_writing then return "" end
@@ -4677,12 +4764,14 @@ M.extensions.pipe_tables = function(table_captions)
* table_caption^-1
/ writer.table
- self.insert_pattern("Block after Blockquote", PipeTable)
+ self.insert_pattern("Block after Blockquote",
+ PipeTable, "PipeTable")
end
}
end
M.extensions.strike_through = function()
return {
+ name = "built-in strike_through syntax extension",
extend_writer = function(self)
function self.strike_through(s)
return {"\\markdownRendererStrikeThrough{",s,"}"}
@@ -4696,7 +4785,8 @@ M.extensions.strike_through = function()
parsers.doubletildes)
) / writer.strike_through
- self.insert_pattern("Inline after Emph", StrikeThrough)
+ self.insert_pattern("Inline after Emph",
+ StrikeThrough, "StrikeThrough")
self.add_special_character("~")
end
@@ -4704,6 +4794,7 @@ M.extensions.strike_through = function()
end
M.extensions.superscripts = function()
return {
+ name = "built-in superscripts syntax extension",
extend_writer = function(self)
function self.superscript(s)
return {"\\markdownRendererSuperscript{",s,"}"}
@@ -4716,7 +4807,8 @@ M.extensions.superscripts = function()
parsers.between(parsers.Str, parsers.circumflex, parsers.circumflex)
) / writer.superscript
- self.insert_pattern("Inline after Emph", Superscript)
+ self.insert_pattern("Inline after Emph",
+ Superscript, "Superscript")
self.add_special_character("^")
end
@@ -4724,6 +4816,7 @@ M.extensions.superscripts = function()
end
M.extensions.subscripts = function()
return {
+ name = "built-in subscripts syntax extension",
extend_writer = function(self)
function self.subscript(s)
return {"\\markdownRendererSubscript{",s,"}"}
@@ -4736,7 +4829,8 @@ M.extensions.subscripts = function()
parsers.between(parsers.Str, parsers.tilde, parsers.tilde)
) / writer.subscript
- self.insert_pattern("Inline after Emph", Subscript)
+ self.insert_pattern("Inline after Emph",
+ Subscript, "Subscript")
self.add_special_character("~")
end
@@ -4744,6 +4838,7 @@ M.extensions.subscripts = function()
end
M.extensions.fancy_lists = function()
return {
+ name = "built-in fancy_lists syntax extension",
extend_writer = function(self)
local options = self.options
@@ -4993,7 +5088,8 @@ function M.new(options)
.. [[" specifies field "api_version" of type "]]
.. type(user_extension.api_version)
.. [[" but "number" was expected]])
- assert(user_extension.api_version == metadata.user_extension_api_version,
+ assert(user_extension.api_version > 0
+ 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 ]]
@@ -5025,6 +5121,7 @@ function M.new(options)
.. type(user_extension.finalize_grammar)
.. [[" but "function" was expected]])
local extension = {
+ name = [[user-defined "]] .. pathname .. [[" syntax extension]],
extend_reader = user_extension.finalize_grammar,
extend_writer = function() end,
}