Add specs for pandoc markdown renderer
This commit is contained in:
parent
070bac262f
commit
26f77eab9a
@ -10,6 +10,15 @@ _prepare_command = (cmd, ...) ->
|
|||||||
args = table.concat args, " "
|
args = table.concat args, " "
|
||||||
"#{cmd} #{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:
|
-- config command like this in site.moon:
|
||||||
-- require("renderers.markdown").cmd = "pandoc --mathjax >"
|
-- require("renderers.markdown").cmd = "pandoc --mathjax >"
|
||||||
class PandocRenderer extends require "sitegen.renderers.markdown"
|
class PandocRenderer extends require "sitegen.renderers.markdown"
|
||||||
@ -17,25 +26,7 @@ class PandocRenderer extends require "sitegen.renderers.markdown"
|
|||||||
escape_cosmo = @escape_cosmo
|
escape_cosmo = @escape_cosmo
|
||||||
|
|
||||||
cmd: "pandoc --mathjax --lua-filter pygments.lua >"
|
cmd: "pandoc --mathjax --lua-filter pygments.lua >"
|
||||||
|
pandoc: (content) => Path.read_file write_exec @@cmd, content
|
||||||
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?"
|
|
||||||
|
|
||||||
render: (page, md_source) =>
|
render: (page, md_source) =>
|
||||||
md_source = page\pipe "renderer.markdown.pre_render", md_source
|
md_source = page\pipe "renderer.markdown.pre_render", md_source
|
||||||
|
43
spec/factory.moon
Normal file
43
spec/factory.moon
Normal file
@ -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 }
|
71
spec/renderers_spec.moon
Normal file
71
spec/renderers_spec.moon
Normal file
@ -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 [[<div class="highlight"><pre><span></span><code><span class="py-nb">print</span><span class="py-p">(</span><span class="py-s2">"hello world"</span><span class="py-p">)</span></code></pre></div>]], 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 [=[<div class="highlight"><pre><span></span><code><span class="py-nb">print</span><span class="py-mi">5</span></code></pre></div><p>
|
||||||
|
```lua
|
||||||
|
print thing
|
||||||
|
```
|
||||||
|
</p>]=], out
|
||||||
|
|
||||||
|
it "doesn't highlight unrecognized code languages", ->
|
||||||
|
out = flatten_html render [[
|
||||||
|
```snickerdoodle
|
||||||
|
this code block has an unknown label
|
||||||
|
```]]
|
||||||
|
|
||||||
|
assert.same [[<div class="sourceCode"><pre class="sourceCode"><code>this code block has an unknown label</code></pre></div>]], out
|
||||||
|
|
||||||
|
it "defaults to pandoc highlighting when pygments fails to recognize code language", ->
|
||||||
|
out = flatten_html render [[
|
||||||
|
```heex
|
||||||
|
<.greet name="Jane" />
|
||||||
|
```]]
|
||||||
|
|
||||||
|
assert.same [[<div class="sourceCode" id="cb1"><pre
|
||||||
|
class="sourceCode heex"><code class="sourceCode elixir"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="op"><.</span>greet name<span class="op">=</span><span class="st">"Jane"</span><span class="op">/></span></span></code></pre></div>]], out
|
Loading…
x
Reference in New Issue
Block a user