diff options
author | Karl Berry <karl@freefriends.org> | 2022-07-29 21:00:05 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-07-29 21:00:05 +0000 |
commit | c2d2eba4dbcbb6d9555b487010e3486c5b37dddc (patch) | |
tree | c9b44160bd004bfcdfb2ed7e81cf6d318aee6622 /Master/texmf-dist/tex/luatex | |
parent | a6300ce69a231968267f6f256bf80298c385d938 (diff) |
markdown (28jul22)
git-svn-id: svn://tug.org/texlive/trunk@64000 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/luatex')
-rw-r--r-- | Master/texmf-dist/tex/luatex/markdown/markdown.lua | 131 |
1 files changed, 76 insertions, 55 deletions
diff --git a/Master/texmf-dist/tex/luatex/markdown/markdown.lua b/Master/texmf-dist/tex/luatex/markdown/markdown.lua index 2913503f2ce..8e5d29f0133 100644 --- a/Master/texmf-dist/tex/luatex/markdown/markdown.lua +++ b/Master/texmf-dist/tex/luatex/markdown/markdown.lua @@ -1,6 +1,6 @@ --- +-- -- Copyright (C) 2009-2016 John MacFarlane, Hans Hagen --- +-- -- Permission is hereby granted, free of charge, to any person obtaining -- a copy of this software and associated documentation files (the -- "Software"), to deal in the Software without restriction, including @@ -8,10 +8,10 @@ -- distribute, sublicense, and/or sell copies of the Software, and to -- permit persons to whom the Software is furnished to do so, subject to -- the following conditions: --- +-- -- The above copyright notice and this permission notice shall be included -- in all copies or substantial portions of the Software. --- +-- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. @@ -19,31 +19,31 @@ -- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --- +-- -- Copyright (C) 2016-2022 Vít Novotný --- +-- -- This work may be distributed and/or modified under the -- conditions of the LaTeX Project Public License, either version 1.3 -- of this license or (at your option) any later version. -- The latest version of this license is in --- +-- -- http://www.latex-project.org/lppl.txt --- +-- -- and version 1.3 or later is part of all distributions of LaTeX -- version 2005/12/01 or later. --- +-- -- This work has the LPPL maintenance status `maintained'. -- The Current Maintainer of this work is Vít Novotný. --- +-- -- Send bug reports, requests for additions and questions -- either to the GitHub issue tracker at --- +-- -- https://github.com/witiko/markdown/issues --- +-- -- or to the e-mail address <witiko@mail.muni.cz>. --- +-- -- MODIFICATION ADVICE: --- +-- -- If you want to customize this file, it is best to make a copy of -- the source file(s) from which it was produced. Use a different -- name for your copy(ies) and modify the copy(ies); this will ensure @@ -51,14 +51,14 @@ -- new release of the standard system. You should also ensure that -- your modified source file does not generate any modified file with -- the same name as a standard file. --- +-- -- You will also need to produce your own, suitably named, .ins file to -- control the generation of files from your source file; this file -- should contain your own preambles for the files it generates, not -- those in the standard .ins files. --- +-- local metadata = { - version = "2.15.3-0-g7c8e03d", + version = "2.15.4-0-g4cbe4e3", 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", @@ -69,10 +69,14 @@ local metadata = { if not modules then modules = { } end modules['markdown'] = metadata local lpeg = require("lpeg") -local ran_ok, unicode = pcall(require, "unicode") -if not ran_ok then - unicode = {["utf8"]={char=utf8.char}} -end +local unicode +(function() + local ran_ok + ran_ok, unicode = pcall(require, "unicode") + if not ran_ok then + unicode = {["utf8"]={char=utf8.char}} + end +end)() local md5 = require("md5") local M = {metadata = metadata} local defaultOptions = {} @@ -116,7 +120,6 @@ defaultOptions.tightLists = true defaultOptions.underscores = true local upper, gsub, format, length = string.upper, string.gsub, string.format, string.len -local concat = table.concat local P, R, S, V, C, Cg, Cb, Cmt, Cc, Ct, B, Cs, any = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, lpeg.Cg, lpeg.Cb, lpeg.Cmt, lpeg.Cc, lpeg.Ct, lpeg.B, lpeg.Cs, lpeg.P(1) @@ -130,7 +133,7 @@ function util.cache(dir, string, salt, transform, suffix) 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. - local file = assert(io.open(name, "w"), + file = assert(io.open(name, "w"), [[could not open file "]] .. name .. [[" for writing]]) local result = string if transform ~= nil then @@ -2713,9 +2716,7 @@ parsers.spacing = S(" \n\r\t") parsers.nonspacechar = parsers.any - parsers.spacing parsers.optionalspace = parsers.spacechar^0 -parsers.specialchar = S("*_`&[]<!\\.@-^") - -parsers.normalchar = parsers.any - (parsers.specialchar +parsers.normalchar = parsers.any - (V("SpecialChar") + parsers.spacing + parsers.tightblocksep) parsers.eof = -parsers.any @@ -2829,7 +2830,7 @@ parsers.unticked_box = tickbox(parsers.spacechar^1) * Cc(0.0) parsers.openticks = Cg(parsers.backtick^1, "ticks") -local function captures_equal_length(s,i,a,b) +local function captures_equal_length(_,i,a,b) return #a == #b and i end @@ -2844,7 +2845,7 @@ parsers.intickschar = (parsers.any - S(" \n\r`")) parsers.inticks = parsers.openticks * parsers.space^-1 * C(parsers.intickschar^0) * parsers.closeticks -local function captures_geq_length(s,i,a,b) +local function captures_geq_length(_,i,a,b) return #a >= #b and i end @@ -2869,10 +2870,10 @@ end parsers.fencedline = function(char) return C(parsers.line - parsers.fencetail(char)) / function(s) - i = 1 - remaining = fenceindent + local i = 1 + local remaining = fenceindent while true do - c = s:sub(i, i) + local c = s:sub(i, i) if c == " " and remaining > 0 then remaining = remaining - 1 i = i + 1 @@ -3113,7 +3114,7 @@ function M.reader.new(writer, options, extensions) gsub(util.rope_to_string(tag), "[ \n\r\t]+", " ")) end local function iterlines(s, f) - rope = lpeg.match(Ct((parsers.line / f)^1), s) + local rope = lpeg.match(Ct((parsers.line / f)^1), s) return util.rope_to_string(rope) end if options.preserveTabs then @@ -3137,7 +3138,7 @@ function M.reader.new(writer, options, extensions) return line end line = util.expand_tabs_in_line(line) - prefix = lpeg.match(C(parsers.optionalspace), line) + 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 @@ -3291,7 +3292,7 @@ function M.reader.new(writer, options, extensions) parsers.Str = (parsers.normalchar * (parsers.normalchar + parsers.at)^0) / writer.string - parsers.Symbol = (parsers.specialchar - parsers.tightblocksep) + parsers.Symbol = (V("SpecialChar") - parsers.tightblocksep) / writer.string parsers.Ellipsis = P("...") / writer.ellipsis @@ -3682,13 +3683,23 @@ function M.reader.new(writer, options, extensions) EscapedChar = parsers.EscapedChar, Smart = parsers.Smart, Symbol = parsers.Symbol, + SpecialChar = parsers.fail, } - + local special_characters = {"*", "`", "[", "]", "<", "!", "\\"} + self.add_special_character = function(c) + table.insert(special_characters, c) + self.syntax.SpecialChar = S(table.concat(special_characters, "")) + end + self.syntax.SpecialChar = S(table.concat(special_characters, "")) for _, extension in ipairs(extensions) do extension.extend_writer(writer) extension.extend_reader(self) end + if options.underscores then + self.add_special_character("_") + end + if not options.codeSpans then self.syntax.Code = parsers.fail end @@ -3697,6 +3708,8 @@ function M.reader.new(writer, options, extensions) self.syntax.DisplayHtml = parsers.fail self.syntax.InlineHtml = parsers.fail self.syntax.HtmlEntity = parsers.fail + else + self.add_special_character("&") end if options.preserveTabs then @@ -3705,6 +3718,8 @@ function M.reader.new(writer, options, extensions) if not options.smartEllipses then self.syntax.Smart = parsers.fail + else + self.add_special_character(".") end if not options.relativeReferences then @@ -3920,6 +3935,9 @@ M.extensions.citations = function(citation_nbsps) local Citations = TextCitations + ParenthesizedCitations syntax.Citations = Citations + + self.add_special_character("@") + self.add_special_character("-") end } end @@ -3929,15 +3947,15 @@ M.extensions.content_blocks = function(language_map) if ran_ok then kpse.set_program_name("luatex") else - kpse = {lookup=function(filename, options) return filename end} + kpse = {lookup=function(filename, _) return filename end} end local base, prev, curr for _, filename in ipairs{kpse.lookup(language_map, { all=true })} do local file = io.open(filename, "r") if not file then goto continue end - json = file:read("*all"):gsub('("[^\n]-"):','[%1]=') + local json = file:read("*all"):gsub('("[^\n]-"):','[%1]=') curr = (function() - local _ENV={ json=json, load=load } -- run in sandbox + local _ENV={ json=json, load=load } -- luacheck: ignore _ENV return load("return "..json)() end)() if type(curr) == "table" then @@ -4104,7 +4122,7 @@ M.extensions.definition_lists = function(tight_lists) local dlchunk = Cs(parsers.line * (parsers.indentedline - parsers.blankline)^0) - local function definition_list_item(term, defs, tight) + local function definition_list_item(term, defs, _) return { term = self.parser_functions.parse_inlines(term), definitions = defs } end @@ -4147,7 +4165,7 @@ M.extensions.fenced_code = function(blank_before_code_fence) local syntax = self.syntax local writer = self.writer - local function captures_geq_length(s,i,a,b) + local function captures_geq_length(_,i,a,b) return #a >= #b and i end @@ -4172,10 +4190,10 @@ M.extensions.fenced_code = function(blank_before_code_fence) local fencedline = function(char) return C(parsers.line - fencetail(char)) / function(s) - i = 1 - remaining = fenceindent + local i = 1 + local remaining = fenceindent while true do - c = s:sub(i, i) + local c = s:sub(i, i) if c == " " and remaining > 0 then remaining = remaining - 1 i = i + 1 @@ -4209,6 +4227,7 @@ M.extensions.fenced_code = function(blank_before_code_fence) syntax.FencedCode = FencedCode + local fencestart if blank_before_code_fence then fencestart = parsers.fail else @@ -4282,12 +4301,14 @@ M.extensions.footnotes = function(footnotes, inline_footnotes) / writer.note syntax.InlineNote = InlineNote end + + self.add_special_character("^") end } end M.extensions.header_attributes = function() return { - extend_writer = function(self) + extend_writer = function() end, extend_reader = function(self) local parsers = self.parsers local syntax = self.syntax @@ -4432,9 +4453,9 @@ M.extensions.jekyll_data = function(expect_jekyll_data) local JekyllData = Cmt( C((parsers.line - P("---") - P("..."))^0) - , function(s, i, text) + , function(s, i, text) -- luacheck: ignore s i local data - local ran_ok, error = pcall(function() + local ran_ok, _ = pcall(function() local tinyyaml = require("markdown-tinyyaml") data = tinyyaml.parse(text, {timestamps=false}) end) @@ -4614,50 +4635,50 @@ function M.new(options) options = options or {} setmetatable(options, { __index = function (_, key) return defaultOptions[key] end }) - extensions = {} + local extensions = {} if options.citations then - citations_extension = M.extensions.citations(options.citationNbsps) + local citations_extension = M.extensions.citations(options.citationNbsps) table.insert(extensions, citations_extension) end if options.contentBlocks then - content_blocks_extension = M.extensions.content_blocks( + local content_blocks_extension = M.extensions.content_blocks( options.contentBlocksLanguageMap) table.insert(extensions, content_blocks_extension) end if options.definitionLists then - definition_lists_extension = M.extensions.definition_lists( + local definition_lists_extension = M.extensions.definition_lists( options.tightLists) table.insert(extensions, definition_lists_extension) end if options.fencedCode then - fenced_code_extension = M.extensions.fenced_code( + local fenced_code_extension = M.extensions.fenced_code( options.blankBeforeCodeFence) table.insert(extensions, fenced_code_extension) end if options.footnotes or options.inlineFootnotes then - footnotes_extension = M.extensions.footnotes( + local footnotes_extension = M.extensions.footnotes( options.footnotes, options.inlineFootnotes) table.insert(extensions, footnotes_extension) end if options.headerAttributes then - header_attributes_extension = M.extensions.header_attributes() + local header_attributes_extension = M.extensions.header_attributes() table.insert(extensions, header_attributes_extension) end if options.jekyllData then - jekyll_data_extension = M.extensions.jekyll_data( + local jekyll_data_extension = M.extensions.jekyll_data( options.expectJekyllData) table.insert(extensions, jekyll_data_extension) end if options.pipeTables then - pipe_tables_extension = M.extensions.pipe_tables( + local pipe_tables_extension = M.extensions.pipe_tables( options.tableCaptions) table.insert(extensions, pipe_tables_extension) end |