diff options
Diffstat (limited to 'Master/texmf-dist/tex/luatex/markdown/markdown.lua')
-rw-r--r-- | Master/texmf-dist/tex/luatex/markdown/markdown.lua | 137 |
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, } |