diff options
author | Karl Berry <karl@freefriends.org> | 2017-03-27 21:41:13 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-03-27 21:41:13 +0000 |
commit | 58d83afa8885de91f792004e03eb2678b087b46f (patch) | |
tree | a2308b039b6a75aa7bf3427476829d50e1746f12 | |
parent | f6e2e4efbdd44ba2ce51fc1555361c23ec6c8beb (diff) |
markdown (27mar17)
git-svn-id: svn://tug.org/texlive/trunk@43618 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r-- | Master/texmf-dist/doc/generic/markdown/markdown.pdf | bin | 331142 -> 344434 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/generic/markdown/docstrip.cfg | 4 | ||||
-rw-r--r-- | Master/texmf-dist/source/generic/markdown/markdown.dtx | 361 | ||||
-rw-r--r-- | Master/texmf-dist/tex/context/third/markdown/t-markdown.tex | 18 | ||||
-rw-r--r-- | Master/texmf-dist/tex/generic/markdown/markdown.tex | 32 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/markdown/markdown.sty | 34 | ||||
-rw-r--r-- | Master/texmf-dist/tex/luatex/markdown/markdown.lua | 155 | ||||
-rwxr-xr-x | Master/tlpkg/libexec/ctan2tds | 1 |
8 files changed, 557 insertions, 48 deletions
diff --git a/Master/texmf-dist/doc/generic/markdown/markdown.pdf b/Master/texmf-dist/doc/generic/markdown/markdown.pdf Binary files differindex 3ff429866fe..f367cb65a8b 100644 --- a/Master/texmf-dist/doc/generic/markdown/markdown.pdf +++ b/Master/texmf-dist/doc/generic/markdown/markdown.pdf diff --git a/Master/texmf-dist/source/generic/markdown/docstrip.cfg b/Master/texmf-dist/source/generic/markdown/docstrip.cfg index 64fdc439c76..41622d0afd0 100644 --- a/Master/texmf-dist/source/generic/markdown/docstrip.cfg +++ b/Master/texmf-dist/source/generic/markdown/docstrip.cfg @@ -1,7 +1,7 @@ \askforoverwritefalse \def\luapreamble{% -- ^^J% --- Copyright (C) 2009-2016 John MacFarlane, Hans Hagen^^J% +-- Copyright (C) 2009-2017 John MacFarlane, Hans Hagen^^J% -- ^^J% -- Permission is hereby granted, free of charge, to any person obtaining^^J% -- a copy of this software and associated documentation files (the^^J% @@ -62,7 +62,7 @@ \let\luapostamble\empty \declarepreamble\texpreamble -Copyright (C) 2016 Vít Novotný +Copyright (C) 2017 Vít Novotný This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 diff --git a/Master/texmf-dist/source/generic/markdown/markdown.dtx b/Master/texmf-dist/source/generic/markdown/markdown.dtx index 1618ea62478..320bc0bf8b3 100644 --- a/Master/texmf-dist/source/generic/markdown/markdown.dtx +++ b/Master/texmf-dist/source/generic/markdown/markdown.dtx @@ -63,15 +63,24 @@ title={A Markdown Interpreter for \TeX{}}, subtitle={}, url={https://github.com/witiko/markdown}, - author={Vít Novotný (based on the work of John MacFarlane and Hans Hagen)}, + author={Vít Novotný}, email={witiko@mail.muni.cz}, revision={\input VERSION}, date={\today}} +\hypersetup{% + pdftitle={A Markdown Interpreter for \TeX{}}, + pdfauthor={Vít Novotný}} \CodelineIndex % Set up the bibliography. \usepackage{filecontents} \begin{filecontents}{markdown.bib} + @online{sotkov17, + author = {Sotkov, Anton}, + title = {File transclusion syntax for Markdown}, + date = {2017-01-19}, + url = {https://github.com/iainc/Markdown-Content-Blocks}, + urldate = {2017-03-18}} @book{luatex16, author = {{Lua\TeX{} development team}}, title = {Lua\TeX{} reference manual}, @@ -147,7 +156,7 @@ % \fi % \begin{macrocode} local metadata = { - version = "2.3.0", + version = "2.4.0", comment = "A module for the conversion from markdown to plain TeX", author = "John MacFarlane, Hans Hagen, Vít Novotný", copyright = "2009-2017 John MacFarlane, Hans Hagen; " .. @@ -289,6 +298,9 @@ local md5 = require("md5") % for the verbatim inclusion of files containing code. It is used to % provide the corresponding default token renderer prototype (see Section % \ref{sec:texrendererprototypes}). +% \item[\pkg{csvsimple}] A package that provides the default token renderer +% prototype for iA\,Writer content blocks with the \acro{csv} filename +% extension (see Section \ref{sec:texrendererprototypes}). % \end{description} % % \iffalse @@ -297,8 +309,13 @@ local md5 = require("md5") % \fi % \subsubsection{\Hologo{ConTeXt} prerequisites} % The \Hologo{ConTeXt} part of the package requires that either the Mark II or -% the Mark IV format is loaded and all the plain \TeX{} prerequisites (see -% Section \ref{sec:texprerequisites}). +% the Mark IV format is loaded, all the plain \TeX{} prerequisites (see +% Section \ref{sec:texprerequisites}), and the following modules: +% \begin{description} +% \item[\pkg{m-database}] A module that provides the default token renderer +% prototype for iA\,Writer content blocks with the \acro{csv} filename +% extension (see Section \ref{sec:texrendererprototypes}). +% \end{description} % % \section{User Guide}\label{sec:interfaces} % This part of the manual describes the interfaces exposed by the package @@ -393,7 +410,7 @@ defaultOptions.blankBeforeHeading = false defaultOptions.breakableBlockquotes = false % \end{macrocode} % -% \Valitem[.]{cacheDir}{directory} +% \Valitem[.]{cacheDir}{directory name} % The path to the directory containing auxiliary cache files. % % When iteratively writing and typesetting a markdown document, the cache @@ -442,6 +459,32 @@ defaultOptions.citationNbsps = true defaultOptions.citations = false % \end{macrocode} % +% \Optitem[false]{contentBlocks}{\opt{true}, \opt{false}} +% \begin{valuelist} +% \item[true] Enable the iA\,Writer content blocks syntax +% extension~\cite{sotkov17}: +% \begin{Verbatim} +% http://example.com/minard.jpg (Napoleon’s disastrous +% Russian campaign of 1812) +% /Flowchart.png "Engineering Flowchart" +% /Savings Account.csv 'Recent Transactions' +% /Example.swift +% /Lorem Ipsum.txt +% \end{Verbatim} +% \item[false] Disable the iA\,Writer content blocks syntax extension. +% \end{valuelist} +% \begin{macrocode} +defaultOptions.contentBlocks = false +% \end{macrocode} +% +% \Valitem[markdown-languages.json]{contentBlocksLanguageMap}{filename} +% The filename of the \acro{json} file that maps filename extensions to +% programming language names in the iA\,Writer content blocks. See +% Section~\ref{sec:texcontentblockrenderers} for more information. +% \begin{macrocode} +defaultOptions.contentBlocksLanguageMap = "markdown-languages.json" +% \end{macrocode} +% % \Optitem[false]{definitionLists}{\opt{true}, \opt{false}} % \begin{valuelist} % \item[true] Enable the pandoc definition list syntax extension: @@ -488,7 +531,8 @@ defaultOptions.hashEnumerators = false % contents), \textsc{html} instructions, and comments will % be ignored and \textsc{html} entities will be replaced % with the corresponding Unicode codepoints. -% \item[true] Disable the recognition of \textsc{html} markup. Any +% +% \item[false] Disable the recognition of \textsc{html} markup. Any % \textsc{html} markup in the input will be rendered as % plain text. % \end{valuelist} @@ -535,7 +579,7 @@ defaultOptions.hybrid = false % </pre> % ``` % \end{Verbatim} -% \item[true] Disable the commonmark fenced code block extension. +% \item[false] Disable the commonmark fenced code block extension. % \end{valuelist} % \begin{macrocode} defaultOptions.fencedCode = false @@ -639,8 +683,8 @@ defaultOptions.tightLists = true % \ref{sec:luaoptions}) used during the conversion from markdown to plain % \TeX{}, and for changing the way markdown the tokens are rendered. % \begin{macrocode} -\def\markdownLastModified{2017/01/05}% -\def\markdownVersion{2.3.0}% +\def\markdownLastModified{2017/03/27}% +\def\markdownVersion{2.4.0}% % \end{macrocode} % % The plain \TeX{} interface is implemented by the \t`markdown.tex` file that @@ -774,6 +818,10 @@ defaultOptions.tightLists = true % interface (see Section \ref{sec:luaoptions}) and are not processed by the % plain \TeX{} implementation, only passed along to Lua. They are undefined, which % makes them fall back to the default values provided by the Lua interface. +% +% For the macros that correspond to the non-boolean options recognized by the +% Lua interface, the same limitations apply here in the case of the +% \m{markdownOptionHelperScriptFileName} macro. % \begin{macrocode} \let\markdownOptionBlankBeforeBlockquote\undefined \let\markdownOptionBlankBeforeCodeFence\undefined @@ -781,6 +829,8 @@ defaultOptions.tightLists = true \let\markdownOptionBreakableBlockquotes\undefined \let\markdownOptionCitations\undefined \let\markdownOptionCitationNbsps\undefined +\let\markdownOptionContentBlocks\undefined +\let\markdownOptionContentBlocksLanguageMap\undefined \let\markdownOptionDefinitionLists\undefined \let\markdownOptionFootnotes\undefined \let\markdownOptionFencedCode\undefined @@ -884,7 +934,7 @@ defaultOptions.tightLists = true % \end{macrocode} % % \paragraph{Image Renderer} -% The \mdef{markdownRendererImage} macro represents an image. It receives four +% The \mdef{markdownRendererImage} macro represents an image. It receives % four arguments: the label, the fully escaped \acro{uri} that can be directly % typeset, the raw \acro{uri} that can be used outside typesetting, and the % title of the link. @@ -893,6 +943,50 @@ defaultOptions.tightLists = true \markdownRendererImagePrototype}% % \end{macrocode} % +% \paragraph{Content Block Renderers}\label{sec:texcontentblockrenderers} +% The \mdef{markdownRendererContentBlock} 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 \acro{uri} that can be +% directly typeset, the raw \acro{uri} that can be used outside typesetting, +% and the title of the content block. +% \begin{macrocode} +\def\markdownRendererContentBlock{% + \markdownRendererContentBlockPrototype}% +% \end{macrocode} +% +% The \mdef{markdownRendererContentBlockOnlineImage} macro represents an +% iA\,Writer online image content block. The macro receives the same arguments +% as \m{markdownRendererContentBlock}. +% \begin{macrocode} +\def\markdownRendererContentBlockOnlineImage{% + \markdownRendererContentBlockOnlineImagePrototype}% +% \end{macrocode} +% +% The \mdef{markdownRendererContentBlockCode} macro represents an iA\,Writer +% content block that was recognized as a file in a known programming language +% by its filename extension $s$. If any \t`markdown-languages.json` file found +% by \pkg{kpathsea}\footnote{Local files take precedence. Filenames other +% than \t`markdown-languages.json` may be specified using the +% \t`contentBlocksLanguageMap` Lua option.} contains a record $(k, v)$, then a +% non-online-image content block with the filename extension $s, +% s$\t`:lower()`${}=k$ is considered to be in a known programming language $v$. +% +% The macro receives four arguments: the local file name extension $s$ cast to +% the lower case, the language $v$, the fully escaped \acro{uri} that can be +% directly typeset, the raw \acro{uri} that can be used outside typesetting, +% and the title of the content block. +% +% Note that you will need to place place a \t`markdown-languages.json` file +% inside your working directory or inside your local TeX directory structure. +% In this file, you will define a mapping between filename extensions and the +% language names recognized by your favorite syntax highlighter; there may +% exist other creative uses beside syntax highlighting. The \t`Languages.json` +% file provided by \cite{sotkov17} is a good starting point. +% \begin{macrocode} +\def\markdownRendererContentBlockCode{% + \markdownRendererContentBlockCodePrototype}% +% \end{macrocode} +% % \paragraph{Bullet List Renderers} % The \mdef{markdownRendererUlBegin} macro represents the beginning of a % bulleted list that contains an item with several paragraphs of text (the @@ -1235,6 +1329,9 @@ defaultOptions.tightLists = true \def\markdownRendererCodeSpanPrototype#1{}% \def\markdownRendererLinkPrototype#1#2#3#4{}% \def\markdownRendererImagePrototype#1#2#3#4{}% +\def\markdownRendererContentBlockPrototype#1#2#3#4{}% +\def\markdownRendererContentBlockOnlineImagePrototype#1#2#3#4{}% +\def\markdownRendererContentBlockCodePrototype#1#2#3#4{}% \def\markdownRendererUlBeginPrototype{}% \def\markdownRendererUlBeginTightPrototype{}% \def\markdownRendererUlItemPrototype{}% @@ -1286,7 +1383,7 @@ defaultOptions.tightLists = true % The \m{markdownError} macro receives a second argument that provides a help % text suggesting a remedy to the error. % \begin{macrocode} -\def\markdownError#1{}% +\def\markdownError#1#2{}% % \end{macrocode} % You may redefine these macros to redirect and process the info, warning, and % error messages. @@ -1482,6 +1579,10 @@ defaultOptions.tightLists = true \def\markdownOptionCitationNbsps{#1}}% \define@key{markdownOptions}{cacheDir}{% \def\markdownOptionCacheDir{#1}}% +\define@key{markdownOptions}{contentBlocks}[true]{% + \def\markdownOptionContentBlocks{#1}}% +\define@key{markdownOptions}{contentBlocksLanguageMap}{% + \def\markdownOptionContentBlocksLanguageMap{#1}}% \define@key{markdownOptions}{definitionLists}[true]{% \def\markdownOptionDefinitionLists{#1}}% \define@key{markdownOptions}{footnotes}[true]{% @@ -1557,6 +1658,12 @@ defaultOptions.tightLists = true \renewcommand\markdownRendererCodeSpan[1]{#1}}% \define@key{markdownRenderers}{link}{% \renewcommand\markdownRendererLink[4]{#1}}% +\define@key{markdownRenderers}{contentBlock}{% + \renewcommand\markdownRendererContentBlock[4]{#1}}% +\define@key{markdownRenderers}{contentBlockOnlineImage}{% + \renewcommand\markdownRendererContentBlockOnlineImage[4]{#1}}% +\define@key{markdownRenderers}{contentBlockCode}{% + \renewcommand\markdownRendererContentBlockCode[5]{#1}}% \define@key{markdownRenderers}{image}{% \renewcommand\markdownRendererImage[4]{#1}}% \define@key{markdownRenderers}{ulBegin}{% @@ -1688,6 +1795,12 @@ defaultOptions.tightLists = true \renewcommand\markdownRendererCodeSpanPrototype[1]{#1}}% \define@key{markdownRendererPrototypes}{link}{% \renewcommand\markdownRendererLinkPrototype[4]{#1}}% +\define@key{markdownRendererPrototypes}{contentBlock}{% + \renewcommand\markdownRendererContentBlockPrototype[4]{#1}}% +\define@key{markdownRendererPrototypes}{contentBlockOnlineImage}{% + \renewcommand\markdownRendererContentBlockOnlineImagePrototype[4]{#1}}% +\define@key{markdownRendererPrototypes}{contentBlockCode}{% + \renewcommand\markdownRendererContentBlockCodePrototype[5]{#1}}% \define@key{markdownRendererPrototypes}{image}{% \renewcommand\markdownRendererImagePrototype[4]{#1}}% \define@key{markdownRendererPrototypes}{ulBegin}{% @@ -2089,7 +2202,7 @@ function util.pathname(dir, file) end end % \end{macrocode} -% \subsubsection{\textsc{html} entities} +% \subsubsection{\textsc{html} Entities} % This section documents the \textsc{html} entities recognized by the % markdown reader. These functions are encapsulated in the \t`entities` % object. The functions were originally located in the @@ -2564,6 +2677,66 @@ function M.writer.new(options) end % \end{macrocode} % +% The \luamdef{languages_json} table maps programming language filename +% extensions to fence infostrings. All \luam{options.contentBlocksLanguageMap} +% files located by \pkg{kpathsea} are loaded into a chain of tables. +% \luam{languages_json} corresponds to the first table and is chained with +% the rest via Lua metatables. +% \begin{macrocode} +local languages_json = (function() + local kpse = require('kpse') + kpse.set_program_name('luatex') + local base, prev, curr + for _, file in ipairs{kpse.lookup(options.contentBlocksLanguageMap, + { all=true })} do + json = assert(io.open(file, "r")):read("*all") + :gsub('("[^\n]-"):','[%1]=') + curr = (function() + local _ENV={ json=json, load=load } -- run in sandbox + return load("return "..json)() + end)() + if type(curr) == "table" then + if base == nil then + base = curr + else + setmetatable(prev, { __index = curr }) + end + prev = curr + end + end + return base or {} +end)() +% \end{macrocode} +% +% Define \luamdef{writer->contentblock} as a function that will transform an +% input iA\,Writer content block to the output format, where \t`src` +% corresponds to the \acro{uri} prefix, \t`suf` to the \acro{uri} extension, +% \t`type` to the type of the content block (\t`localfile` or \t`onlineimage`), +% and \t`tit` to the title of the content block. +% \begin{macrocode} + function self.contentblock(src,suf,type,tit) + src = src.."."..suf + suf = suf:lower() + if type == "onlineimage" then + return {"\\markdownRendererContentBlockOnlineImage{",suf,"}", + "{",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 ""),"}"} + else + return {"\\markdownRendererContentBlock{",suf,"}", + "{",self.string(src),"}", + "{",self.uri(src),"}", + "{",self.string(tit or ""),"}"} + end + end +% \end{macrocode} +% % Define \luamdef{writer->bulletlist} as a function that will transform an input % bulleted list to the output format, where \t`items` is an array of the list % items and \t`tight` specifies, whether the list is tight or not. @@ -2938,7 +3111,7 @@ end % \begin{macrocode} parsers.leader = parsers.space^-3 --- in balanced brackets, parentheses, quotes: +-- content in balanced brackets, parentheses, or quotes: parsers.bracketed = P{ parsers.lbracket * ((parsers.anyescaped - (parsers.lbracket + parsers.rbracket @@ -2965,22 +3138,24 @@ parsers.dquoted = P{ parsers.dquote * parsers.alphanumeric ) + V(1))^0 * parsers.dquote } --- bracketed 'tag' for markdown links, allowing nested brackets: +-- bracketed tag for markdown links, allowing nested brackets: parsers.tag = parsers.lbracket * Cs((parsers.alphanumeric^1 + parsers.bracketed + parsers.inticks - + (parsers.anyescaped - (parsers.rbracket - + parsers.blankline^2)))^0) + + (parsers.anyescaped + - (parsers.rbracket + parsers.blankline^2)))^0) * parsers.rbracket --- url for markdown links, allowing balanced parentheses: -parsers.url = parsers.less * Cs((parsers.anyescaped-parsers.more)^0) +-- url for markdown links, allowing nested brackets: +parsers.url = parsers.less * Cs((parsers.anyescaped + - parsers.more)^0) * parsers.more + Cs((parsers.inparens + (parsers.anyescaped - -parsers.spacing-parsers.rparent))^1) + - parsers.spacing + - parsers.rparent))^1) --- quoted text possibly with nested quotes: +-- quoted text, possibly with nested quotes: parsers.title_s = parsers.squote * Cs(((parsers.anyescaped-parsers.squote) + parsers.squoted)^0) * parsers.squote @@ -2999,6 +3174,73 @@ parsers.optionaltitle = parsers.spnl * parsers.title * parsers.spacechar^0 + Cc("") % \end{macrocode} +% \paragraph{Parsers Used for iA\,Writer Content Blocks} +% \begin{macrocode} +parsers.contentblock_tail + = parsers.optionaltitle + * (parsers.newline + parsers.eof) + +-- case insensitive online image suffix: +parsers.onlineimagesuffix + = (function(...) + local parser = nil + for _,suffix in ipairs({...}) do + local pattern=nil + for i=1,#suffix do + local char=suffix:sub(i,i) + char = S(char:lower()..char:upper()) + if pattern == nil then + pattern = char + else + pattern = pattern * char + end + end + if parser == nil then + parser = pattern + else + parser = parser + pattern + end + end + return parser + end)("png", "jpg", "jpeg", "gif", "tif", "tiff") + +-- online image url for iA Writer content blocks with mandatory suffix, +-- allowing nested brackets: +parsers.onlineimageurl + = (parsers.less + * Cs((parsers.anyescaped + - parsers.more + - #(parsers.period + * parsers.onlineimagesuffix + * parsers.more + * parsers.contentblock_tail))^0) + * parsers.period + * Cs(parsers.onlineimagesuffix) + * parsers.more + + (Cs((parsers.inparens + + (parsers.anyescaped + - parsers.spacing + - parsers.rparent + - #(parsers.period + * parsers.onlineimagesuffix + * parsers.contentblock_tail)))^0) + * parsers.period + * Cs(parsers.onlineimagesuffix)) + ) * Cc("onlineimage") + +-- filename for iA Writer content blocks with mandatory suffix: +parsers.localfilepath + = parsers.slash + * Cs((parsers.anyescaped + - parsers.tab + - parsers.newline + - #(parsers.period + * parsers.alphanumeric^1 + * parsers.contentblock_tail))^1) + * parsers.period + * Cs(parsers.alphanumeric^1) + * Cc("localfile") +% \end{macrocode} % \paragraph{Parsers Used for Citations} % \begin{macrocode} parsers.citation_name = Cs(parsers.dash^-1) * parsers.at @@ -3174,7 +3416,7 @@ parsers.decentity = parsers.ampersand * parsers.hash parsers.tagentity = parsers.ampersand * C(parsers.alphanumeric^1) * parsers.semicolon % \end{macrocode} -% \paragraph{Helpers for Links and References} +% \paragraph{Helpers for References} % \begin{macrocode} -- parse a reference definition: [foo]: /bar "title" parsers.define_reference_parser = parsers.leader * parsers.tag * parsers.colon @@ -3196,7 +3438,17 @@ parsers.urlchar = parsers.anyescaped - parsers.newline - parsers.more % \paragraph{Block Elements} % \begin{macrocode} parsers.Block = V("Block") - + +parsers.OnlineImageURL + = parsers.leader + * parsers.onlineimageurl + * parsers.optionaltitle + +parsers.LocalFilePath + = parsers.leader + * parsers.localfilepath + * parsers.optionaltitle + parsers.TildeFencedCode = parsers.fencehead(parsers.tilde) * Cs(parsers.fencedline(parsers.tilde)^0) @@ -3668,6 +3920,11 @@ function M.reader.new(writer, options) % \end{macrocode} % \paragraph{Block Elements (local)} % \begin{macrocode} + larsers.ContentBlock = parsers.leader + * (parsers.localfilepath + parsers.onlineimageurl) + * parsers.contentblock_tail + / writer.contentblock + larsers.DisplayHtml = C(parsers.displayhtml) / expandtabs / writer.display_html @@ -3832,7 +4089,8 @@ function M.reader.new(writer, options) Blank = larsers.Blank, - Block = V("Blockquote") + Block = V("ContentBlock") + + V("Blockquote") + V("Verbatim") + V("FencedCode") + V("HorizontalRule") @@ -3844,6 +4102,7 @@ function M.reader.new(writer, options) + V("Paragraph") + V("Plain"), + ContentBlock = larsers.ContentBlock, Blockquote = larsers.Blockquote, Verbatim = larsers.Verbatim, FencedCode = larsers.FencedCode, @@ -3909,6 +4168,10 @@ function M.reader.new(writer, options) syntax.Citations = parsers.fail end + if not options.contentBlocks then + syntax.ContentBlock = parsers.fail + end + if not options.footnotes then syntax.NoteRef = parsers.fail end @@ -4041,6 +4304,12 @@ return M \def\markdownRendererPipePrototype{|}% \def\markdownRendererCodeSpanPrototype#1{{\tt#1}}% \def\markdownRendererLinkPrototype#1#2#3#4{#2}% +\def\markdownRendererContentBlockPrototype#1#2#3#4{% + \markdownInput{#3}}% +\def\markdownRendererContentBlockOnlineImagePrototype{% + \markdownRendererImage}% +\def\markdownRendererContentBlockCodePrototype#1#2#3#4#5{% + \markdownRendererInputFencedCode{#3}{#2}}% \def\markdownRendererImagePrototype#1#2#3#4{#2}% \def\markdownRendererUlBeginPrototype{}% \def\markdownRendererUlBeginTightPrototype{}% @@ -4086,9 +4355,7 @@ return M % \subsubsection{Lua Snippets} % The \mdef{markdownLuaOptions} macro expands to a Lua table that % contains the plain \TeX{} options (see Section \ref{sec:texoptions}) in a -% format recognized by Lua (see Section \ref{sec:luaoptions}). Note that the -% boolean options are not sanitized and expect the plain \TeX{} option macros -% to expand to either \t`true` or \t`false`. +% format recognized by Lua (see Section \ref{sec:luaoptions}). % \begin{macrocode} \def\markdownLuaOptions{{% \ifx\markdownOptionBlankBeforeBlockquote\undefined\else @@ -4112,6 +4379,13 @@ return M \ifx\markdownOptionCitationNbsps\undefined\else citationNbsps = \markdownOptionCitationNbsps, \fi +\ifx\markdownOptionContentBlocks\undefined\else + contentBlocks = \markdownOptionContentBlocks, +\fi +\ifx\markdownOptionContentBlocksLanguageMap\undefined\else + contentBlocksLanguageMap = + "\markdownOptionContentBlocksLanguageMap", +\fi \ifx\markdownOptionDefinitionLists\undefined\else definitionLists = \markdownOptionDefinitionLists, \fi @@ -4328,7 +4602,7 @@ local convert = md.new(\markdownLuaOptions) % % The \mdef{markdownExecuteDirect} macro executes the code it has received as % its first argument by writing it to the output file stream 18, if Lua is -% unavailable, or by using the Lua \luam{markdown.execute} method otherwise. +% unavailable, or by using the Lua \luam{os.execute} method otherwise. % \begin{macrocode} \ifnum\markdownMode=0\relax \def\markdownExecuteDirect#1{\immediate\write18{#1}}% @@ -4556,6 +4830,7 @@ local convert = md.new(\markdownLuaOptions) dlBeginTight = {\markdownRendererDlBegin}, dlEndTight = {\markdownRendererDlEnd}}}} \RequirePackage{fancyvrb} +\RequirePackage{csvsimple} \markdownSetup{rendererPrototypes={ lineBreak = {\\}, leftBrace = {\textbraceleft}, @@ -4569,7 +4844,20 @@ local convert = md.new(\markdownLuaOptions) codeSpan = {\texttt{#1}}, link = {#1\footnote{\ifx\empty#4\empty\else#4: \fi\texttt<\url{#3}\texttt>}}, - image = {\begin{figure} + contentBlock = {% + \ifthenelse{\equal{#1}{csv}}{% + \begin{table}% + \begin{center}% + \csvautotabular{#3}% + \end{center} + \ifx\empty#4\empty\else + \caption{#4}% + \fi + \label{tab:#1}% + \end{table}}{% + \markdownInput{#3}}}, + image = {% + \begin{figure}% \begin{center}% \includegraphics{#3}% \end{center}% @@ -4802,6 +5090,22 @@ local convert = md.new(\markdownLuaOptions) \def\markdownRendererLinkPrototype#1#2#3#4{% \useURL[#1][#3][][#4]#1\footnote[#1]{\ifx\empty#4\empty\else#4: \fi\tt<\hyphenatedurl{#3}>}}% +\usemodule[database] +\defineseparatedlist + [MarkdownConTeXtCSV] + [separator={,}, + before=\bTABLE,after=\eTABLE, + first=\bTR,last=\eTR, + left=\bTD,right=\eTD] +\def\markdownConTeXtCSV{csv} +\def\markdownRendererContentBlockPrototype#1#2#3#4{% + \def\markdownConTeXtCSV@arg{#1}% + \ifx\markdownConTeXtCSV@arg\markdownConTeXtCSV + \placetable[][tab:#1]{#4}{% + \processseparatedfile[MarkdownConTeXtCSV][#3]}% + \else + \markdownInput{#3}% + \fi}% \def\markdownRendererImagePrototype#1#2#3#4{% \placefigure[][fig:#1]{#4}{\externalfigure[#3]}}% \def\markdownRendererUlBeginPrototype{\startitemize}% @@ -4850,6 +5154,7 @@ local convert = md.new(\markdownLuaOptions) \typefile{#1}% \else % \end{macrocode} +% % The code fence infostring is used as a name from the \Hologo{ConTeXt} % \m{definetyping} macro. This allows the user to set up code highlighting % mapping as follows: diff --git a/Master/texmf-dist/tex/context/third/markdown/t-markdown.tex b/Master/texmf-dist/tex/context/third/markdown/t-markdown.tex index 91e89c1dc20..a65798af1d0 100644 --- a/Master/texmf-dist/tex/context/third/markdown/t-markdown.tex +++ b/Master/texmf-dist/tex/context/third/markdown/t-markdown.tex @@ -6,7 +6,7 @@ %% %% markdown.dtx (with options: `context') %% -%% Copyright (C) 2016 Vít Novotný +%% Copyright (C) 2017 Vít Novotný %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 @@ -81,6 +81,22 @@ \def\markdownRendererLinkPrototype#1#2#3#4{% \useURL[#1][#3][][#4]#1\footnote[#1]{\ifx\empty#4\empty\else#4: \fi\tt<\hyphenatedurl{#3}>}}% +\usemodule[database] +\defineseparatedlist + [MarkdownConTeXtCSV] + [separator={,}, + before=\bTABLE,after=\eTABLE, + first=\bTR,last=\eTR, + left=\bTD,right=\eTD] +\def\markdownConTeXtCSV{csv} +\def\markdownRendererContentBlockPrototype#1#2#3#4{% + \def\markdownConTeXtCSV@arg{#1}% +\ifx\markdownConTeXtCSV@arg\markdownConTeXtCSV + \placetable[][tab:#1]{#4}{% + \processseparatedfile[MarkdownConTeXtCSV][#3]}% +\else +\markdownInput{#3}% +\fi}% \def\markdownRendererImagePrototype#1#2#3#4{% \placefigure[][fig:#1]{#4}{\externalfigure[#3]}}% \def\markdownRendererUlBeginPrototype{\startitemize}% diff --git a/Master/texmf-dist/tex/generic/markdown/markdown.tex b/Master/texmf-dist/tex/generic/markdown/markdown.tex index 8de36017864..6bc0a916571 100644 --- a/Master/texmf-dist/tex/generic/markdown/markdown.tex +++ b/Master/texmf-dist/tex/generic/markdown/markdown.tex @@ -6,7 +6,7 @@ %% %% markdown.dtx (with options: `tex') %% -%% Copyright (C) 2016 Vít Novotný +%% Copyright (C) 2017 Vít Novotný %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 @@ -45,8 +45,8 @@ %% %% The names of the source files used are shown above. %% -\def\markdownLastModified{2017/01/05}% -\def\markdownVersion{2.3.0}% +\def\markdownLastModified{2017/03/27}% +\def\markdownVersion{2.4.0}% \let\markdownBegin\relax \let\markdownEnd\relax \let\markdownInput\relax @@ -60,6 +60,8 @@ \let\markdownOptionBreakableBlockquotes\undefined \let\markdownOptionCitations\undefined \let\markdownOptionCitationNbsps\undefined +\let\markdownOptionContentBlocks\undefined +\let\markdownOptionContentBlocksLanguageMap\undefined \let\markdownOptionDefinitionLists\undefined \let\markdownOptionFootnotes\undefined \let\markdownOptionFencedCode\undefined @@ -107,6 +109,12 @@ \markdownRendererLinkPrototype}% \def\markdownRendererImage{% \markdownRendererImagePrototype}% +\def\markdownRendererContentBlock{% + \markdownRendererContentBlockPrototype}% +\def\markdownRendererContentBlockOnlineImage{% + \markdownRendererContentBlockOnlineImagePrototype}% +\def\markdownRendererContentBlockCode{% + \markdownRendererContentBlockCodePrototype}% \def\markdownRendererUlBegin{% \markdownRendererUlBeginPrototype}% \def\markdownRendererUlBeginTight{% @@ -199,6 +207,9 @@ \def\markdownRendererCodeSpanPrototype#1{}% \def\markdownRendererLinkPrototype#1#2#3#4{}% \def\markdownRendererImagePrototype#1#2#3#4{}% +\def\markdownRendererContentBlockPrototype#1#2#3#4{}% +\def\markdownRendererContentBlockOnlineImagePrototype#1#2#3#4{}% +\def\markdownRendererContentBlockCodePrototype#1#2#3#4{}% \def\markdownRendererUlBeginPrototype{}% \def\markdownRendererUlBeginTightPrototype{}% \def\markdownRendererUlItemPrototype{}% @@ -238,7 +249,7 @@ \def\markdownRendererTextCitePrototype#1{}% \def\markdownInfo#1{}% \def\markdownWarning#1{}% -\def\markdownError#1{}% +\def\markdownError#1#2{}% \let\markdownMakeOther\relax \let\markdownReadAndConvert\relax \begingroup @@ -280,6 +291,12 @@ \def\markdownRendererPipePrototype{|}% \def\markdownRendererCodeSpanPrototype#1{{\tt#1}}% \def\markdownRendererLinkPrototype#1#2#3#4{#2}% +\def\markdownRendererContentBlockPrototype#1#2#3#4{% + \markdownInput{#3}}% +\def\markdownRendererContentBlockOnlineImagePrototype{% + \markdownRendererImage}% +\def\markdownRendererContentBlockCodePrototype#1#2#3#4#5{% + \markdownRendererInputFencedCode{#3}{#2}}% \def\markdownRendererImagePrototype#1#2#3#4{#2}% \def\markdownRendererUlBeginPrototype{}% \def\markdownRendererUlBeginTightPrototype{}% @@ -342,6 +359,13 @@ \ifx\markdownOptionCitationNbsps\undefined\else citationNbsps = \markdownOptionCitationNbsps, \fi +\ifx\markdownOptionContentBlocks\undefined\else + contentBlocks = \markdownOptionContentBlocks, +\fi +\ifx\markdownOptionContentBlocksLanguageMap\undefined\else + contentBlocksLanguageMap = + "\markdownOptionContentBlocksLanguageMap", +\fi \ifx\markdownOptionDefinitionLists\undefined\else definitionLists = \markdownOptionDefinitionLists, \fi diff --git a/Master/texmf-dist/tex/latex/markdown/markdown.sty b/Master/texmf-dist/tex/latex/markdown/markdown.sty index 94997e75fb8..229d810b920 100644 --- a/Master/texmf-dist/tex/latex/markdown/markdown.sty +++ b/Master/texmf-dist/tex/latex/markdown/markdown.sty @@ -6,7 +6,7 @@ %% %% markdown.dtx (with options: `latex') %% -%% Copyright (C) 2016 Vít Novotný +%% Copyright (C) 2017 Vít Novotný %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 @@ -71,6 +71,10 @@ \def\markdownOptionCitationNbsps{#1}}% \define@key{markdownOptions}{cacheDir}{% \def\markdownOptionCacheDir{#1}}% +\define@key{markdownOptions}{contentBlocks}[true]{% + \def\markdownOptionContentBlocks{#1}}% +\define@key{markdownOptions}{contentBlocksLanguageMap}{% + \def\markdownOptionContentBlocksLanguageMap{#1}}% \define@key{markdownOptions}{definitionLists}[true]{% \def\markdownOptionDefinitionLists{#1}}% \define@key{markdownOptions}{footnotes}[true]{% @@ -127,6 +131,12 @@ \renewcommand\markdownRendererCodeSpan[1]{#1}}% \define@key{markdownRenderers}{link}{% \renewcommand\markdownRendererLink[4]{#1}}% +\define@key{markdownRenderers}{contentBlock}{% + \renewcommand\markdownRendererContentBlock[4]{#1}}% +\define@key{markdownRenderers}{contentBlockOnlineImage}{% + \renewcommand\markdownRendererContentBlockOnlineImage[4]{#1}}% +\define@key{markdownRenderers}{contentBlockCode}{% + \renewcommand\markdownRendererContentBlockCode[5]{#1}}% \define@key{markdownRenderers}{image}{% \renewcommand\markdownRendererImage[4]{#1}}% \define@key{markdownRenderers}{ulBegin}{% @@ -237,6 +247,12 @@ \renewcommand\markdownRendererCodeSpanPrototype[1]{#1}}% \define@key{markdownRendererPrototypes}{link}{% \renewcommand\markdownRendererLinkPrototype[4]{#1}}% +\define@key{markdownRendererPrototypes}{contentBlock}{% + \renewcommand\markdownRendererContentBlockPrototype[4]{#1}}% +\define@key{markdownRendererPrototypes}{contentBlockOnlineImage}{% + \renewcommand\markdownRendererContentBlockOnlineImagePrototype[4]{#1}}% +\define@key{markdownRendererPrototypes}{contentBlockCode}{% + \renewcommand\markdownRendererContentBlockCodePrototype[5]{#1}}% \define@key{markdownRendererPrototypes}{image}{% \renewcommand\markdownRendererImagePrototype[4]{#1}}% \define@key{markdownRendererPrototypes}{ulBegin}{% @@ -374,6 +390,7 @@ dlBeginTight = {\markdownRendererDlBegin}, dlEndTight = {\markdownRendererDlEnd}}}} \RequirePackage{fancyvrb} +\RequirePackage{csvsimple} \markdownSetup{rendererPrototypes={ lineBreak = {\\}, leftBrace = {\textbraceleft}, @@ -387,7 +404,20 @@ codeSpan = {\texttt{#1}}, link = {#1\footnote{\ifx\empty#4\empty\else#4: \fi\texttt<\url{#3}\texttt>}}, - image = {\begin{figure} + contentBlock = {% + \ifthenelse{\equal{#1}{csv}}{% + \begin{table}% + \begin{center}% + \csvautotabular{#3}% + \end{center} + \ifx\empty#4\empty\else + \caption{#4}% + \fi + \label{tab:#1}% + \end{table}}{% + \markdownInput{#3}}}, + image = {% + \begin{figure}% \begin{center}% \includegraphics{#3}% \end{center}% diff --git a/Master/texmf-dist/tex/luatex/markdown/markdown.lua b/Master/texmf-dist/tex/luatex/markdown/markdown.lua index 63e4effda43..de9895c8c27 100644 --- a/Master/texmf-dist/tex/luatex/markdown/markdown.lua +++ b/Master/texmf-dist/tex/luatex/markdown/markdown.lua @@ -1,5 +1,5 @@ -- --- Copyright (C) 2009-2016 John MacFarlane, Hans Hagen +-- Copyright (C) 2009-2017 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 @@ -58,7 +58,7 @@ -- those in the standard .ins files. -- local metadata = { - version = "2.3.0", + version = "2.4.0", comment = "A module for the conversion from markdown to plain TeX", author = "John MacFarlane, Hans Hagen, Vít Novotný", copyright = "2009-2017 John MacFarlane, Hans Hagen; " .. @@ -79,6 +79,8 @@ defaultOptions.breakableBlockquotes = false defaultOptions.cacheDir = "." defaultOptions.citationNbsps = true defaultOptions.citations = false +defaultOptions.contentBlocks = false +defaultOptions.contentBlocksLanguageMap = "markdown-languages.json" defaultOptions.definitionLists = false defaultOptions.hashEnumerators = false defaultOptions.html = false @@ -554,6 +556,50 @@ function M.writer.new(options) "{",self.uri(src),"}", "{",self.string(tit or ""),"}"} end +local languages_json = (function() + local kpse = require('kpse') + kpse.set_program_name('luatex') + local base, prev, curr + for _, file in ipairs{kpse.lookup(options.contentBlocksLanguageMap, + { all=true })} do + json = assert(io.open(file, "r")):read("*all") + :gsub('("[^\n]-"):','[%1]=') + curr = (function() + local _ENV={ json=json, load=load } -- run in sandbox + return load("return "..json)() + end)() + if type(curr) == "table" then + if base == nil then + base = curr + else + setmetatable(prev, { __index = curr }) + end + prev = curr + end + end + return base or {} +end)() + function self.contentblock(src,suf,type,tit) + src = src.."."..suf + suf = suf:lower() + if type == "onlineimage" then + return {"\\markdownRendererContentBlockOnlineImage{",suf,"}", + "{",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 ""),"}"} + else + return {"\\markdownRendererContentBlock{",suf,"}", + "{",self.string(src),"}", + "{",self.uri(src),"}", + "{",self.string(tit or ""),"}"} + end + end local function ulitem(s) return {"\\markdownRendererUlItem ",s, "\\markdownRendererUlItemEnd "} @@ -829,7 +875,7 @@ parsers.fencedline = function(char) end parsers.leader = parsers.space^-3 --- in balanced brackets, parentheses, quotes: +-- content in balanced brackets, parentheses, or quotes: parsers.bracketed = P{ parsers.lbracket * ((parsers.anyescaped - (parsers.lbracket + parsers.rbracket @@ -856,22 +902,24 @@ parsers.dquoted = P{ parsers.dquote * parsers.alphanumeric ) + V(1))^0 * parsers.dquote } --- bracketed 'tag' for markdown links, allowing nested brackets: +-- bracketed tag for markdown links, allowing nested brackets: parsers.tag = parsers.lbracket * Cs((parsers.alphanumeric^1 + parsers.bracketed + parsers.inticks - + (parsers.anyescaped - (parsers.rbracket - + parsers.blankline^2)))^0) + + (parsers.anyescaped + - (parsers.rbracket + parsers.blankline^2)))^0) * parsers.rbracket --- url for markdown links, allowing balanced parentheses: -parsers.url = parsers.less * Cs((parsers.anyescaped-parsers.more)^0) +-- url for markdown links, allowing nested brackets: +parsers.url = parsers.less * Cs((parsers.anyescaped + - parsers.more)^0) * parsers.more + Cs((parsers.inparens + (parsers.anyescaped - -parsers.spacing-parsers.rparent))^1) + - parsers.spacing + - parsers.rparent))^1) --- quoted text possibly with nested quotes: +-- quoted text, possibly with nested quotes: parsers.title_s = parsers.squote * Cs(((parsers.anyescaped-parsers.squote) + parsers.squoted)^0) * parsers.squote @@ -889,6 +937,70 @@ parsers.title = parsers.title_d + parsers.title_s + parsers.title_p parsers.optionaltitle = parsers.spnl * parsers.title * parsers.spacechar^0 + Cc("") +parsers.contentblock_tail + = parsers.optionaltitle + * (parsers.newline + parsers.eof) + +-- case insensitive online image suffix: +parsers.onlineimagesuffix + = (function(...) + local parser = nil + for _,suffix in ipairs({...}) do + local pattern=nil + for i=1,#suffix do + local char=suffix:sub(i,i) + char = S(char:lower()..char:upper()) + if pattern == nil then + pattern = char + else + pattern = pattern * char + end + end + if parser == nil then + parser = pattern + else + parser = parser + pattern + end + end + return parser + end)("png", "jpg", "jpeg", "gif", "tif", "tiff") + +-- online image url for iA Writer content blocks with mandatory suffix, +-- allowing nested brackets: +parsers.onlineimageurl + = (parsers.less + * Cs((parsers.anyescaped + - parsers.more + - #(parsers.period + * parsers.onlineimagesuffix + * parsers.more + * parsers.contentblock_tail))^0) + * parsers.period + * Cs(parsers.onlineimagesuffix) + * parsers.more + + (Cs((parsers.inparens + + (parsers.anyescaped + - parsers.spacing + - parsers.rparent + - #(parsers.period + * parsers.onlineimagesuffix + * parsers.contentblock_tail)))^0) + * parsers.period + * Cs(parsers.onlineimagesuffix)) + ) * Cc("onlineimage") + +-- filename for iA Writer content blocks with mandatory suffix: +parsers.localfilepath + = parsers.slash + * Cs((parsers.anyescaped + - parsers.tab + - parsers.newline + - #(parsers.period + * parsers.alphanumeric^1 + * parsers.contentblock_tail))^1) + * parsers.period + * Cs(parsers.alphanumeric^1) + * Cc("localfile") parsers.citation_name = Cs(parsers.dash^-1) * parsers.at * Cs(parsers.alphanumeric * (parsers.alphanumeric + parsers.internal_punctuation @@ -1067,6 +1179,16 @@ end parsers.urlchar = parsers.anyescaped - parsers.newline - parsers.more parsers.Block = V("Block") +parsers.OnlineImageURL + = parsers.leader + * parsers.onlineimageurl + * parsers.optionaltitle + +parsers.LocalFilePath + = parsers.leader + * parsers.localfilepath + * parsers.optionaltitle + parsers.TildeFencedCode = parsers.fencehead(parsers.tilde) * Cs(parsers.fencedline(parsers.tilde)^0) @@ -1460,6 +1582,11 @@ function M.reader.new(writer, options) larsers.HtmlEntity = parsers.hexentity / entities.hex_entity / writer.string + parsers.decentity / entities.dec_entity / writer.string + parsers.tagentity / entities.char_entity / writer.string + larsers.ContentBlock = parsers.leader + * (parsers.localfilepath + parsers.onlineimageurl) + * parsers.contentblock_tail + / writer.contentblock + larsers.DisplayHtml = C(parsers.displayhtml) / expandtabs / writer.display_html @@ -1612,7 +1739,8 @@ function M.reader.new(writer, options) Blank = larsers.Blank, - Block = V("Blockquote") + Block = V("ContentBlock") + + V("Blockquote") + V("Verbatim") + V("FencedCode") + V("HorizontalRule") @@ -1624,6 +1752,7 @@ function M.reader.new(writer, options) + V("Paragraph") + V("Plain"), + ContentBlock = larsers.ContentBlock, Blockquote = larsers.Blockquote, Verbatim = larsers.Verbatim, FencedCode = larsers.FencedCode, @@ -1689,6 +1818,10 @@ function M.reader.new(writer, options) syntax.Citations = parsers.fail end + if not options.contentBlocks then + syntax.ContentBlock = parsers.fail + end + if not options.footnotes then syntax.NoteRef = parsers.fail end diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index 19968299e1a..e835ea596dd 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -1044,6 +1044,7 @@ chomp ($Build = `cd $Master/../Build/source && pwd`); 'stellenbosch',"&MAKEcopy", 'streetex', "die 'skipping, nonfree'", 'style_showcase', "die 'skipping, until JimH advises it is a good idea'", + 'svg', "&MAKEflatten", 'svjour', "die 'skipping, license and packaging unclear'", 'symbolindex', "die 'skipping, requires binary'", 't2', "&MAKEt2", |