Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce porta mattis neque, quis molestie nunc faucibus vitae. Phasellus vel commodo dolor, at faucibus arcu. Curabitur sit amet magna a neque euismod feugiat non et diam. Aliquam sit amet libero enim. Integer dignissim ullamcorper felis, ac ultrices turpis congue vel. Nulla id tempus orci. Curabitur ac vulputate tellus. Integer fermentum tempor facilisis. Duis egestas luctus tristique. Maecenas vitae arcu sit amet justo feugiat imperdiet. Nunc luctus erat sed ligula convallis hendrerit.

#!/usr/bin/env runhaskell -- filter.hs import Text.Pandoc.JSON import qualified Data.Text.IO as TIO import qualified Data.Text as T file2Block :: FilePath -> IO [Block] file2Block f = do contents <- TIO.readFile f return [Plain [Str contents]] doInclude :: Block -> IO Block doInclude cb@(Div (id, classes, namevals) contents) = case lookup (T.pack "include") namevals of Just f -> Div (id, classes, namevals) <$> file2Block (T.unpack f) Nothing -> return cb doInclude x = return x main :: IO () main = toJSONFilter doInclude local function words(s) local res = {} for part in s:gmatch("[^,]+") do -- split by commas local trimmed = part:match("^%s*(.-)%s*$") -- remove leading/trailing spaces if trimmed ~= "" then table.insert(res, trimmed) end end return res end local function label2Block(labels) local contents = "" for _,l in ipairs(words(labels)) do -- use file for now. local fh = io.open(l, "r") if not fh then io.stderr:write("Cannot open file: " .. l .. "\n") return { pandoc.Plain { pandoc.Str("[Error: cannot read file " .. l .. "]") } } end contents = contents .. fh:read("*a") fh:close() end return { pandoc.Plain { pandoc.Str(contents) } } end function Div(e) local include = e.attributes["include"] if include then local blocks = label2Block(include) -- Replace the Div contents return pandoc.Div(blocks, e.attr) end return nil -- no change end

test thm1

test thm2

test thm3