83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<p>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.</p>
 | 
						|
<div data-include="filter.hs , filter.lua , ,">
 | 
						|
#!/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
 | 
						|
 | 
						|
</div>
 | 
						|
<div class="Theorem">
 | 
						|
<p>test thm1</p>
 | 
						|
</div>
 | 
						|
<div id="thm2" class="Theorem">
 | 
						|
<p>test thm2</p>
 | 
						|
</div>
 | 
						|
<div id="thm3" class="Theorem">
 | 
						|
<p>test thm3</p>
 | 
						|
</div>
 | 
						|
<div id="special" class="sidebar">
 | 
						|
<p>Here is a paragraph.</p>
 | 
						|
<p>And another.</p>
 | 
						|
</div>
 |