48 lines
1.5 KiB
Plaintext
48 lines
1.5 KiB
Plaintext
Path = require "sitegen.path"
|
|
|
|
needs_shell_escape = (str) -> not not str\match "[^%w_-]"
|
|
shell_escape = (str) -> str\gsub "'", "''"
|
|
|
|
_prepare_command = (cmd, ...) ->
|
|
args = for x in *{...}
|
|
if needs_shell_escape x then "'#{shell_escape x}'" else x
|
|
|
|
args = table.concat args, " "
|
|
"#{cmd} #{args}"
|
|
|
|
-- config command like this in site.moon:
|
|
-- require("renderers.markdown").cmd = "pandoc --mathjax >"
|
|
class PandocRenderer extends require "sitegen.renderers.markdown"
|
|
unescape_cosmo = @unescape_cosmo
|
|
escape_cosmo = @escape_cosmo
|
|
|
|
pandoc: (md_source) =>
|
|
fname = os.tmpname!
|
|
with io.popen _prepare_command(@@cmd, fname), "w"
|
|
\write md_source
|
|
\close!
|
|
|
|
p = io.open fname
|
|
out = p\read"*a"
|
|
|
|
if mat = out\match('<div class="highlight"><pre>(.-)\n?</pre></div>')
|
|
rep = '<div class="sourceCode"><pre class="sourceCode ' .. 'moonscript"><code class="sourceCode ' .. 'moonscript">' .. mat .. '</code></pre></div>'
|
|
out = out\gsub('<div class="highlight"><pre>(.-)\n?</pre></div>', rep)
|
|
|
|
out
|
|
|
|
-- get rid of the div and pre inserted by pygments
|
|
-- assert out\match('^<div class="highlight"><pre>(.-)\n?</pre></div>'),
|
|
-- "Failed to parse pygmentize result, is pygments installed?"
|
|
|
|
cmd: "pandoc >"
|
|
|
|
render: (page, md_source) =>
|
|
md_source = page\pipe "renderer.markdown.pre_render", md_source
|
|
md_source, escapes = escape_cosmo md_source
|
|
|
|
html_source = assert @pandoc md_source
|
|
html_source = unescape_cosmo html_source, escapes
|
|
|
|
super page, html_source
|