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}"

write_exec = (input, cmd, ...) ->
  handle = io.popen _prepare_command(cmd, ...), "w"
  with handle\write input
    handle\close!

convert = =>
  (md_source) ->
    filename = os.tmpname!
    write_exec md_source, @cmd, filename
    Path.read_file filename

    -- fname = os.tmpname!
    -- with io.open fname, "w"
    --   \write md_source
    --   \close!
    --
    -- p = io.popen (@cmd)\format lang, fname
    -- out = p\read"*a"
    -- out

-- 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 = convert @

  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
