texlive[43618] Master: markdown (27mar17)

commits+karl at tug.org commits+karl at tug.org
Mon Mar 27 23:41:13 CEST 2017


Revision: 43618
          http://tug.org/svn/texlive?view=revision&revision=43618
Author:   karl
Date:     2017-03-27 23:41:13 +0200 (Mon, 27 Mar 2017)
Log Message:
-----------
markdown (27mar17)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/generic/markdown/markdown.pdf
    trunk/Master/texmf-dist/source/generic/markdown/docstrip.cfg
    trunk/Master/texmf-dist/source/generic/markdown/markdown.dtx
    trunk/Master/texmf-dist/tex/context/third/markdown/t-markdown.tex
    trunk/Master/texmf-dist/tex/generic/markdown/markdown.tex
    trunk/Master/texmf-dist/tex/latex/markdown/markdown.sty
    trunk/Master/texmf-dist/tex/luatex/markdown/markdown.lua
    trunk/Master/tlpkg/libexec/ctan2tds

Modified: trunk/Master/texmf-dist/doc/generic/markdown/markdown.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/generic/markdown/docstrip.cfg
===================================================================
--- trunk/Master/texmf-dist/source/generic/markdown/docstrip.cfg	2017-03-27 18:00:45 UTC (rev 43617)
+++ trunk/Master/texmf-dist/source/generic/markdown/docstrip.cfg	2017-03-27 21:41:13 UTC (rev 43618)
@@ -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

Modified: trunk/Master/texmf-dist/source/generic/markdown/markdown.dtx
===================================================================
--- trunk/Master/texmf-dist/source/generic/markdown/markdown.dtx	2017-03-27 18:00:45 UTC (rev 43617)
+++ trunk/Master/texmf-dist/source/generic/markdown/markdown.dtx	2017-03-27 21:41:13 UTC (rev 43618)
@@ -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 at 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 @@
 %     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 @@
 % \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.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.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 @@
 %                    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 @@
 %   </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 @@
 % \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 @@
 % 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 @@
 \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 @@
 %    \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 @@
   \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 @@
 \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 @@
 % 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 @@
   \def\markdownOptionCitationNbsps{#1}}%
 \define at key{markdownOptions}{cacheDir}{%
   \def\markdownOptionCacheDir{#1}}%
+\define at key{markdownOptions}{contentBlocks}[true]{%
+  \def\markdownOptionContentBlocks{#1}}%
+\define at key{markdownOptions}{contentBlocksLanguageMap}{%
+  \def\markdownOptionContentBlocksLanguageMap{#1}}%
 \define at key{markdownOptions}{definitionLists}[true]{%
   \def\markdownOptionDefinitionLists{#1}}%
 \define at key{markdownOptions}{footnotes}[true]{%
@@ -1557,6 +1658,12 @@
   \renewcommand\markdownRendererCodeSpan[1]{#1}}%
 \define at key{markdownRenderers}{link}{%
   \renewcommand\markdownRendererLink[4]{#1}}%
+\define at key{markdownRenderers}{contentBlock}{%
+  \renewcommand\markdownRendererContentBlock[4]{#1}}%
+\define at key{markdownRenderers}{contentBlockOnlineImage}{%
+  \renewcommand\markdownRendererContentBlockOnlineImage[4]{#1}}%
+\define at key{markdownRenderers}{contentBlockCode}{%
+  \renewcommand\markdownRendererContentBlockCode[5]{#1}}%
 \define at key{markdownRenderers}{image}{%
   \renewcommand\markdownRendererImage[4]{#1}}%
 \define at key{markdownRenderers}{ulBegin}{%
@@ -1688,6 +1795,12 @@
   \renewcommand\markdownRendererCodeSpanPrototype[1]{#1}}%
 \define at key{markdownRendererPrototypes}{link}{%
   \renewcommand\markdownRendererLinkPrototype[4]{#1}}%
+\define at key{markdownRendererPrototypes}{contentBlock}{%
+  \renewcommand\markdownRendererContentBlockPrototype[4]{#1}}%
+\define at key{markdownRendererPrototypes}{contentBlockOnlineImage}{%
+  \renewcommand\markdownRendererContentBlockOnlineImagePrototype[4]{#1}}%
+\define at key{markdownRendererPrototypes}{contentBlockCode}{%
+  \renewcommand\markdownRendererContentBlockCodePrototype[5]{#1}}%
 \define at key{markdownRendererPrototypes}{image}{%
   \renewcommand\markdownRendererImagePrototype[4]{#1}}%
 \define at key{markdownRendererPrototypes}{ulBegin}{%
@@ -2089,7 +2202,7 @@
   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 @@
   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 @@
 %  \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 @@
                           ) + 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.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.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 @@
 % \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 @@
 %    \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 @@
 
       Blank                 = larsers.Blank,
 
-      Block                 = V("Blockquote")
+      Block                 = V("ContentBlock")
+                            + V("Blockquote")
                             + V("Verbatim")
                             + V("FencedCode")
                             + V("HorizontalRule")
@@ -3844,6 +4102,7 @@
                             + V("Paragraph")
                             + V("Plain"),
 
+      ContentBlock          = larsers.ContentBlock,
       Blockquote            = larsers.Blockquote,
       Verbatim              = larsers.Verbatim,
       FencedCode            = larsers.FencedCode,
@@ -3909,6 +4168,10 @@
     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 @@
 \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 @@
 % \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 @@
 \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 @@
 %
 % 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 @@
     dlBeginTight = {\markdownRendererDlBegin},
     dlEndTight = {\markdownRendererDlEnd}}}}
 \RequirePackage{fancyvrb}
+\RequirePackage{csvsimple}
 \markdownSetup{rendererPrototypes={
   lineBreak = {\\},
   leftBrace = {\textbraceleft},
@@ -4569,7 +4844,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}%
@@ -4802,6 +5090,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 at arg{#1}%
+	\ifx\markdownConTeXtCSV at 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 @@
     \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:

Modified: trunk/Master/texmf-dist/tex/context/third/markdown/t-markdown.tex
===================================================================
--- trunk/Master/texmf-dist/tex/context/third/markdown/t-markdown.tex	2017-03-27 18:00:45 UTC (rev 43617)
+++ trunk/Master/texmf-dist/tex/context/third/markdown/t-markdown.tex	2017-03-27 21:41:13 UTC (rev 43618)
@@ -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 at arg{#1}%
+\ifx\markdownConTeXtCSV at 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}%

Modified: trunk/Master/texmf-dist/tex/generic/markdown/markdown.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/markdown/markdown.tex	2017-03-27 18:00:45 UTC (rev 43617)
+++ trunk/Master/texmf-dist/tex/generic/markdown/markdown.tex	2017-03-27 21:41:13 UTC (rev 43618)
@@ -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

Modified: trunk/Master/texmf-dist/tex/latex/markdown/markdown.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/markdown/markdown.sty	2017-03-27 18:00:45 UTC (rev 43617)
+++ trunk/Master/texmf-dist/tex/latex/markdown/markdown.sty	2017-03-27 21:41:13 UTC (rev 43618)
@@ -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 at key{markdownOptions}{cacheDir}{%
   \def\markdownOptionCacheDir{#1}}%
+\define at key{markdownOptions}{contentBlocks}[true]{%
+  \def\markdownOptionContentBlocks{#1}}%
+\define at key{markdownOptions}{contentBlocksLanguageMap}{%
+  \def\markdownOptionContentBlocksLanguageMap{#1}}%
 \define at key{markdownOptions}{definitionLists}[true]{%
   \def\markdownOptionDefinitionLists{#1}}%
 \define at key{markdownOptions}{footnotes}[true]{%
@@ -127,6 +131,12 @@
   \renewcommand\markdownRendererCodeSpan[1]{#1}}%
 \define at key{markdownRenderers}{link}{%
   \renewcommand\markdownRendererLink[4]{#1}}%
+\define at key{markdownRenderers}{contentBlock}{%
+  \renewcommand\markdownRendererContentBlock[4]{#1}}%
+\define at key{markdownRenderers}{contentBlockOnlineImage}{%
+  \renewcommand\markdownRendererContentBlockOnlineImage[4]{#1}}%
+\define at key{markdownRenderers}{contentBlockCode}{%
+  \renewcommand\markdownRendererContentBlockCode[5]{#1}}%
 \define at key{markdownRenderers}{image}{%
   \renewcommand\markdownRendererImage[4]{#1}}%
 \define at key{markdownRenderers}{ulBegin}{%
@@ -237,6 +247,12 @@
   \renewcommand\markdownRendererCodeSpanPrototype[1]{#1}}%
 \define at key{markdownRendererPrototypes}{link}{%
   \renewcommand\markdownRendererLinkPrototype[4]{#1}}%
+\define at key{markdownRendererPrototypes}{contentBlock}{%
+  \renewcommand\markdownRendererContentBlockPrototype[4]{#1}}%
+\define at key{markdownRendererPrototypes}{contentBlockOnlineImage}{%
+  \renewcommand\markdownRendererContentBlockOnlineImagePrototype[4]{#1}}%
+\define at key{markdownRendererPrototypes}{contentBlockCode}{%
+  \renewcommand\markdownRendererContentBlockCodePrototype[5]{#1}}%
 \define at key{markdownRendererPrototypes}{image}{%
   \renewcommand\markdownRendererImagePrototype[4]{#1}}%
 \define at 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}%

Modified: trunk/Master/texmf-dist/tex/luatex/markdown/markdown.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/markdown/markdown.lua	2017-03-27 18:00:45 UTC (rev 43617)
+++ trunk/Master/texmf-dist/tex/luatex/markdown/markdown.lua	2017-03-27 21:41:13 UTC (rev 43618)
@@ -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.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 @@
                            "{",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 @@
 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 @@
                           ) + 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.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 @@
 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 @@
   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 @@
 
       Blank                 = larsers.Blank,
 
-      Block                 = V("Blockquote")
+      Block                 = V("ContentBlock")
+                            + V("Blockquote")
                             + V("Verbatim")
                             + V("FencedCode")
                             + V("HorizontalRule")
@@ -1624,6 +1752,7 @@
                             + V("Paragraph")
                             + V("Plain"),
 
+      ContentBlock          = larsers.ContentBlock,
       Blockquote            = larsers.Blockquote,
       Verbatim              = larsers.Verbatim,
       FencedCode            = larsers.FencedCode,
@@ -1689,6 +1818,10 @@
     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

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2017-03-27 18:00:45 UTC (rev 43617)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2017-03-27 21:41:13 UTC (rev 43618)
@@ -1044,6 +1044,7 @@
  '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",



More information about the tex-live-commits mailing list