diff --git a/renderers/markdown.moon b/renderers/markdown.moon
index b67c5d6..765ed9e 100644
--- a/renderers/markdown.moon
+++ b/renderers/markdown.moon
@@ -10,6 +10,15 @@ _prepare_command = (cmd, ...) ->
args = table.concat args, " "
"#{cmd} #{args}"
+write_exec = (cmd, content) ->
+ fname = os.tmpname!
+ f = assert io.popen _prepare_command(cmd, fname), "w"
+
+ with f\write content
+ f\close!
+
+ fname
+
-- config command like this in site.moon:
-- require("renderers.markdown").cmd = "pandoc --mathjax >"
class PandocRenderer extends require "sitegen.renderers.markdown"
@@ -17,25 +26,7 @@ class PandocRenderer extends require "sitegen.renderers.markdown"
escape_cosmo = @escape_cosmo
cmd: "pandoc --mathjax --lua-filter pygments.lua >"
-
- 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('
')
- -- rep = ''
- -- out = out\gsub('', rep)
-
- out
-
- -- get rid of the div and pre inserted by pygments
- -- assert out\match('^'),
- -- "Failed to parse pygmentize result, is pygments installed?"
+ pandoc: (content) => Path.read_file write_exec @@cmd, content
render: (page, md_source) =>
md_source = page\pipe "renderer.markdown.pre_render", md_source
diff --git a/spec/factory.moon b/spec/factory.moon
new file mode 100644
index 0000000..3e9adda
--- /dev/null
+++ b/spec/factory.moon
@@ -0,0 +1,43 @@
+original_Site = require "sitegen.site"
+page = require "sitegen.page"
+site_file = require "sitegen.site_file"
+
+local *
+
+next_counter = do
+ counters = setmetatable {}, __index: => 1
+ (name) ->
+ with counters[name]
+ counters[name] += 1
+
+original_Site.default_plugins = for v in *original_Site.default_plugins
+ if v\find "pygments" then continue else v
+
+Site = (opts={}) ->
+ opts.rel_path or= "."
+
+ original_Site site_file.SiteFile {
+ rel_path: opts.rel_path
+ }
+
+Page = (opts={}) ->
+ opts.site or= Site!
+
+ base = "some_page_#{next_counter "page"}"
+
+ opts.meta or= {}
+ opts.source or= "#{base}.md"
+ opts.target or= "www/#{base}.html"
+ opts.render_fn or= ->
+
+ opts.read = -> error "read disabled"
+ opts.write = -> error "write disabled"
+
+ setmetatable opts, page.Page.__base
+
+ opts.site.pages or= {}
+ table.insert opts.site.pages, opts
+
+ opts
+
+{ :Site, :Page }
diff --git a/spec/renderers_spec.moon b/spec/renderers_spec.moon
new file mode 100644
index 0000000..f1b091f
--- /dev/null
+++ b/spec/renderers_spec.moon
@@ -0,0 +1,71 @@
+factory = require "spec.factory"
+
+import trim from require "sitegen.common"
+
+flatten_html = (html) ->
+ trim (html\gsub "%>%s+%<", "><")
+
+describe "renderers", ->
+ render_for_site = (site, renderer, str, meta={}, page) ->
+ page or= factory.Page(:site)
+ page.render_fn, page.meta = renderer\load str
+ page.meta.template = false
+ for k,v in pairs meta
+ page.meta[k] = v
+ page\render!
+
+ describe "renderers.markdown", ->
+ local site, renderer
+
+ render = (...) -> render_for_site site, renderer, ...
+
+ before_each ->
+ MarkdownRenderer = require "renderers.markdown"
+ site = factory.Site!
+ renderer = MarkdownRenderer site
+
+ it "syntax highlights some code", ->
+ out = flatten_html render [[
+```lua
+print("hello world")
+```]]
+
+ assert.same [[]], out
+
+ it "doesnt highlight code inside of a cosmo template", ->
+ site.user_vars.hello = (_, args) ->
+ { template } = args
+ template
+
+ out = flatten_html render [=[
+ ```lua
+ print 5
+ ```
+ $hello{[[
+ ```lua
+ print thing
+ ```
+ ]]}]=]
+
+ assert.same [=[
+ ```lua
+ print thing
+ ```
+
]=], out
+
+ it "doesn't highlight unrecognized code languages", ->
+ out = flatten_html render [[
+ ```snickerdoodle
+ this code block has an unknown label
+ ```]]
+
+ assert.same [[this code block has an unknown label
]], out
+
+ it "defaults to pandoc highlighting when pygments fails to recognize code language", ->
+ out = flatten_html render [[
+```heex
+<.greet name="Jane" />
+```]]
+
+ assert.same [[]], out