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('
(.-)\n?
') - -- rep = '
' .. mat .. '
' - -- out = out\gsub('
(.-)\n?
', rep) - - out - - -- get rid of the div and pre inserted by pygments - -- assert out\match('^
(.-)\n?
'), - -- "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 [[
print("hello world")
]], 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 [=[
print5

+ ```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 [[
<.greet name="Jane"/>
]], out