summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2016-08-15 20:33:02 +0000
committerKarl Berry <karl@freefriends.org>2016-08-15 20:33:02 +0000
commit1850016c7aa713d8e5b7e6ac583199a938407287 (patch)
tree5d19cb8b694fbffc7b7606bfe1c1f98b764d5d08
parentc412591dd67ff53334e28fc8f17cc9593a5d5f59 (diff)
markdown (16aug16)
git-svn-id: svn://tug.org/texlive/trunk@41855 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/generic/markdown/markdown.pdfbin314655 -> 299789 bytes
-rw-r--r--Master/texmf-dist/source/generic/markdown/markdown.dtx664
-rw-r--r--Master/texmf-dist/tex/context/third/markdown/t-markdown.tex31
-rw-r--r--Master/texmf-dist/tex/generic/markdown/markdown.tex311
-rw-r--r--Master/texmf-dist/tex/latex/markdown/markdown.sty84
-rw-r--r--Master/texmf-dist/tex/luatex/markdown/markdown.lua66
6 files changed, 781 insertions, 375 deletions
diff --git a/Master/texmf-dist/doc/generic/markdown/markdown.pdf b/Master/texmf-dist/doc/generic/markdown/markdown.pdf
index afa021947e9..36777fbd15b 100644
--- a/Master/texmf-dist/doc/generic/markdown/markdown.pdf
+++ b/Master/texmf-dist/doc/generic/markdown/markdown.pdf
Binary files differ
diff --git a/Master/texmf-dist/source/generic/markdown/markdown.dtx b/Master/texmf-dist/source/generic/markdown/markdown.dtx
index 49995231e70..d657c7eeb20 100644
--- a/Master/texmf-dist/source/generic/markdown/markdown.dtx
+++ b/Master/texmf-dist/source/generic/markdown/markdown.dtx
@@ -136,8 +136,8 @@
% packages that enable the direct inclusion of markdown documents inside \TeX{}
% documents.
%
-% Architecturally, the package consists of the \pkg{Lunamark} Lua module by
-% John MacFarlane, which was slimmed down and rewritten for the needs of the
+% Architecturally, the package consists of the \pkg{Lunamark} v1.4.0 Lua module
+% by John MacFarlane, which was slimmed down and rewritten for the needs of the
% package. On top of \pkg{Lunamark} sits code for the plain \TeX{}, \LaTeX{},
% and \Hologo{ConTeXt} formats by Vít Novotný.
%
@@ -146,7 +146,7 @@
% \fi
% \begin{macrocode}
if not modules then modules = { } end modules ['markdown'] = {
- version = "1.0.1",
+ version = "1.0.2",
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; 2016 Vít Novotný",
@@ -217,7 +217,7 @@ local md5 = require("md5")
% \m{markdownOptionCacheDir} macro before interfacing with the
% \pkg{Lunamark} library.
%
-% The plain \TeX{} code makes use of the \luam{isDir} method that was added
+% The plain \TeX{} code makes use of the \luam{isdir} method that was added
% to the module by the Lua\TeX{} engine developers (see
% \cite[Section~3.2]{luatex16}). This method is not present in the base
% library.
@@ -312,9 +312,6 @@ local M = {}
% recognized by the Lua interface. (see Section \ref{sec:luaoptions}). The
% \t`options` parameter is optional; when unspecified, the behaviour will be
% the same as if \t`options` were an empty table.
-% \begin{macrocode}
-M.new = {}
-% \end{macrocode}
%
% The following example Lua code converts the markdown string \t`_Hello
% world!_` to a \TeX{} output using the default options and prints the \TeX{}
@@ -501,7 +498,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\markdownVersion{2016/06/03}%
+\def\markdownLastModified{2016/08/14}%
+\def\markdownVersion{1.0.2}%
% \end{macrocode}
%
% The plain \TeX{} interface is implemented by the \t`markdown.tex` file that
@@ -639,7 +637,7 @@ defaultOptions.tightLists = true
\let\markdownOptionBlankBeforeBlockquote\undefined
\let\markdownOptionBlankBeforeHeading\undefined
\let\markdownOptionDefinitionLists\undefined
-\let\markdownOptionHashEnumerator\undefined
+\let\markdownOptionHashEnumerators\undefined
\let\markdownOptionHybrid\undefined
\let\markdownOptionFootnotes\undefined
\let\markdownOptionPreserveTabs\undefined
@@ -673,6 +671,36 @@ defaultOptions.tightLists = true
\markdownRendererEllipsisPrototype}%
% \end{macrocode}
%
+% \paragraph{Special Character Renderers}
+% The following macros replace any special plain \TeX{} characters (including
+% the active pipe character (\t`|`) of \Hologo{ConTeXt}) in the input text.
+% These macros will only be produced, when the \Opt{hybrid} option is
+% \t`false`.
+% \begin{macrocode}
+\def\markdownRendererLeftBrace{%
+ \markdownRendererLeftBracePrototype}%
+\def\markdownRendererRightBrace{%
+ \markdownRendererRightBracePrototype}%
+\def\markdownRendererDollarSign{%
+ \markdownRendererDollarSignPrototype}%
+\def\markdownRendererPercentSign{%
+ \markdownRendererPercentSignPrototype}%
+\def\markdownRendererAmpersand{%
+ \markdownRendererAmpersandPrototype}%
+\def\markdownRendererUnderscore{%
+ \markdownRendererUnderscorePrototype}%
+\def\markdownRendererHash{%
+ \markdownRendererHashPrototype}%
+\def\markdownRendererCircumflex{%
+ \markdownRendererCircumflexPrototype}%
+\def\markdownRendererBackslash{%
+ \markdownRendererBackslashPrototype}%
+\def\markdownRendererTilde{%
+ \markdownRendererTildePrototype}%
+\def\markdownRendererPipe{%
+ \markdownRendererPipePrototype}%
+% \end{macrocode}
+%
% \paragraph{Code Span Renderer}
% The \mdef{markdownRendererCodeSpan} macro represents inlined code span in the
% input text. It receives a single argument that corresponds to the inlined
@@ -684,15 +712,19 @@ defaultOptions.tightLists = true
%
% \paragraph{Link Renderer}
% The \mdef{markdownRendererLink} macro represents a hyperlink. It receives
-% three arguments: the label, the \acro{uri}, and the title of the link.
+% 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.
% \begin{macrocode}
\def\markdownRendererLink{%
\markdownRendererLinkPrototype}%
% \end{macrocode}
%
% \paragraph{Image Renderer}
-% The \mdef{markdownRendererImage} macro represents an image. It receives three
-% arguments: the label, the \acro{url}, and the title of the image.
+% The \mdef{markdownRendererImage} macro represents an image. It receives four
+% 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.
% \begin{macrocode}
\def\markdownRendererImage{%
\markdownRendererImagePrototype}%
@@ -813,14 +845,30 @@ defaultOptions.tightLists = true
\markdownRendererDlBeginTightPrototype}%
% \end{macrocode}
%
-% The \mdef{markdownRendererDlItem} macro represents an item in a definition
-% list. The macro receives a single argument that corresponds to the term being
-% defined.
+% The \mdef{markdownRendererDlItem} macro represents a term in a definition
+% list. The macro receives a single argument that corresponds to the term
+% being defined.
% \begin{macrocode}
\def\markdownRendererDlItem{%
\markdownRendererDlItemPrototype}%
% \end{macrocode}
%
+% The \mdef{markdownRendererDlDefinitionBegin} macro represents the beginning
+% of a definition in a definition list. There can be several definitions for
+% a single term.
+% \begin{macrocode}
+\def\markdownRendererDlDefinitionBegin{%
+ \markdownRendererDlDefinitionBeginPrototype}%
+% \end{macrocode}
+%
+% The \mdef{markdownRendererDlDefinitionEnd} macro represents the end of a
+% definition in a definition list. There can be several definitions for a
+% single term.
+% \begin{macrocode}
+\def\markdownRendererDlDefinitionEnd{%
+ \markdownRendererDlDefinitionEndPrototype}%
+% \end{macrocode}
+%
% The \mdef{markdownRendererDlEnd} 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.
@@ -954,9 +1002,20 @@ defaultOptions.tightLists = true
% \begin{macrocode}
\def\markdownRendererLineBreakPrototype{}%
\def\markdownRendererEllipsisPrototype{}%
+\def\markdownRendererLeftBracePrototype{}%
+\def\markdownRendererRightBracePrototype{}%
+\def\markdownRendererDollarSignPrototype{}%
+\def\markdownRendererPercentSignPrototype{}%
+\def\markdownRendererAmpersandPrototype{}%
+\def\markdownRendererUnderscorePrototype{}%
+\def\markdownRendererHashPrototype{}%
+\def\markdownRendererCircumflexPrototype{}%
+\def\markdownRendererBackslashPrototype{}%
+\def\markdownRendererTildePrototype{}%
+\def\markdownRendererPipePrototype{}%
\long\def\markdownRendererCodeSpanPrototype#1{}%
-\long\def\markdownRendererLinkPrototype#1#2#3{}%
-\long\def\markdownRendererImagePrototype#1#2#3{}%
+\long\def\markdownRendererLinkPrototype#1#2#3#4{}%
+\long\def\markdownRendererImagePrototype#1#2#3#4{}%
\def\markdownRendererUlBeginPrototype{}%
\def\markdownRendererUlBeginTightPrototype{}%
\def\markdownRendererUlItemPrototype{}%
@@ -971,6 +1030,8 @@ defaultOptions.tightLists = true
\def\markdownRendererDlBeginPrototype{}%
\def\markdownRendererDlBeginTightPrototype{}%
\long\def\markdownRendererDlItemPrototype#1{}%
+\def\markdownRendererDlDefinitionBeginPrototype{}%
+\def\markdownRendererDlDefinitionEndPrototype{}%
\def\markdownRendererDlEndPrototype{}%
\def\markdownRendererDlEndTightPrototype{}%
\long\def\markdownRendererEmphasisPrototype#1{}%
@@ -1063,6 +1124,30 @@ defaultOptions.tightLists = true
% Section \ref{sec:directlua}), the first argument may not contain the
% string \t`]]` (regardless of the category code of the bracket symbol (\t`]`)).
%
+% The \mdef{markdownMode} macro specifies how the plain \TeX{} implementation
+% interfaces with the Lua interface. The valid values and their meaning are
+% as follows:
+% \begin{itemize}
+% \item\t`0` -- Shell escape via the 18 output file stream
+% \item\t`1` -- Shell escape via the Lua \luam{os.execute} method
+% \item\t`2` -- Direct Lua access
+% \end{itemize}
+% By defining the macro, the user can coerce the package to use a specific mode.
+% If the user does not define the macro prior to loading the plain \TeX{}
+% implementation, the correct value will be automatically detected. The outcome
+% of changing the value of \m{markdownMode} after the implementation has been
+% loaded is undefined.
+% \begin{macrocode}
+\ifx\markdownMode\undefined
+ \ifx\directlua\undefined
+ \def\markdownMode{0}%
+ \else
+ \def\markdownMode{2}%
+ \fi
+\fi
+% \end{macrocode}
+%
+%
% \iffalse
%</tex>
%<*latex>
@@ -1223,12 +1308,34 @@ defaultOptions.tightLists = true
\renewcommand\markdownRendererLineBreak{#1}}%
\define@key{markdownRenderers}{ellipsis}{%
\renewcommand\markdownRendererEllipsis{#1}}%
+\define@key{markdownRenderers}{leftBrace}{%
+ \renewcommand\markdownRendererLeftBrace{#1}}%
+\define@key{markdownRenderers}{rightBrace}{%
+ \renewcommand\markdownRendererRightBrace{#1}}%
+\define@key{markdownRenderers}{dollarSign}{%
+ \renewcommand\markdownRendererDollarSign{#1}}%
+\define@key{markdownRenderers}{percentSign}{%
+ \renewcommand\markdownRendererPercentSign{#1}}%
+\define@key{markdownRenderers}{ampersand}{%
+ \renewcommand\markdownRendererAmpersand{#1}}%
+\define@key{markdownRenderers}{underscore}{%
+ \renewcommand\markdownRendererUnderscore{#1}}%
+\define@key{markdownRenderers}{hash}{%
+ \renewcommand\markdownRendererHash{#1}}%
+\define@key{markdownRenderers}{circumflex}{%
+ \renewcommand\markdownRendererCircumflex{#1}}%
+\define@key{markdownRenderers}{backslash}{%
+ \renewcommand\markdownRendererBackslash{#1}}%
+\define@key{markdownRenderers}{tilde}{%
+ \renewcommand\markdownRendererTilde{#1}}%
+\define@key{markdownRenderers}{pipe}{%
+ \renewcommand\markdownRendererPipe{#1}}%
\define@key{markdownRenderers}{codeSpan}{%
\renewcommand\markdownRendererCodeSpan[1]{#1}}%
\define@key{markdownRenderers}{link}{%
- \renewcommand\markdownRendererLink[3]{#1}}%
+ \renewcommand\markdownRendererLink[4]{#1}}%
\define@key{markdownRenderers}{image}{%
- \renewcommand\markdownRendererImage[3]{#1}}%
+ \renewcommand\markdownRendererImage[4]{#1}}%
\define@key{markdownRenderers}{ulBegin}{%
\renewcommand\markdownRendererUlBegin{#1}}%
\define@key{markdownRenderers}{ulBeginTight}{%
@@ -1257,6 +1364,10 @@ defaultOptions.tightLists = true
\renewcommand\markdownRendererDlBeginTight{#1}}%
\define@key{markdownRenderers}{dlItem}{%
\renewcommand\markdownRendererDlItem[1]{#1}}%
+\define@key{markdownRenderers}{dlDefinitionBegin}{%
+ \renewcommand\markdownRendererDlDefinitionBegin{#1}}%
+\define@key{markdownRenderers}{dlDefinitionEnd}{%
+ \renewcommand\markdownRendererDlDefinitionEnd{#1}}%
\define@key{markdownRenderers}{dlEnd}{%
\renewcommand\markdownRendererDlEnd{#1}}%
\define@key{markdownRenderers}{dlEndTight}{%
@@ -1295,7 +1406,7 @@ defaultOptions.tightLists = true
% \begin{Verbatim}
% \markdownSetup{
% renderers = {
-% link = {#3}, % Render links as the link title.
+% link = {#4}, % Render links as the link title.
% emphasis = {\emph{#1}}, % Render emphasized text via `\emph`.
% }
% }
@@ -1313,12 +1424,34 @@ defaultOptions.tightLists = true
\renewcommand\markdownRendererLineBreakPrototype{#1}}%
\define@key{markdownRendererPrototypes}{ellipsis}{%
\renewcommand\markdownRendererEllipsisPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{leftBrace}{%
+ \renewcommand\markdownRendererLeftBracePrototype{#1}}%
+\define@key{markdownRendererPrototypes}{rightBrace}{%
+ \renewcommand\markdownRendererRightBracePrototype{#1}}%
+\define@key{markdownRendererPrototypes}{dollarSign}{%
+ \renewcommand\markdownRendererDollarSignPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{percentSign}{%
+ \renewcommand\markdownRendererPercentSignPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{ampersand}{%
+ \renewcommand\markdownRendererAmpersandPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{underscore}{%
+ \renewcommand\markdownRendererUnderscorePrototype{#1}}%
+\define@key{markdownRendererPrototypes}{hash}{%
+ \renewcommand\markdownRendererHashPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{circumflex}{%
+ \renewcommand\markdownRendererCircumflexPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{backslash}{%
+ \renewcommand\markdownRendererBackslashPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{tilde}{%
+ \renewcommand\markdownRendererTildePrototype{#1}}%
+\define@key{markdownRendererPrototypes}{pipe}{%
+ \renewcommand\markdownRendererPipe{#1}}%
\define@key{markdownRendererPrototypes}{codeSpan}{%
\renewcommand\markdownRendererCodeSpanPrototype[1]{#1}}%
\define@key{markdownRendererPrototypes}{link}{%
- \renewcommand\markdownRendererLink[3]{#1}}%
+ \renewcommand\markdownRendererLink[4]{#1}}%
\define@key{markdownRendererPrototypes}{image}{%
- \renewcommand\markdownRendererImage[3]{#1}}%
+ \renewcommand\markdownRendererImage[4]{#1}}%
\define@key{markdownRendererPrototypes}{ulBegin}{%
\renewcommand\markdownRendererUlBeginPrototype{#1}}%
\define@key{markdownRendererPrototypes}{ulBeginTight}{%
@@ -1347,6 +1480,10 @@ defaultOptions.tightLists = true
\renewcommand\markdownRendererDlBeginTightPrototype{#1}}%
\define@key{markdownRendererPrototypes}{dlItem}{%
\renewcommand\markdownRendererDlItemPrototype[1]{#1}}%
+\define@key{markdownRendererPrototypes}{dlDefinitionBegin}{%
+ \renewcommand\markdownRendererDlDefinitionBeginPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{dlDefinitionEnd}{%
+ \renewcommand\markdownRendererDlDefinitionEndPrototype{#1}}%
\define@key{markdownRendererPrototypes}{dlEnd}{%
\renewcommand\markdownRendererDlEndPrototype{#1}}%
\define@key{markdownRendererPrototypes}{dlEndTight}{%
@@ -1805,36 +1942,55 @@ function M.writer.new(options)
self.hrule = "\\markdownRendererHorizontalRule "
% \end{macrocode}
%
-% Define a table \luamdef{escaped} containing the mapping from special plain
-% \TeX{} characters to their escaped variants.
-% \begin{macrocode}
- local escaped = {
- ["{"] = "\\{",
- ["}"] = "\\}",
- ["$"] = "\\$",
- ["%"] = "\\%",
- ["&"] = "\\&",
- ["_"] = "\\_",
- ["#"] = "\\#",
- ["^"] = "\\^{}",
- ["\\"] = "\\char92{}",
- ["~"] = "\\char126{}",
- ["|"] = "\\char124{}", }
-% \end{macrocode}
-% Use the \luam{escaped} table to create an escaper function \luamdef{escape}.
-% \begin{macrocode}
- local escape = util.escaper(escaped)
+% Define a table \luamdef{escaped_chars} containing the mapping from special
+% plain \TeX{} characters (including the active pipe character (\t`|`) of
+% \Hologo{ConTeXt}) to their escaped variants. Define tables
+% \luamdef{escaped_minimal_chars} and \luamdef{escaped_minimal_strings}
+% containing the mapping from special plain characters and character strings
+% that need to be escaped even in content that will not be typeset.
+% \begin{macrocode}
+ local escaped_chars = {
+ ["{"] = "\\markdownRendererLeftBrace{}",
+ ["}"] = "\\markdownRendererRightBrace{}",
+ ["$"] = "\\markdownRendererDollarSign{}",
+ ["%"] = "\\markdownRendererPercentSign{}",
+ ["&"] = "\\markdownRendererAmpersand{}",
+ ["_"] = "\\markdownRendererUnderscore{}",
+ ["#"] = "\\markdownRendererHash{}",
+ ["^"] = "\\markdownRendererCircumflex{}",
+ ["\\"] = "\\markdownRendererBackslash{}",
+ ["~"] = "\\markdownRendererTilde{}",
+ ["|"] = "\\markdownRendererPipe{}", }
+ local escaped_minimal_chars = {
+ ["{"] = "\\markdownRendererLeftBrace{}",
+ ["}"] = "\\markdownRendererRightBrace{}",
+ ["%"] = "\\markdownRendererPercentSign{}",
+ ["\\"] = "\\markdownRendererBackslash{}", }
+ local escaped_minimal_strings = {
+ ["^^"] = "\\markdownRendererCircumflex\\markdownRendererCircumflex ", }
+% \end{macrocode}
+% Use the \luam{escaped_chars} table to create an escaper function
+% \luamdef{escape} and the \luam{escaped_minimal_chars} and
+% \luam{escaped_minimal_strings} tables to create an escaper function
+% \luamdef{escape_minimal}.
+% \begin{macrocode}
+ local escape = util.escaper(escaped_chars)
+ local escape_minimal = util.escaper(escaped_minimal_chars,
+ escaped_minimal_strings)
% \end{macrocode}
%
% Define \luamdef{writer->string} as a function that will transform an input
-% plain text span \t`s` to the output format. If the \Opt{hybrid} option is
-% \t`true`, use an identity function. Otherwise, use the \luam{escape}
-% function.
+% plain text span \t`s` to the output format and \luamdef{writer->uri} as a
+% function that will transform an input \acro{uri} \t`u` to the output format.
+% If the \Opt{hybrid} option is \t`true`, use identity functions. Otherwise,
+% use the \luam{escape} and \luam{escape_minimal} functions.
% \begin{macrocode}
if options.hybrid then
self.string = function(s) return s end
+ self.uri = function(u) return u end
else
self.string = escape
+ self.uri = escape_minimal
end
% \end{macrocode}
%
@@ -1847,13 +2003,14 @@ function M.writer.new(options)
% \end{macrocode}
%
% Define \luamdef{writer->link} as a function that will transform an input
-% hyperlink to the output format, where \t`lab` corresponds to thelabel,
+% hyperlink to the output format, where \t`lab` corresponds to the label,
% \t`src` to \acro{uri}, and \t`tit` to the title of the link.
% \begin{macrocode}
function self.link(lab,src,tit)
return {"\\markdownRendererLink{",lab,"}",
"{",self.string(src),"}",
- "{",self.string(tit),"}"}
+ "{",self.uri(src),"}",
+ "{",self.string(tit or ""),"}"}
end
% \end{macrocode}
%
@@ -1864,7 +2021,8 @@ function M.writer.new(options)
function self.image(lab,src,tit)
return {"\\markdownRendererImage{",lab,"}",
"{",self.string(src),"}",
- "{",self.string(tit),"}"}
+ "{",self.uri(src),"}",
+ "{",self.string(tit or ""),"}"}
end
% \end{macrocode}
%
@@ -1932,15 +2090,19 @@ function M.writer.new(options)
% is a term and \t`defs` is an array of definitions. \t`tight` specifies,
% whether the list is tight or not.
% \begin{macrocode}
- local function dlitem(term,defs)
- return {"\\markdownRendererDlItem{",term,"}\n",defs}
+ local function dlitem(term, defs)
+ local retVal = {"\\markdownRendererDlItem{",term,"}"}
+ for _, def in ipairs(defs) do
+ retVal[#retVal+1] = {"\\markdownRendererDlDefinitionBegin ",def,
+ "\\markdownRendererDlDefinitionEnd "}
+ end
+ return retVal
end
function self.definitionlist(items,tight)
local buffer = {}
for _,item in ipairs(items) do
- buffer[#buffer + 1] = dlitem(item.term,
- util.intersperse(item.definitions, self.interblocksep))
+ buffer[#buffer + 1] = dlitem(item.term, item.definitions)
end
local contents = util.intersperse(buffer, self.containersep)
if tight and options.tightLists then
@@ -2163,7 +2325,7 @@ function M.reader.new(writer, options)
local fail = any - 1
local always = P("")
- local escapable = S("\\`*_{}[]()+_.!#-~:^")
+ local escapable = S("\\`*_{}[]()+_.!<>#-~:^")
local anyescaped = P("\\") / "" * escapable
+ any
@@ -2176,9 +2338,9 @@ function M.reader.new(writer, options)
local specialchar
if options.smartEllipses then
- specialchar = S("*_`&[]!\\.")
+ specialchar = S("*_`&[]<!\\.")
else
- specialchar = S("*_`&[]!\\")
+ specialchar = S("*_`&[]<!\\")
end
local normalchar = any -
@@ -2321,7 +2483,7 @@ function M.reader.new(writer, options)
if found then
return writer.note(parse_blocks(found))
else
- return {"[^", ref, "]"}
+ return {"[", parse_inlines("^" .. ref), "]"}
end
end
end
@@ -2835,14 +2997,25 @@ return M
\errmessage{(l.\the\inputlineno) markdown.tex error: #1}}%
% \end{macrocode}
%
-% \subsubsection{Options}
+% \subsubsection{Token Renderers}
% The following definitions should be considered placeholder.
% \begin{macrocode}
\def\markdownRendererLineBreakPrototype{\hfil\break}%
\let\markdownRendererEllipsisPrototype\dots
+\def\markdownRendererLeftBracePrototype{\char`{}%
+\def\markdownRendererRightBracePrototype{\char`}}%
+\def\markdownRendererDollarSignPrototype{\char`$}%
+\def\markdownRendererPercentSignPrototype{\char`\%}%
+\def\markdownRendererAmpersandPrototype{\char`&}%
+\def\markdownRendererUnderscorePrototype{\char`_}%
+\def\markdownRendererHashPrototype{\char`\#}%
+\def\markdownRendererCircumflexPrototype{\char`^}%
+\def\markdownRendererBackslashPrototype{\char`\\}%
+\def\markdownRendererTildePrototype{\char`~}%
+\def\markdownRendererPipePrototype{|}%
\long\def\markdownRendererCodeSpanPrototype#1{{\tt#1}}%
-\long\def\markdownRendererLinkPrototype#1#2#3{#1}%
-\long\def\markdownRendererImagePrototype#1#2#3{#1}%
+\long\def\markdownRendererLinkPrototype#1#2#3#4{#2}%
+\long\def\markdownRendererImagePrototype#1#2#3#4{#2}%
\def\markdownRendererUlBeginPrototype{}%
\def\markdownRendererUlBeginTightPrototype{}%
\def\markdownRendererUlItemPrototype{}%
@@ -2857,6 +3030,8 @@ return M
\def\markdownRendererDlBeginPrototype{}%
\def\markdownRendererDlBeginTightPrototype{}%
\long\def\markdownRendererDlItemPrototype#1{#1}%
+\def\markdownRendererDlDefinitionBeginPrototype{}%
+\def\markdownRendererDlDefinitionEndPrototype{\par}%
\def\markdownRendererDlEndPrototype{}%
\def\markdownRendererDlEndTightPrototype{}%
\long\def\markdownRendererEmphasisPrototype#1{{\it#1}}%
@@ -2864,7 +3039,7 @@ return M
\def\markdownRendererBlockQuoteBeginPrototype{\par\begingroup\it}%
\def\markdownRendererBlockQuoteEndPrototype{\endgroup\par}%
\long\def\markdownRendererInputVerbatimPrototype#1{%
- \par{\tt\input"#1"\relax}\par}%
+\par{\tt\input"#1"\relax}\par}%
\long\def\markdownRendererHeadingOnePrototype#1{#1}%
\long\def\markdownRendererHeadingTwoPrototype#1{#1}%
\long\def\markdownRendererHeadingThreePrototype#1{#1}%
@@ -2883,39 +3058,39 @@ return M
% to expand to either \t`true` or \t`false`.
% \begin{macrocode}
\def\markdownLuaOptions{{%
- \ifx\markdownOptionBlankBeforeBlockquote\undefined\else
- blankBeforeBlockquote = \markdownOptionBlankBeforeBlockquote,
- \fi
- \ifx\markdownOptionBlankBeforeHeading\undefined\else
- blankBeforeHeading = \markdownOptionBlankBeforeHeading,
- \fi
- \ifx\markdownOptionCacheDir\undefined\else
- cacheDir = "\markdownOptionCacheDir",
- \fi
- \ifx\markdownOptionDefinitionLists\undefined\else
- definitionLists = \markdownOptionDefinitionLists,
- \fi
- \ifx\markdownOptionHashEnumerators\undefined\else
- hashEnumerators = \markdownOptionHashEnumerators,
- \fi
- \ifx\markdownOptionHybrid\undefined\else
- hybrid = \markdownOptionHybrid,
- \fi
- \ifx\markdownOptionFootnotes\undefined\else
- footnotes = \markdownOptionFootnotes,
- \fi
- \ifx\markdownOptionPreserveTabs\undefined\else
- preserveTabs = \markdownOptionPreserveTabs,
- \fi
- \ifx\markdownOptionSmartEllipses\undefined\else
- smartEllipses = \markdownOptionSmartEllipses,
- \fi
- \ifx\markdownOptionStartNumber\undefined\else
- startNumber = \markdownOptionStartNumber,
- \fi
- \ifx\markdownOptionTightLists\undefined\else
- tightLists = \markdownOptionTightLists,
- \fi}
+\ifx\markdownOptionBlankBeforeBlockquote\undefined\else
+ blankBeforeBlockquote = \markdownOptionBlankBeforeBlockquote,
+\fi
+\ifx\markdownOptionBlankBeforeHeading\undefined\else
+ blankBeforeHeading = \markdownOptionBlankBeforeHeading,
+\fi
+\ifx\markdownOptionCacheDir\undefined\else
+ cacheDir = "\markdownOptionCacheDir",
+\fi
+\ifx\markdownOptionDefinitionLists\undefined\else
+ definitionLists = \markdownOptionDefinitionLists,
+\fi
+\ifx\markdownOptionHashEnumerators\undefined\else
+ hashEnumerators = \markdownOptionHashEnumerators,
+\fi
+\ifx\markdownOptionHybrid\undefined\else
+ hybrid = \markdownOptionHybrid,
+\fi
+\ifx\markdownOptionFootnotes\undefined\else
+ footnotes = \markdownOptionFootnotes,
+\fi
+\ifx\markdownOptionPreserveTabs\undefined\else
+ preserveTabs = \markdownOptionPreserveTabs,
+\fi
+\ifx\markdownOptionSmartEllipses\undefined\else
+ smartEllipses = \markdownOptionSmartEllipses,
+\fi
+\ifx\markdownOptionStartNumber\undefined\else
+ startNumber = \markdownOptionStartNumber,
+\fi
+\ifx\markdownOptionTightLists\undefined\else
+ tightLists = \markdownOptionTightLists,
+\fi}
}%
% \end{macrocode}
%
@@ -2927,25 +3102,26 @@ return M
% \end{macrocode}
% First, ensure that the \m{markdownOptionCacheDir} directory exists.
% \begin{macrocode}
- local lfs = require("lfs")
- local cacheDir = "\markdownOptionCacheDir"
- if lfs.isdir(cacheDir) == true then else
- assert(lfs.mkdir(cacheDir))
- end
+local lfs = require("lfs")
+local cacheDir = "\markdownOptionCacheDir"
+if lfs.isdir(cacheDir) == true then else
+ assert(lfs.mkdir(cacheDir))
+end
% \end{macrocode}
% Next, load the \t`markdown` module and create a converter function using
% the plain \TeX{} options, which were serialized to a Lua table via the
% \m{markdownLuaOptions} macro.
% \begin{macrocode}
- local md = require("markdown")
- local convert = md.new(\markdownLuaOptions)
+local md = require("markdown")
+local convert = md.new(\markdownLuaOptions)
}%
% \end{macrocode}
%
-% \subsubsection{Lua \t`\textbackslash write18` Bridge}\label{sec:luabridge}
+% \subsubsection{Lua Shell Escape Bridge}\label{sec:luabridge}
% The following \TeX{} code is intended for \TeX{} engines that do not provide
-% direct access to Lua, but expose the shell of the operating system through
-% the output file stream 18 (\Hologo{XeTeX}, \hologo{pdfLaTeX}).
+% direct access to Lua, but expose the shell of the operating system. This
+% corresponds to the \m{markdownMode} values of \t`0` and \t`1`.
+%
% The \m{markdownLuaExecute} and \m{markdownReadAndConvert} macros defined here
% and in Section \ref{sec:directlua} are meant to be transparent to the
% remaining code.
@@ -2955,7 +3131,13 @@ return M
% execute Lua scripts using the \TeX{}Lua interpreter (see
% \cite[Section~3.1.1]{luatex16}).
% \begin{macrocode}
-\ifx\directlua\undefined
+
+\ifnum\markdownMode<2\relax
+\ifnum\markdownMode=0\relax
+ \markdownInfo{Using mode 0: Shell escape via write18}%
+\else
+ \markdownInfo{Using mode 1: Shell escape via os.execute}%
+\fi
% \end{macrocode}
%
% The macro \mdef{markdownLuaExecuteFileStream} contains the number of the output
@@ -2965,125 +3147,153 @@ return M
% named \m{markdownOptionInputTempFileName} during the expansion of the macro
% \m{markdownReadAndConvert}.
% \begin{macrocode}
- \csname newwrite\endcsname\markdownLuaExecuteFileStream
+\csname newwrite\endcsname\markdownLuaExecuteFileStream
% \end{macrocode}
%
-% The \mdef{markdownLuaExecuteShellEscape} macro contains the numeric value of
-% either the \m{pdfshellescape} (Lua\TeX{}, \Hologo{pdfTeX}) or the
-% \m{shellescape} (\Hologo{XeTeX}) commands. This value indicates, whether the
-% shell access is enabled (\t`1`), disabled (\t`0`), or restricted (\t`2`). If
-% neither of these commands is defined, act as if the shell access were enabled.
+% The \mdef{markdownExecuteShellEscape} macro contains the numeric value indicating
+% whether the shell access is enabled (\t`1`), disabled (\t`0`), or restricted
+% (\t`2`).
+%
+% If Lua is unavailable, inherit the value of the the \m{pdfshellescape}
+% (Lua\TeX{}, \Hologo{pdfTeX}) or the \m{shellescape} (\Hologo{XeTeX})
+% commands. If neither of these commands is defined, act as if the shell access
+% were enabled.
% \begin{macrocode}
- \csname newcount\endcsname\markdownLuaExecuteShellEscape
+\ifnum\markdownMode=0\relax
\ifx\pdfshellescape\undefined
\ifx\shellescape\undefined
- \markdownLuaExecuteShellEscape=1%
+ \def\markdownExecuteShellEscape{1}%
\else
- \markdownLuaExecuteShellEscape=\shellescape
+ \let\markdownExecuteShellEscape\shellescape
\fi
\else
- \markdownLuaExecuteShellEscape=\pdfshellescape
+ \let\markdownExecuteShellEscape\pdfshellescape
\fi
% \end{macrocode}
+% If Lua is available, inherit the value of the \t`status.shell_escape`
+% configuration item.
+% \begin{macrocode}
+\else
+ \def\markdownExecuteShellEscape{%
+ \directlua{tex.sprint(status.shell_escape)}}%
+\fi
+% \end{macrocode}
+%
+% 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.
+% \begin{macrocode}
+\ifnum\markdownMode=0\relax
+ \def\markdownExecuteDirect#1{\immediate\write18{#1}}%
+\else
+ \def\markdownExecuteDirect#1{%
+ \directlua{os.execute("\luaescapestring{#1}")}}%
+\fi
+% \end{macrocode}
+%
+% The \mdef{markdownExecute} macro is a wrapper on top of
+% \m{markdownExecuteDirect} that checks the value of
+% \m{markdownExecuteShellEscape} and prints an error message if the shell is
+% inaccessible.
+% \begin{macrocode}
+\def\markdownExecute#1{%
+ \ifnum\markdownExecuteShellEscape=1\relax
+ \markdownExecuteDirect{#1}%
+ \else
+ \markdownError{I can not access the shell}{Either run the TeX
+ compiler with the --shell-escape or the --enable-write18 flag,
+ or set shell_escape=t in the texmf.cnf file}%
+ \fi}%
+% \end{macrocode}
%
% The \mdef{markdownLuaExecute} macro executes the Lua code it has received as
% its first argument. The Lua code may not directly interact with the \TeX{}
% engine, but it can use the \luam{print} function in the same manner it
% would use the \luam{tex.print} method.
% \begin{macrocode}
- \def\markdownLuaExecute#1{%
+\def\markdownLuaExecute#1{%
% \end{macrocode}
-% If the shell is accessible, create the file
-% \m{markdownOptionHelperScriptFileName} and fill it with the input Lua code
-% prepended with \pkg{kpathsea} initialization, so that Lua modules from the
-% \TeX{} distribution are available.
+% Create the file \m{markdownOptionHelperScriptFileName} and fill it with the
+% input Lua code prepended with \pkg{kpathsea} initialization, so that Lua
+% modules from the \TeX{} distribution are available.
% \begin{macrocode}
- \ifnum\markdownLuaExecuteShellEscape=1%
- \immediate\openout\markdownLuaExecuteFileStream=%
- \markdownOptionHelperScriptFileName
- \markdownInfo{Writing a helper Lua script to the file
- "\markdownOptionHelperScriptFileName"}%
- \immediate\write\markdownLuaExecuteFileStream{%
- local kpse = require('kpse')
- kpse.set_program_name('luatex') #1}%
- \immediate\closeout\markdownLuaExecuteFileStream
+ \immediate\openout\markdownLuaExecuteFileStream=%
+ \markdownOptionHelperScriptFileName
+ \markdownInfo{Writing a helper Lua script to the file
+ "\markdownOptionHelperScriptFileName"}%
+ \immediate\write\markdownLuaExecuteFileStream{%
+ local kpse = require('kpse')
+ kpse.set_program_name('luatex') #1}%
+ \immediate\closeout\markdownLuaExecuteFileStream
% \end{macrocode}
% Execute the generated \m{markdownOptionHelperScriptFileName} Lua script using
% the \TeX{}Lua binary and store the output in the
% \m{markdownOptionOutputTempFileName} file.
% \begin{macrocode}
- \markdownInfo{Executing a helper Lua script from the file
- "\markdownOptionHelperScriptFileName" and storing the result in the
- file "\markdownOptionOutputTempFileName"}%
- \immediate\write18{texlua "\markdownOptionHelperScriptFileName" >
- "\markdownOptionOutputTempFileName"}%
+ \markdownInfo{Executing a helper Lua script from the file
+ "\markdownOptionHelperScriptFileName" and storing the result in the
+ file "\markdownOptionOutputTempFileName"}%
+ \markdownExecute{texlua "\markdownOptionHelperScriptFileName" >
+ "\markdownOptionOutputTempFileName"}%
% \end{macrocode}
% \m{input} the generated \m{markdownOptionOutputTempFileName} file.
% \begin{macrocode}
- \input\markdownOptionOutputTempFileName\relax
- \else
-% \end{macrocode}
-% If the shell is inaccessible, let the user know and suggest a remedy.
-% \begin{macrocode}
- \markdownError{I can not access the shell}{Either run the TeX
- compiler with the --shell-escape or the --enable-write18 flag,
- or set shell_escape=t in the texmf.cnf file}%
- \fi}%
+ \input\markdownOptionOutputTempFileName\relax}%
% \end{macrocode}
%
% The \mdef{markdownReadAndConvertTab} macro contains the tab character literal.
% \begin{macrocode}
- \begingroup
- \catcode`\^^I=12%
- \gdef\markdownReadAndConvertTab{^^I}%
- \endgroup
+\begingroup
+ \catcode`\^^I=12%
+ \gdef\markdownReadAndConvertTab{^^I}%
+\endgroup
% \end{macrocode}
%
% The \m{markdownReadAndConvert} macro is largely a rewrite of the
% \Hologo{LaTeX2e} \m{filecontents} macro to plain \TeX{}.
% \begin{macrocode}
- \begingroup
+\begingroup
% \end{macrocode}
% Make the newline and tab characters active and swap the character codes of the
% backslash symbol (\t`\textbackslash`) and the pipe symbol (\t`|`), so that
% we can use the backslash as an ordinary character inside the macro definition.
% \begin{macrocode}
- \catcode`\^^M=13%
- \catcode`\^^I=13%
- \catcode`|=0%
- \catcode`\\=12%
- |gdef|markdownReadAndConvert#1#2{%
- |begingroup%
+ \catcode`\^^M=13%
+ \catcode`\^^I=13%
+ \catcode`|=0%
+ \catcode`\\=12%
+ |gdef|markdownReadAndConvert#1#2{%
+ |begingroup%
% \end{macrocode}
% Open the \m{markdownOptionInputTempFileName} file for writing.
% \begin{macrocode}
- |immediate|openout|markdownLuaExecuteFileStream%
- |markdownOptionInputTempFileName%
- |markdownInfo{Buffering markdown input into the temporary %
- input file "|markdownOptionInputTempFileName" and scanning %
- for the closing token sequence "#1"}%
+ |immediate|openout|markdownLuaExecuteFileStream%
+ |markdownOptionInputTempFileName%
+ |markdownInfo{Buffering markdown input into the temporary %
+ input file "|markdownOptionInputTempFileName" and scanning %
+ for the closing token sequence "#1"}%
% \end{macrocode}
% Locally change the category of the special plain \TeX{} characters to
% \emph{other} in order to prevent unwanted interpretation of the input.
-% Change also the category of the space and tab characters, so that we
-% can retrieve them unaltered.
+% Change also the category of the space character, so that we can retrieve it
+% unaltered.
% \begin{macrocode}
- |def|do##1{|catcode`##1=12}|dospecials%
- |catcode`| =12%
- |markdownMakeOther%
+ |def|do##1{|catcode`##1=12}|dospecials%
+ |catcode`| =12%
+ |markdownMakeOther%
% \end{macrocode}
% The \mdef{markdownReadAndConvertProcessLine} macro will process the individual
% lines of output. Note the use of the comments to ensure that the entire macro
% is at a single line and therefore no (active) newline symbols are produced.
% \begin{macrocode}
- |def|markdownReadAndConvertProcessLine##1#1##2#1##3|relax{%
+ |def|markdownReadAndConvertProcessLine##1#1##2#1##3|relax{%
% \end{macrocode}
% When the ending token sequence does not appear in the line, store the line in
% the \m{markdownOptionInputTempFileName} file.
% \begin{macrocode}
- |ifx|relax##3|relax%
- |immediate|write|markdownLuaExecuteFileStream{##1}%
- |else%
+ |ifx|relax##3|relax%
+ |immediate|write|markdownLuaExecuteFileStream{##1}%
+ |else%
% \end{macrocode}
% When the ending token sequence appears in the line, make the next newline
% character close the \m{markdownOptionInputTempFileName} file, return the
@@ -3092,68 +3302,70 @@ return M
% \m{input} the result of the conversion, and expand the ending control
% sequence.
% \begin{macrocode}
- |def^^M{%
- |markdownInfo{The ending token sequence was found}%
- |immediate|write|markdownLuaExecuteFileStream{}%
- |immediate|closeout|markdownLuaExecuteFileStream%
- |endgroup%
- |markdownInput|markdownOptionInputTempFileName%
- #2}%
- |fi%
+ |def^^M{%
+ |markdownInfo{The ending token sequence was found}%
+ |immediate|write|markdownLuaExecuteFileStream{}%
+ |immediate|closeout|markdownLuaExecuteFileStream%
+ |endgroup%
+ |markdownInput|markdownOptionInputTempFileName%
+ #2}%
+ |fi%
% \end{macrocode}
% Repeat with the next line.
% \begin{macrocode}
- ^^M}%
+ ^^M}%
% \end{macrocode}
% Make the tab character active at expansion time and make it expand to a
% literal tab character.
% \begin{macrocode}
- |catcode`|^^I=13%
- |def^^I{|markdownReadAndConvertTab}%
+ |catcode`|^^I=13%
+ |def^^I{|markdownReadAndConvertTab}%
% \end{macrocode}
% Make the newline character active at expansion time and make it consume the
% rest of the line on expansion. Throw away the rest of the first line and
% pass the second line to the \m{markdownReadAndConvertProcessLine} macro.
% \begin{macrocode}
- |catcode`|^^M=13%
- |def^^M##1^^M{%
- |def^^M####1^^M{%
- |markdownReadAndConvertProcessLine####1#1#1|relax}%
- ^^M}%
+ |catcode`|^^M=13%
+ |def^^M##1^^M{%
+ |def^^M####1^^M{%
+ |markdownReadAndConvertProcessLine####1#1#1|relax}%
^^M}%
+ ^^M}%
% \end{macrocode}
% Reset the character categories back to the former state.
% \begin{macrocode}
- |endgroup
+|endgroup
% \end{macrocode}
%
% \subsubsection{Direct Lua Access}\label{sec:directlua}
% The following \TeX{} code is intended for \TeX{} engines that provide
% direct access to Lua (Lua\TeX{}). The \m{markdownLuaExecute} and
% \m{markdownReadAndConvert} defined here and in Section \ref{sec:luabridge}
-% are meant to be transparent to the remaining code.
+% are meant to be transparent to the remaining code. This corresponds to the
+% \m{markdownMode} value of \t`2`.
% \begin{macrocode}
\else
+\markdownInfo{Using mode 2: Direct Lua access}%
% \end{macrocode}
% The direct Lua access version of the \m{markdownLuaExecute} macro is defined
% in terms of the \m{directlua} primitive. The \luam{print} function is set as
% an alias to the \m{tex.print} method in order to mimic the behaviour of the
% \m{markdownLuaExecute} definition from Section \ref{sec:luabridge},
% \begin{macrocode}
- \def\markdownLuaExecute#1{\directlua{local print = tex.print #1}}%
+\def\markdownLuaExecute#1{\directlua{local print = tex.print #1}}%
% \end{macrocode}
%
% In the definition of the direct Lua access version of the
% \m{markdownReadAndConvert} macro, we will be using the hash symbol
-% (\t`\#`), the underscore symbol (\t`_`), the caret symbol (\t`\^`), the
+% (\t`\#`), the underscore symbol (\t`_`), the circumflex symbol (\t`\^`), the
% dollar sign (\t`\$`), the backslash symbol (\t`\textbackslash`), the percent
% sign (\t`\%`), and the braces (\t`\{\}`) as a part of the Lua syntax.
% \begin{macrocode}
- \begingroup
+\begingroup
% \end{macrocode}
%
-% To this end, we will make the underscore symbol, the dollar sign, and caret
-% symbols ordinary characters,
+% To this end, we will make the underscore symbol, the dollar sign, and
+% circumflex symbols ordinary characters,
% \begin{macrocode}
\catcode`\_=12%
\catcode`\$=12%
@@ -3272,7 +3484,9 @@ return M
% existing plain \TeX{} implementation.
% \begin{macrocode}
\input markdown
-\ProvidesPackage{markdown}[\markdownVersion]%
+\def\markdownVersionSpace{ }%
+\ProvidesPackage{markdown}[\markdownLastModified\markdownVersionSpace v%
+ \markdownVersion\markdownVersionSpace markdown renderer]%
% \end{macrocode}
%
% \subsubsection{Logging Facilities}
@@ -3337,7 +3551,8 @@ return M
\RequirePackage{graphicx}
% \end{macrocode}
% If the \m{markdownOptionTightLists} macro expands to \t`false`, do not load
-% the \pkg{paralist} package.
+% the \pkg{paralist} package. This is necessary for \Hologo{LaTeX2e} document
+% classes that do not play nice with \pkg{paralist}, such as \pkg{beamer}.
% \begin{macrocode}
\RequirePackage{ifthen}
\ifx\markdownOptionTightLists\undefined
@@ -3349,15 +3564,23 @@ return M
\RequirePackage{fancyvrb}
\markdownSetup{rendererPrototypes={
lineBreak = {\\},
+ leftBrace = {\textbraceleft},
+ rightBrace = {\textbraceright},
+ dollarSign = {\textdollar},
+ underscore = {\textunderscore},
+ circumflex = {\textasciicircum},
+ backslash = {\textbackslash},
+ tilde = {\textasciitilde},
+ pipe = {\textbar},
codeSpan = {\texttt{#1}},
- link = {#1\footnote{\ifx\empty#3\empty\else#3:
- \fi\texttt<\url{#2}\texttt>}},
+ link = {#1\footnote{\ifx\empty#4\empty\else#4:
+ \fi\texttt<\url{#3}\texttt>}},
image = {\begin{figure}
\begin{center}%
- \includegraphics{#2}%
+ \includegraphics{#3}%
\end{center}%
- \ifx\empty#3\empty\else
- \caption{#3}%
+ \ifx\empty#4\empty\else
+ \caption{#4}%
\fi
\label{fig:#1}%
\end{figure}},
@@ -3382,7 +3605,7 @@ return M
\ifx\alert\undefined
\textbf{\emph{#1}}%
\else % Beamer support
- \alert{\emph{#1}}
+ \alert{\emph{#1}}%
\fi},
blockQuoteBegin = {\begin{quotation}},
blockQuoteEnd = {\end{quotation}},
@@ -3476,19 +3699,17 @@ return M
% If we can not, we are probably using ConTeXt Mark IV. In ConTeXt Mark IV, the
% \t`process_input_buffer` callback is currently frozen (inaccessible from the
% user code) and, due to the lack of available documentation, it is unclear to
-% me how to emulate it. Therefore, we will just force the plain \TeX{}
-% implementation to use the \m{write18} bridge (see Section
-% \ref{sec:luabridge}) by locally undefining the \m{directlua} primitive.
+% me how to emulate it. As a workaround, we will force the plain \TeX{}
+% implementation to use the Lua shell escape bridge (see Section
+% \ref{sec:luabridge}) by setting the \m{markdownMode} macro to the value of
+% \t`1`.
% \begin{macrocode}
if new_callback == false then
- tex.print(unescape([[|let|markdownDirectLua|directlua
- |let|directlua|undefined
- |input markdown
- |let|directlua|markdownDirectLua
- |let|markdownDirectLua|undefined]]))
+ tex.print(unescape([[|def|markdownMode{1}|input markdown]]))
% \end{macrocode}
%
-% If we can, then just load the plain \TeX{} implementation.
+% If we can set the \t`process_input_buffer` Lua\TeX{} callback, then just load
+% the plain \TeX{} implementation.
% \begin{macrocode}
else
callback.register("process_input_buffer", old_callback)
@@ -3497,6 +3718,16 @@ return M
\fi
% \end{macrocode}
%
+% If the shell escape bridge is being used, define the \m{markdownMakeOther}
+% macro, so that the pipe character (\t`|`) is inactive during the scanning.
+% This is necessary, since the character is active in \Hologo{ConTeXt}.
+% \begin{macrocode}
+\ifnum\markdownMode<2
+ \def\markdownMakeOther{%
+ \catcode`|=12}%
+\fi
+% \end{macrocode}
+%
% \subsubsection{Logging Facilities}
% The \Hologo{ConTeXt} implementation redefines the plain \TeX{} logging macros (see
% Section \ref{sec:texinterfacelogging}) to use the \Hologo{ConTeXt}
@@ -3529,11 +3760,20 @@ return M
% The following configuration should be considered placeholder.
% \begin{macrocode}
\def\markdownRendererLineBreakPrototype{\blank}%
-\long\def\markdownRendererLinkPrototype#1#2#3{%
- \useURL[#1][#2][][#3]#1\footnote[#1]{\ifx\empty#3\empty\else#3:
- \fi\tt<\hyphenatedurl{#2}>}}%
-\long\def\markdownRendererImagePrototype#1#2#3{%
- \placefigure[][fig:#1]{#3}{\externalfigure[#2]}}%
+\def\markdownRendererLeftBracePrototype{\textbraceleft}%
+\def\markdownRendererRightBracePrototype{\textbraceright}%
+\def\markdownRendererDollarSignPrototype{\textdollar}%
+\def\markdownRendererPercentSignPrototype{\percent}%
+\def\markdownRendererUnderscorePrototype{\textunderscore}%
+\def\markdownRendererCircumflexPrototype{\textcircumflex}%
+\def\markdownRendererBackslashPrototype{\textbackslash}%
+\def\markdownRendererTildePrototype{\textasciitilde}%
+\def\markdownRendererPipePrototype{\char`|}%
+\long\def\markdownRendererLinkPrototype#1#2#3#4{%
+ \useURL[#1][#3][][#4]#1\footnote[#1]{\ifx\empty#4\empty\else#4:
+ \fi\tt<\hyphenatedurl{#3}>}}%
+\long\def\markdownRendererImagePrototype#1#2#3#4{%
+ \placefigure[][fig:#1]{#4}{\externalfigure[#3]}}%
\def\markdownRendererUlBeginPrototype{\startitemize}%
\def\markdownRendererUlBeginTightPrototype{\startitemize[packed]}%
\def\markdownRendererUlItemPrototype{\item}%
@@ -3562,7 +3802,7 @@ return M
\startMarkdownConTeXtDlPrototype}%
\def\markdownRendererDlBeginTightPrototype{%
\startMarkdownConTeXtDlTightPrototype}%
-\long\long\def\markdownRendererDlItemPrototype#1{%
+\long\def\markdownRendererDlItemPrototype#1{%
\markdownConTeXtDlItemPrototype{#1}}%
\def\markdownRendererDlEndPrototype{%
\stopMarkdownConTeXtDlPrototype}%
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 115836433e6..bad0124577b 100644
--- a/Master/texmf-dist/tex/context/third/markdown/t-markdown.tex
+++ b/Master/texmf-dist/tex/context/third/markdown/t-markdown.tex
@@ -61,16 +61,16 @@
callback.register("process_input_buffer", function() end)
local new_callback = callback.find("process_input_buffer")
if new_callback == false then
- tex.print(unescape([[|let|markdownDirectLua|directlua
- |let|directlua|undefined
- |input markdown
- |let|directlua|markdownDirectLua
- |let|markdownDirectLua|undefined]]))
+ tex.print(unescape([[|def|markdownMode{1}|input markdown]]))
else
callback.register("process_input_buffer", old_callback)
tex.print(unescape("|input markdown"))
end}%
\fi
+\ifnum\markdownMode<2
+ \def\markdownMakeOther{%
+ \catcode`|=12}%
+\fi
\def\markdownInfo#1{\writestatus{markdown}{#1.}}%
\def\markdownWarning#1{\writestatus{markdown\space warn}{#1.}}%
\begingroup
@@ -81,11 +81,20 @@
{|stopmarkdown}}%
|endgroup
\def\markdownRendererLineBreakPrototype{\blank}%
-\long\def\markdownRendererLinkPrototype#1#2#3{%
- \useURL[#1][#2][][#3]#1\footnote[#1]{\ifx\empty#3\empty\else#3:
- \fi\tt<\hyphenatedurl{#2}>}}%
-\long\def\markdownRendererImagePrototype#1#2#3{%
- \placefigure[][fig:#1]{#3}{\externalfigure[#2]}}%
+\def\markdownRendererLeftBracePrototype{\textbraceleft}%
+\def\markdownRendererRightBracePrototype{\textbraceright}%
+\def\markdownRendererDollarSignPrototype{\textdollar}%
+\def\markdownRendererPercentSignPrototype{\percent}%
+\def\markdownRendererUnderscorePrototype{\textunderscore}%
+\def\markdownRendererCircumflexPrototype{\textcircumflex}%
+\def\markdownRendererBackslashPrototype{\textbackslash}%
+\def\markdownRendererTildePrototype{\textasciitilde}%
+\def\markdownRendererPipePrototype{\char`|}%
+\long\def\markdownRendererLinkPrototype#1#2#3#4{%
+ \useURL[#1][#3][][#4]#1\footnote[#1]{\ifx\empty#4\empty\else#4:
+ \fi\tt<\hyphenatedurl{#3}>}}%
+\long\def\markdownRendererImagePrototype#1#2#3#4{%
+ \placefigure[][fig:#1]{#4}{\externalfigure[#3]}}%
\def\markdownRendererUlBeginPrototype{\startitemize}%
\def\markdownRendererUlBeginTightPrototype{\startitemize[packed]}%
\def\markdownRendererUlItemPrototype{\item}%
@@ -114,7 +123,7 @@
\startMarkdownConTeXtDlPrototype}%
\def\markdownRendererDlBeginTightPrototype{%
\startMarkdownConTeXtDlTightPrototype}%
-\long\long\def\markdownRendererDlItemPrototype#1{%
+\long\def\markdownRendererDlItemPrototype#1{%
\markdownConTeXtDlItemPrototype{#1}}%
\def\markdownRendererDlEndPrototype{%
\stopMarkdownConTeXtDlPrototype}%
diff --git a/Master/texmf-dist/tex/generic/markdown/markdown.tex b/Master/texmf-dist/tex/generic/markdown/markdown.tex
index 1a90792aacf..247290d0b3b 100644
--- a/Master/texmf-dist/tex/generic/markdown/markdown.tex
+++ b/Master/texmf-dist/tex/generic/markdown/markdown.tex
@@ -45,7 +45,8 @@
%%
%% The names of the source files used are shown above.
%%
-\def\markdownVersion{2016/06/03}%
+\def\markdownLastModified{2016/08/14}%
+\def\markdownVersion{1.0.2}%
\let\markdownBegin\relax
\let\markdownEnd\relax
\let\markdownInput\relax
@@ -56,7 +57,7 @@
\let\markdownOptionBlankBeforeBlockquote\undefined
\let\markdownOptionBlankBeforeHeading\undefined
\let\markdownOptionDefinitionLists\undefined
-\let\markdownOptionHashEnumerator\undefined
+\let\markdownOptionHashEnumerators\undefined
\let\markdownOptionHybrid\undefined
\let\markdownOptionFootnotes\undefined
\let\markdownOptionPreserveTabs\undefined
@@ -67,6 +68,28 @@
\markdownRendererLineBreakPrototype}%
\def\markdownRendererEllipsis{%
\markdownRendererEllipsisPrototype}%
+\def\markdownRendererLeftBrace{%
+ \markdownRendererLeftBracePrototype}%
+\def\markdownRendererRightBrace{%
+ \markdownRendererRightBracePrototype}%
+\def\markdownRendererDollarSign{%
+ \markdownRendererDollarSignPrototype}%
+\def\markdownRendererPercentSign{%
+ \markdownRendererPercentSignPrototype}%
+\def\markdownRendererAmpersand{%
+ \markdownRendererAmpersandPrototype}%
+\def\markdownRendererUnderscore{%
+ \markdownRendererUnderscorePrototype}%
+\def\markdownRendererHash{%
+ \markdownRendererHashPrototype}%
+\def\markdownRendererCircumflex{%
+ \markdownRendererCircumflexPrototype}%
+\def\markdownRendererBackslash{%
+ \markdownRendererBackslashPrototype}%
+\def\markdownRendererTilde{%
+ \markdownRendererTildePrototype}%
+\def\markdownRendererPipe{%
+ \markdownRendererPipePrototype}%
\def\markdownRendererCodeSpan{%
\markdownRendererCodeSpanPrototype}%
\def\markdownRendererLink{%
@@ -101,6 +124,10 @@
\markdownRendererDlBeginTightPrototype}%
\def\markdownRendererDlItem{%
\markdownRendererDlItemPrototype}%
+\def\markdownRendererDlDefinitionBegin{%
+ \markdownRendererDlDefinitionBeginPrototype}%
+\def\markdownRendererDlDefinitionEnd{%
+ \markdownRendererDlDefinitionEndPrototype}%
\def\markdownRendererDlEnd{%
\markdownRendererDlEndPrototype}%
\def\markdownRendererDlEndTight{%
@@ -133,9 +160,20 @@
\markdownRendererFootnotePrototype}%
\def\markdownRendererLineBreakPrototype{}%
\def\markdownRendererEllipsisPrototype{}%
+\def\markdownRendererLeftBracePrototype{}%
+\def\markdownRendererRightBracePrototype{}%
+\def\markdownRendererDollarSignPrototype{}%
+\def\markdownRendererPercentSignPrototype{}%
+\def\markdownRendererAmpersandPrototype{}%
+\def\markdownRendererUnderscorePrototype{}%
+\def\markdownRendererHashPrototype{}%
+\def\markdownRendererCircumflexPrototype{}%
+\def\markdownRendererBackslashPrototype{}%
+\def\markdownRendererTildePrototype{}%
+\def\markdownRendererPipePrototype{}%
\long\def\markdownRendererCodeSpanPrototype#1{}%
-\long\def\markdownRendererLinkPrototype#1#2#3{}%
-\long\def\markdownRendererImagePrototype#1#2#3{}%
+\long\def\markdownRendererLinkPrototype#1#2#3#4{}%
+\long\def\markdownRendererImagePrototype#1#2#3#4{}%
\def\markdownRendererUlBeginPrototype{}%
\def\markdownRendererUlBeginTightPrototype{}%
\def\markdownRendererUlItemPrototype{}%
@@ -150,6 +188,8 @@
\def\markdownRendererDlBeginPrototype{}%
\def\markdownRendererDlBeginTightPrototype{}%
\long\def\markdownRendererDlItemPrototype#1{}%
+\def\markdownRendererDlDefinitionBeginPrototype{}%
+\def\markdownRendererDlDefinitionEndPrototype{}%
\def\markdownRendererDlEndPrototype{}%
\def\markdownRendererDlEndTightPrototype{}%
\long\def\markdownRendererEmphasisPrototype#1{}%
@@ -181,6 +221,13 @@
|markdownReadAndConvert{\markdownEnd}%
{|markdownEnd}}%
|endgroup
+\ifx\markdownMode\undefined
+ \ifx\directlua\undefined
+ \def\markdownMode{0}%
+ \else
+ \def\markdownMode{2}%
+ \fi
+\fi
\def\markdownInfo#1{%
\message{(l.\the\inputlineno) markdown.tex info: #1.}}%
\def\markdownWarning#1{%
@@ -190,9 +237,20 @@
\errmessage{(l.\the\inputlineno) markdown.tex error: #1}}%
\def\markdownRendererLineBreakPrototype{\hfil\break}%
\let\markdownRendererEllipsisPrototype\dots
+\def\markdownRendererLeftBracePrototype{\char`{}%
+\def\markdownRendererRightBracePrototype{\char`}}%
+\def\markdownRendererDollarSignPrototype{\char`$}%
+\def\markdownRendererPercentSignPrototype{\char`\%}%
+\def\markdownRendererAmpersandPrototype{\char`&}%
+\def\markdownRendererUnderscorePrototype{\char`_}%
+\def\markdownRendererHashPrototype{\char`\#}%
+\def\markdownRendererCircumflexPrototype{\char`^}%
+\def\markdownRendererBackslashPrototype{\char`\\}%
+\def\markdownRendererTildePrototype{\char`~}%
+\def\markdownRendererPipePrototype{|}%
\long\def\markdownRendererCodeSpanPrototype#1{{\tt#1}}%
-\long\def\markdownRendererLinkPrototype#1#2#3{#1}%
-\long\def\markdownRendererImagePrototype#1#2#3{#1}%
+\long\def\markdownRendererLinkPrototype#1#2#3#4{#2}%
+\long\def\markdownRendererImagePrototype#1#2#3#4{#2}%
\def\markdownRendererUlBeginPrototype{}%
\def\markdownRendererUlBeginTightPrototype{}%
\def\markdownRendererUlItemPrototype{}%
@@ -207,6 +265,8 @@
\def\markdownRendererDlBeginPrototype{}%
\def\markdownRendererDlBeginTightPrototype{}%
\long\def\markdownRendererDlItemPrototype#1{#1}%
+\def\markdownRendererDlDefinitionBeginPrototype{}%
+\def\markdownRendererDlDefinitionEndPrototype{\par}%
\def\markdownRendererDlEndPrototype{}%
\def\markdownRendererDlEndTightPrototype{}%
\long\def\markdownRendererEmphasisPrototype#1{{\it#1}}%
@@ -214,7 +274,7 @@
\def\markdownRendererBlockQuoteBeginPrototype{\par\begingroup\it}%
\def\markdownRendererBlockQuoteEndPrototype{\endgroup\par}%
\long\def\markdownRendererInputVerbatimPrototype#1{%
- \par{\tt\input"#1"\relax}\par}%
+\par{\tt\input"#1"\relax}\par}%
\long\def\markdownRendererHeadingOnePrototype#1{#1}%
\long\def\markdownRendererHeadingTwoPrototype#1{#1}%
\long\def\markdownRendererHeadingThreePrototype#1{#1}%
@@ -224,126 +284,145 @@
\def\markdownRendererHorizontalRulePrototype{}%
\long\def\markdownRendererFootnotePrototype#1{#1}%
\def\markdownLuaOptions{{%
- \ifx\markdownOptionBlankBeforeBlockquote\undefined\else
- blankBeforeBlockquote = \markdownOptionBlankBeforeBlockquote,
- \fi
- \ifx\markdownOptionBlankBeforeHeading\undefined\else
- blankBeforeHeading = \markdownOptionBlankBeforeHeading,
- \fi
- \ifx\markdownOptionCacheDir\undefined\else
- cacheDir = "\markdownOptionCacheDir",
- \fi
- \ifx\markdownOptionDefinitionLists\undefined\else
- definitionLists = \markdownOptionDefinitionLists,
- \fi
- \ifx\markdownOptionHashEnumerators\undefined\else
- hashEnumerators = \markdownOptionHashEnumerators,
- \fi
- \ifx\markdownOptionHybrid\undefined\else
- hybrid = \markdownOptionHybrid,
- \fi
- \ifx\markdownOptionFootnotes\undefined\else
- footnotes = \markdownOptionFootnotes,
- \fi
- \ifx\markdownOptionPreserveTabs\undefined\else
- preserveTabs = \markdownOptionPreserveTabs,
- \fi
- \ifx\markdownOptionSmartEllipses\undefined\else
- smartEllipses = \markdownOptionSmartEllipses,
- \fi
- \ifx\markdownOptionStartNumber\undefined\else
- startNumber = \markdownOptionStartNumber,
- \fi
- \ifx\markdownOptionTightLists\undefined\else
- tightLists = \markdownOptionTightLists,
- \fi}
+\ifx\markdownOptionBlankBeforeBlockquote\undefined\else
+ blankBeforeBlockquote = \markdownOptionBlankBeforeBlockquote,
+\fi
+\ifx\markdownOptionBlankBeforeHeading\undefined\else
+ blankBeforeHeading = \markdownOptionBlankBeforeHeading,
+\fi
+\ifx\markdownOptionCacheDir\undefined\else
+ cacheDir = "\markdownOptionCacheDir",
+\fi
+\ifx\markdownOptionDefinitionLists\undefined\else
+ definitionLists = \markdownOptionDefinitionLists,
+\fi
+\ifx\markdownOptionHashEnumerators\undefined\else
+ hashEnumerators = \markdownOptionHashEnumerators,
+\fi
+\ifx\markdownOptionHybrid\undefined\else
+ hybrid = \markdownOptionHybrid,
+\fi
+\ifx\markdownOptionFootnotes\undefined\else
+ footnotes = \markdownOptionFootnotes,
+\fi
+\ifx\markdownOptionPreserveTabs\undefined\else
+ preserveTabs = \markdownOptionPreserveTabs,
+\fi
+\ifx\markdownOptionSmartEllipses\undefined\else
+ smartEllipses = \markdownOptionSmartEllipses,
+\fi
+\ifx\markdownOptionStartNumber\undefined\else
+ startNumber = \markdownOptionStartNumber,
+\fi
+\ifx\markdownOptionTightLists\undefined\else
+ tightLists = \markdownOptionTightLists,
+\fi}
}%
\def\markdownPrepare{%
- local lfs = require("lfs")
- local cacheDir = "\markdownOptionCacheDir"
- if lfs.isdir(cacheDir) == true then else
- assert(lfs.mkdir(cacheDir))
- end
- local md = require("markdown")
- local convert = md.new(\markdownLuaOptions)
+local lfs = require("lfs")
+local cacheDir = "\markdownOptionCacheDir"
+if lfs.isdir(cacheDir) == true then else
+ assert(lfs.mkdir(cacheDir))
+end
+local md = require("markdown")
+local convert = md.new(\markdownLuaOptions)
}%
-\ifx\directlua\undefined
- \csname newwrite\endcsname\markdownLuaExecuteFileStream
- \csname newcount\endcsname\markdownLuaExecuteShellEscape
+
+\ifnum\markdownMode<2\relax
+\ifnum\markdownMode=0\relax
+ \markdownInfo{Using mode 0: Shell escape via write18}%
+\else
+ \markdownInfo{Using mode 1: Shell escape via os.execute}%
+\fi
+\csname newwrite\endcsname\markdownLuaExecuteFileStream
+\ifnum\markdownMode=0\relax
\ifx\pdfshellescape\undefined
\ifx\shellescape\undefined
- \markdownLuaExecuteShellEscape=1%
+ \def\markdownExecuteShellEscape{1}%
\else
- \markdownLuaExecuteShellEscape=\shellescape
+ \let\markdownExecuteShellEscape\shellescape
\fi
\else
- \markdownLuaExecuteShellEscape=\pdfshellescape
+ \let\markdownExecuteShellEscape\pdfshellescape
\fi
- \def\markdownLuaExecute#1{%
- \ifnum\markdownLuaExecuteShellEscape=1%
- \immediate\openout\markdownLuaExecuteFileStream=%
- \markdownOptionHelperScriptFileName
- \markdownInfo{Writing a helper Lua script to the file
- "\markdownOptionHelperScriptFileName"}%
- \immediate\write\markdownLuaExecuteFileStream{%
- local kpse = require('kpse')
- kpse.set_program_name('luatex') #1}%
- \immediate\closeout\markdownLuaExecuteFileStream
- \markdownInfo{Executing a helper Lua script from the file
- "\markdownOptionHelperScriptFileName" and storing the result in the
- file "\markdownOptionOutputTempFileName"}%
- \immediate\write18{texlua "\markdownOptionHelperScriptFileName" >
- "\markdownOptionOutputTempFileName"}%
- \input\markdownOptionOutputTempFileName\relax
- \else
- \markdownError{I can not access the shell}{Either run the TeX
- compiler with the --shell-escape or the --enable-write18 flag,
- or set shell_escape=t in the texmf.cnf file}%
- \fi}%
- \begingroup
- \catcode`\^^I=12%
- \gdef\markdownReadAndConvertTab{^^I}%
- \endgroup
- \begingroup
- \catcode`\^^M=13%
- \catcode`\^^I=13%
- \catcode`|=0%
- \catcode`\\=12%
- |gdef|markdownReadAndConvert#1#2{%
- |begingroup%
- |immediate|openout|markdownLuaExecuteFileStream%
- |markdownOptionInputTempFileName%
- |markdownInfo{Buffering markdown input into the temporary %
- input file "|markdownOptionInputTempFileName" and scanning %
- for the closing token sequence "#1"}%
- |def|do##1{|catcode`##1=12}|dospecials%
- |catcode`| =12%
- |markdownMakeOther%
- |def|markdownReadAndConvertProcessLine##1#1##2#1##3|relax{%
- |ifx|relax##3|relax%
- |immediate|write|markdownLuaExecuteFileStream{##1}%
- |else%
- |def^^M{%
- |markdownInfo{The ending token sequence was found}%
- |immediate|write|markdownLuaExecuteFileStream{}%
- |immediate|closeout|markdownLuaExecuteFileStream%
- |endgroup%
- |markdownInput|markdownOptionInputTempFileName%
- #2}%
- |fi%
- ^^M}%
- |catcode`|^^I=13%
- |def^^I{|markdownReadAndConvertTab}%
- |catcode`|^^M=13%
- |def^^M##1^^M{%
- |def^^M####1^^M{%
- |markdownReadAndConvertProcessLine####1#1#1|relax}%
- ^^M}%
+\else
+ \def\markdownExecuteShellEscape{%
+ \directlua{tex.sprint(status.shell_escape)}}%
+\fi
+\ifnum\markdownMode=0\relax
+ \def\markdownExecuteDirect#1{\immediate\write18{#1}}%
+\else
+ \def\markdownExecuteDirect#1{%
+ \directlua{os.execute("\luaescapestring{#1}")}}%
+\fi
+\def\markdownExecute#1{%
+ \ifnum\markdownExecuteShellEscape=1\relax
+ \markdownExecuteDirect{#1}%
+ \else
+ \markdownError{I can not access the shell}{Either run the TeX
+ compiler with the --shell-escape or the --enable-write18 flag,
+ or set shell_escape=t in the texmf.cnf file}%
+ \fi}%
+\def\markdownLuaExecute#1{%
+ \immediate\openout\markdownLuaExecuteFileStream=%
+ \markdownOptionHelperScriptFileName
+ \markdownInfo{Writing a helper Lua script to the file
+ "\markdownOptionHelperScriptFileName"}%
+ \immediate\write\markdownLuaExecuteFileStream{%
+ local kpse = require('kpse')
+ kpse.set_program_name('luatex') #1}%
+ \immediate\closeout\markdownLuaExecuteFileStream
+ \markdownInfo{Executing a helper Lua script from the file
+ "\markdownOptionHelperScriptFileName" and storing the result in the
+ file "\markdownOptionOutputTempFileName"}%
+ \markdownExecute{texlua "\markdownOptionHelperScriptFileName" >
+ "\markdownOptionOutputTempFileName"}%
+ \input\markdownOptionOutputTempFileName\relax}%
+\begingroup
+ \catcode`\^^I=12%
+ \gdef\markdownReadAndConvertTab{^^I}%
+\endgroup
+\begingroup
+ \catcode`\^^M=13%
+ \catcode`\^^I=13%
+ \catcode`|=0%
+ \catcode`\\=12%
+ |gdef|markdownReadAndConvert#1#2{%
+ |begingroup%
+ |immediate|openout|markdownLuaExecuteFileStream%
+ |markdownOptionInputTempFileName%
+ |markdownInfo{Buffering markdown input into the temporary %
+ input file "|markdownOptionInputTempFileName" and scanning %
+ for the closing token sequence "#1"}%
+ |def|do##1{|catcode`##1=12}|dospecials%
+ |catcode`| =12%
+ |markdownMakeOther%
+ |def|markdownReadAndConvertProcessLine##1#1##2#1##3|relax{%
+ |ifx|relax##3|relax%
+ |immediate|write|markdownLuaExecuteFileStream{##1}%
+ |else%
+ |def^^M{%
+ |markdownInfo{The ending token sequence was found}%
+ |immediate|write|markdownLuaExecuteFileStream{}%
+ |immediate|closeout|markdownLuaExecuteFileStream%
+ |endgroup%
+ |markdownInput|markdownOptionInputTempFileName%
+ #2}%
+ |fi%
^^M}%
- |endgroup
+ |catcode`|^^I=13%
+ |def^^I{|markdownReadAndConvertTab}%
+ |catcode`|^^M=13%
+ |def^^M##1^^M{%
+ |def^^M####1^^M{%
+ |markdownReadAndConvertProcessLine####1#1#1|relax}%
+ ^^M}%
+ ^^M}%
+|endgroup
\else
- \def\markdownLuaExecute#1{\directlua{local print = tex.print #1}}%
- \begingroup
+\markdownInfo{Using mode 2: Direct Lua access}%
+\def\markdownLuaExecute#1{\directlua{local print = tex.print #1}}%
+\begingroup
\catcode`\_=12%
\catcode`\$=12%
\catcode`\^=12%
diff --git a/Master/texmf-dist/tex/latex/markdown/markdown.sty b/Master/texmf-dist/tex/latex/markdown/markdown.sty
index c568c8212b5..08dc59ef1e8 100644
--- a/Master/texmf-dist/tex/latex/markdown/markdown.sty
+++ b/Master/texmf-dist/tex/latex/markdown/markdown.sty
@@ -85,12 +85,34 @@
\renewcommand\markdownRendererLineBreak{#1}}%
\define@key{markdownRenderers}{ellipsis}{%
\renewcommand\markdownRendererEllipsis{#1}}%
+\define@key{markdownRenderers}{leftBrace}{%
+ \renewcommand\markdownRendererLeftBrace{#1}}%
+\define@key{markdownRenderers}{rightBrace}{%
+ \renewcommand\markdownRendererRightBrace{#1}}%
+\define@key{markdownRenderers}{dollarSign}{%
+ \renewcommand\markdownRendererDollarSign{#1}}%
+\define@key{markdownRenderers}{percentSign}{%
+ \renewcommand\markdownRendererPercentSign{#1}}%
+\define@key{markdownRenderers}{ampersand}{%
+ \renewcommand\markdownRendererAmpersand{#1}}%
+\define@key{markdownRenderers}{underscore}{%
+ \renewcommand\markdownRendererUnderscore{#1}}%
+\define@key{markdownRenderers}{hash}{%
+ \renewcommand\markdownRendererHash{#1}}%
+\define@key{markdownRenderers}{circumflex}{%
+ \renewcommand\markdownRendererCircumflex{#1}}%
+\define@key{markdownRenderers}{backslash}{%
+ \renewcommand\markdownRendererBackslash{#1}}%
+\define@key{markdownRenderers}{tilde}{%
+ \renewcommand\markdownRendererTilde{#1}}%
+\define@key{markdownRenderers}{pipe}{%
+ \renewcommand\markdownRendererPipe{#1}}%
\define@key{markdownRenderers}{codeSpan}{%
\renewcommand\markdownRendererCodeSpan[1]{#1}}%
\define@key{markdownRenderers}{link}{%
- \renewcommand\markdownRendererLink[3]{#1}}%
+ \renewcommand\markdownRendererLink[4]{#1}}%
\define@key{markdownRenderers}{image}{%
- \renewcommand\markdownRendererImage[3]{#1}}%
+ \renewcommand\markdownRendererImage[4]{#1}}%
\define@key{markdownRenderers}{ulBegin}{%
\renewcommand\markdownRendererUlBegin{#1}}%
\define@key{markdownRenderers}{ulBeginTight}{%
@@ -119,6 +141,10 @@
\renewcommand\markdownRendererDlBeginTight{#1}}%
\define@key{markdownRenderers}{dlItem}{%
\renewcommand\markdownRendererDlItem[1]{#1}}%
+\define@key{markdownRenderers}{dlDefinitionBegin}{%
+ \renewcommand\markdownRendererDlDefinitionBegin{#1}}%
+\define@key{markdownRenderers}{dlDefinitionEnd}{%
+ \renewcommand\markdownRendererDlDefinitionEnd{#1}}%
\define@key{markdownRenderers}{dlEnd}{%
\renewcommand\markdownRendererDlEnd{#1}}%
\define@key{markdownRenderers}{dlEndTight}{%
@@ -155,12 +181,34 @@
\renewcommand\markdownRendererLineBreakPrototype{#1}}%
\define@key{markdownRendererPrototypes}{ellipsis}{%
\renewcommand\markdownRendererEllipsisPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{leftBrace}{%
+ \renewcommand\markdownRendererLeftBracePrototype{#1}}%
+\define@key{markdownRendererPrototypes}{rightBrace}{%
+ \renewcommand\markdownRendererRightBracePrototype{#1}}%
+\define@key{markdownRendererPrototypes}{dollarSign}{%
+ \renewcommand\markdownRendererDollarSignPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{percentSign}{%
+ \renewcommand\markdownRendererPercentSignPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{ampersand}{%
+ \renewcommand\markdownRendererAmpersandPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{underscore}{%
+ \renewcommand\markdownRendererUnderscorePrototype{#1}}%
+\define@key{markdownRendererPrototypes}{hash}{%
+ \renewcommand\markdownRendererHashPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{circumflex}{%
+ \renewcommand\markdownRendererCircumflexPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{backslash}{%
+ \renewcommand\markdownRendererBackslashPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{tilde}{%
+ \renewcommand\markdownRendererTildePrototype{#1}}%
+\define@key{markdownRendererPrototypes}{pipe}{%
+ \renewcommand\markdownRendererPipe{#1}}%
\define@key{markdownRendererPrototypes}{codeSpan}{%
\renewcommand\markdownRendererCodeSpanPrototype[1]{#1}}%
\define@key{markdownRendererPrototypes}{link}{%
- \renewcommand\markdownRendererLink[3]{#1}}%
+ \renewcommand\markdownRendererLink[4]{#1}}%
\define@key{markdownRendererPrototypes}{image}{%
- \renewcommand\markdownRendererImage[3]{#1}}%
+ \renewcommand\markdownRendererImage[4]{#1}}%
\define@key{markdownRendererPrototypes}{ulBegin}{%
\renewcommand\markdownRendererUlBeginPrototype{#1}}%
\define@key{markdownRendererPrototypes}{ulBeginTight}{%
@@ -189,6 +237,10 @@
\renewcommand\markdownRendererDlBeginTightPrototype{#1}}%
\define@key{markdownRendererPrototypes}{dlItem}{%
\renewcommand\markdownRendererDlItemPrototype[1]{#1}}%
+\define@key{markdownRendererPrototypes}{dlDefinitionBegin}{%
+ \renewcommand\markdownRendererDlDefinitionBeginPrototype{#1}}%
+\define@key{markdownRendererPrototypes}{dlDefinitionEnd}{%
+ \renewcommand\markdownRendererDlDefinitionEndPrototype{#1}}%
\define@key{markdownRendererPrototypes}{dlEnd}{%
\renewcommand\markdownRendererDlEndPrototype{#1}}%
\define@key{markdownRendererPrototypes}{dlEndTight}{%
@@ -220,7 +272,9 @@
\define@key{markdownRendererPrototypes}{footnote}{%
\renewcommand\markdownRendererFootnotePrototype[1]{#1}}%
\input markdown
-\ProvidesPackage{markdown}[\markdownVersion]%
+\def\markdownVersionSpace{ }%
+\ProvidesPackage{markdown}[\markdownLastModified\markdownVersionSpace v%
+ \markdownVersion\markdownVersionSpace markdown renderer]%
\renewcommand\markdownInfo[1]{\PackageInfo{markdown}{#1}}%
\renewcommand\markdownWarning[1]{\PackageWarning{markdown}{#1}}%
\renewcommand\markdownError[2]{\PackageError{markdown}{#1}{#2.}}%
@@ -257,15 +311,23 @@
\RequirePackage{fancyvrb}
\markdownSetup{rendererPrototypes={
lineBreak = {\\},
+ leftBrace = {\textbraceleft},
+ rightBrace = {\textbraceright},
+ dollarSign = {\textdollar},
+ underscore = {\textunderscore},
+ circumflex = {\textasciicircum},
+ backslash = {\textbackslash},
+ tilde = {\textasciitilde},
+ pipe = {\textbar},
codeSpan = {\texttt{#1}},
- link = {#1\footnote{\ifx\empty#3\empty\else#3:
- \fi\texttt<\url{#2}\texttt>}},
+ link = {#1\footnote{\ifx\empty#4\empty\else#4:
+ \fi\texttt<\url{#3}\texttt>}},
image = {\begin{figure}
\begin{center}%
- \includegraphics{#2}%
+ \includegraphics{#3}%
\end{center}%
- \ifx\empty#3\empty\else
- \caption{#3}%
+ \ifx\empty#4\empty\else
+ \caption{#4}%
\fi
\label{fig:#1}%
\end{figure}},
@@ -290,7 +352,7 @@
\ifx\alert\undefined
\textbf{\emph{#1}}%
\else % Beamer support
- \alert{\emph{#1}}
+ \alert{\emph{#1}}%
\fi},
blockQuoteBegin = {\begin{quotation}},
blockQuoteEnd = {\end{quotation}},
diff --git a/Master/texmf-dist/tex/luatex/markdown/markdown.lua b/Master/texmf-dist/tex/luatex/markdown/markdown.lua
index e740d18c92e..8a0f237c1d7 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.
--
if not modules then modules = { } end modules ['markdown'] = {
- version = "1.0.1",
+ version = "1.0.2",
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; 2016 Vít Novotný",
@@ -68,7 +68,6 @@ local lpeg = require("lpeg")
local unicode = require("unicode")
local md5 = require("md5")
local M = {}
-M.new = {}
local defaultOptions = {}
defaultOptions.blankBeforeBlockquote = false
defaultOptions.blankBeforeHeading = false
@@ -238,23 +237,34 @@ function M.writer.new(options)
self.linebreak = "\\markdownRendererLineBreak "
self.ellipsis = "\\markdownRendererEllipsis{}"
self.hrule = "\\markdownRendererHorizontalRule "
- local escaped = {
- ["{"] = "\\{",
- ["}"] = "\\}",
- ["$"] = "\\$",
- ["%"] = "\\%",
- ["&"] = "\\&",
- ["_"] = "\\_",
- ["#"] = "\\#",
- ["^"] = "\\^{}",
- ["\\"] = "\\char92{}",
- ["~"] = "\\char126{}",
- ["|"] = "\\char124{}", }
- local escape = util.escaper(escaped)
+ local escaped_chars = {
+ ["{"] = "\\markdownRendererLeftBrace{}",
+ ["}"] = "\\markdownRendererRightBrace{}",
+ ["$"] = "\\markdownRendererDollarSign{}",
+ ["%"] = "\\markdownRendererPercentSign{}",
+ ["&"] = "\\markdownRendererAmpersand{}",
+ ["_"] = "\\markdownRendererUnderscore{}",
+ ["#"] = "\\markdownRendererHash{}",
+ ["^"] = "\\markdownRendererCircumflex{}",
+ ["\\"] = "\\markdownRendererBackslash{}",
+ ["~"] = "\\markdownRendererTilde{}",
+ ["|"] = "\\markdownRendererPipe{}", }
+ local escaped_minimal_chars = {
+ ["{"] = "\\markdownRendererLeftBrace{}",
+ ["}"] = "\\markdownRendererRightBrace{}",
+ ["%"] = "\\markdownRendererPercentSign{}",
+ ["\\"] = "\\markdownRendererBackslash{}", }
+ local escaped_minimal_strings = {
+ ["^^"] = "\\markdownRendererCircumflex\\markdownRendererCircumflex ", }
+ local escape = util.escaper(escaped_chars)
+ local escape_minimal = util.escaper(escaped_minimal_chars,
+ escaped_minimal_strings)
if options.hybrid then
self.string = function(s) return s end
+ self.uri = function(u) return u end
else
self.string = escape
+ self.uri = escape_minimal
end
function self.code(s)
return {"\\markdownRendererCodeSpan{",escape(s),"}"}
@@ -262,12 +272,14 @@ function M.writer.new(options)
function self.link(lab,src,tit)
return {"\\markdownRendererLink{",lab,"}",
"{",self.string(src),"}",
- "{",self.string(tit),"}"}
+ "{",self.uri(src),"}",
+ "{",self.string(tit or ""),"}"}
end
function self.image(lab,src,tit)
return {"\\markdownRendererImage{",lab,"}",
"{",self.string(src),"}",
- "{",self.string(tit),"}"}
+ "{",self.uri(src),"}",
+ "{",self.string(tit or ""),"}"}
end
local function ulitem(s)
return {"\\markdownRendererUlItem ",s}
@@ -313,15 +325,19 @@ function M.writer.new(options)
"\n\\markdownRendererOlEnd "}
end
end
- local function dlitem(term,defs)
- return {"\\markdownRendererDlItem{",term,"}\n",defs}
+ local function dlitem(term, defs)
+ local retVal = {"\\markdownRendererDlItem{",term,"}"}
+ for _, def in ipairs(defs) do
+ retVal[#retVal+1] = {"\\markdownRendererDlDefinitionBegin ",def,
+ "\\markdownRendererDlDefinitionEnd "}
+ end
+ return retVal
end
function self.definitionlist(items,tight)
local buffer = {}
for _,item in ipairs(items) do
- buffer[#buffer + 1] = dlitem(item.term,
- util.intersperse(item.definitions, self.interblocksep))
+ buffer[#buffer + 1] = dlitem(item.term, item.definitions)
end
local contents = util.intersperse(buffer, self.containersep)
if tight and options.tightLists then
@@ -467,7 +483,7 @@ function M.reader.new(writer, options)
local fail = any - 1
local always = P("")
- local escapable = S("\\`*_{}[]()+_.!#-~:^")
+ local escapable = S("\\`*_{}[]()+_.!<>#-~:^")
local anyescaped = P("\\") / "" * escapable
+ any
@@ -480,9 +496,9 @@ function M.reader.new(writer, options)
local specialchar
if options.smartEllipses then
- specialchar = S("*_`&[]!\\.")
+ specialchar = S("*_`&[]<!\\.")
else
- specialchar = S("*_`&[]!\\")
+ specialchar = S("*_`&[]<!\\")
end
local normalchar = any -
@@ -613,7 +629,7 @@ function M.reader.new(writer, options)
if found then
return writer.note(parse_blocks(found))
else
- return {"[^", ref, "]"}
+ return {"[", parse_inlines("^" .. ref), "]"}
end
end
end