334 lines
10 KiB
JavaScript
334 lines
10 KiB
JavaScript
|
import test from "ava";
|
|||
|
import TemplateRender from "../src/TemplateRender";
|
|||
|
import md from "markdown-it";
|
|||
|
import mdEmoji from "markdown-it-emoji";
|
|||
|
import UserConfig from "../src/UserConfig";
|
|||
|
import eleventySyntaxHighlightPlugin from "@11ty/eleventy-plugin-syntaxhighlight";
|
|||
|
|
|||
|
// Markdown
|
|||
|
test("Markdown", t => {
|
|||
|
t.is(new TemplateRender("md").getEngineName(), "md");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Parses base markdown, no data", async t => {
|
|||
|
let fn = await new TemplateRender("md").getCompiledTemplate("# My Title");
|
|||
|
t.is((await fn()).trim(), "<h1>My Title</h1>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Markdown should work with HTML too", async t => {
|
|||
|
let fn = await new TemplateRender("md").getCompiledTemplate(
|
|||
|
"<h1>My Title</h1>"
|
|||
|
);
|
|||
|
t.is((await fn()).trim(), "<h1>My Title</h1>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Parses markdown using liquid engine (default, with data)", async t => {
|
|||
|
let fn = await new TemplateRender("md").getCompiledTemplate("# {{title}}");
|
|||
|
t.is((await fn({ title: "My Title" })).trim(), "<h1>My Title</h1>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Parses markdown using ejs engine", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
tr.setMarkdownEngine("ejs");
|
|||
|
let fn = await tr.getCompiledTemplate("<%=title %>");
|
|||
|
t.is((await fn({ title: "My Title" })).trim(), "<p>My Title</p>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Ignore markdown, use only preprocess engine (useful for variable resolution in permalinks)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
tr.setUseMarkdown(false);
|
|||
|
let fn = await tr.getCompiledTemplate("{{title}}");
|
|||
|
t.is((await fn({ title: "My Title" })).trim(), "My Title");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Skip markdown and preprocess engine (issue #466)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
tr.setMarkdownEngine(false);
|
|||
|
tr.setUseMarkdown(false);
|
|||
|
let fn = await tr.getCompiledTemplate("404.html");
|
|||
|
t.is((await fn({ title: "My Title" })).trim(), "404.html");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Set markdown engine to false, don’t parse", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
tr.setMarkdownEngine(false);
|
|||
|
let fn = await tr.getCompiledTemplate("# {{title}}");
|
|||
|
t.is((await fn()).trim(), "<h1>{{title}}</h1>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Set markdown engine to false, don’t parse (test with HTML input)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
tr.setMarkdownEngine(false);
|
|||
|
let fn = await tr.getCompiledTemplate("<h1>{{title}}</h1>");
|
|||
|
|
|||
|
t.is((await fn()).trim(), "<h1>{{title}}</h1>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Pass in engine override (ejs)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
tr.setMarkdownEngine("ejs");
|
|||
|
let fn = await tr.getCompiledTemplate("# <%= title %>");
|
|||
|
t.is((await fn({ title: "My Title" })).trim(), "<h1>My Title</h1>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Pass in an override (liquid)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
tr.setMarkdownEngine("liquid");
|
|||
|
let fn = await tr.getCompiledTemplate("# {{title}}");
|
|||
|
|
|||
|
t.is((await fn({ title: "My Title" })).trim(), "<h1>My Title</h1>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Strikethrough", async t => {
|
|||
|
let fn = await new TemplateRender("md").getCompiledTemplate("~~No~~");
|
|||
|
t.is((await fn()).trim(), "<p><s>No</s></p>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: Strikethrough in a Header", async t => {
|
|||
|
let fn = await new TemplateRender("md").getCompiledTemplate("# ~~No~~");
|
|||
|
t.is((await fn()).trim(), "<h1><s>No</s></h1>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: with Library Override", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
|
|||
|
let mdLib = md();
|
|||
|
tr.engine.setLibrary(mdLib);
|
|||
|
t.is(mdLib.render(":)").trim(), "<p>:)</p>");
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(":)");
|
|||
|
t.is((await fn()).trim(), "<p>:)</p>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: with Library Override and a Plugin", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
|
|||
|
let mdLib = md().use(mdEmoji);
|
|||
|
tr.engine.setLibrary(mdLib);
|
|||
|
t.is(mdLib.render(":)").trim(), "<p>😃</p>");
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(":)");
|
|||
|
t.is((await fn()).trim(), "<p>😃</p>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: use a custom highlighter", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
|
|||
|
let mdLib = md();
|
|||
|
mdLib.set({
|
|||
|
highlight: function(str, lang) {
|
|||
|
return "This is overrrrrrride";
|
|||
|
}
|
|||
|
});
|
|||
|
tr.engine.setLibrary(mdLib);
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(`\`\`\`
|
|||
|
This is some code.
|
|||
|
\`\`\``);
|
|||
|
t.is((await fn()).trim(), "<pre><code>This is overrrrrrride</code></pre>");
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: use prism highlighter (no language)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
let userConfig = new UserConfig();
|
|||
|
userConfig.addPlugin(eleventySyntaxHighlightPlugin);
|
|||
|
|
|||
|
let markdownHighlight = userConfig.getMergingConfigObject()
|
|||
|
.markdownHighlighter;
|
|||
|
|
|||
|
let mdLib = md();
|
|||
|
mdLib.set({
|
|||
|
highlight: markdownHighlight
|
|||
|
});
|
|||
|
tr.engine.setLibrary(mdLib);
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(`\`\`\`
|
|||
|
This is some code.
|
|||
|
\`\`\``);
|
|||
|
t.is(
|
|||
|
(await fn()).trim(),
|
|||
|
`<pre><code>This is some code.
|
|||
|
</code></pre>`
|
|||
|
);
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: use prism highlighter", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
let userConfig = new UserConfig();
|
|||
|
userConfig.addPlugin(eleventySyntaxHighlightPlugin);
|
|||
|
|
|||
|
let markdownHighlight = userConfig.getMergingConfigObject()
|
|||
|
.markdownHighlighter;
|
|||
|
|
|||
|
let mdLib = md();
|
|||
|
mdLib.set({
|
|||
|
highlight: markdownHighlight
|
|||
|
});
|
|||
|
tr.engine.setLibrary(mdLib);
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(`\`\`\` js
|
|||
|
var key = "value";
|
|||
|
\`\`\``);
|
|||
|
t.is(
|
|||
|
(await fn()).trim(),
|
|||
|
`<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> key <span class="token operator">=</span> <span class="token string">"value"</span><span class="token punctuation">;</span></span></code></pre>`
|
|||
|
);
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: use prism highlighter (no space before language)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
let userConfig = new UserConfig();
|
|||
|
userConfig.addPlugin(eleventySyntaxHighlightPlugin);
|
|||
|
|
|||
|
let markdownHighlight = userConfig.getMergingConfigObject()
|
|||
|
.markdownHighlighter;
|
|||
|
|
|||
|
let mdLib = md();
|
|||
|
mdLib.set({
|
|||
|
highlight: markdownHighlight
|
|||
|
});
|
|||
|
tr.engine.setLibrary(mdLib);
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(`\`\`\`js
|
|||
|
var key = "value";
|
|||
|
\`\`\``);
|
|||
|
t.is(
|
|||
|
(await fn()).trim(),
|
|||
|
`<pre class="language-js"><code class="language-js"><span class="highlight-line"><span class="token keyword">var</span> key <span class="token operator">=</span> <span class="token string">"value"</span><span class="token punctuation">;</span></span></code></pre>`
|
|||
|
);
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: use prism highlighter, line highlighting", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
let userConfig = new UserConfig();
|
|||
|
userConfig.addPlugin(eleventySyntaxHighlightPlugin);
|
|||
|
|
|||
|
let markdownHighlight = userConfig.getMergingConfigObject()
|
|||
|
.markdownHighlighter;
|
|||
|
|
|||
|
let mdLib = md();
|
|||
|
mdLib.set({
|
|||
|
highlight: markdownHighlight
|
|||
|
});
|
|||
|
tr.engine.setLibrary(mdLib);
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(`\`\`\`js/0
|
|||
|
var key = "value";
|
|||
|
\`\`\``);
|
|||
|
t.is(
|
|||
|
(await fn()).trim(),
|
|||
|
`<pre class="language-js"><code class="language-js"><mark class="highlight-line highlight-line-active"><span class="token keyword">var</span> key <span class="token operator">=</span> <span class="token string">"value"</span><span class="token punctuation">;</span></mark></code></pre>`
|
|||
|
);
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: use prism highlighter, line highlighting with fallback `text` language.", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
let userConfig = new UserConfig();
|
|||
|
userConfig.addPlugin(eleventySyntaxHighlightPlugin);
|
|||
|
|
|||
|
let markdownHighlight = userConfig.getMergingConfigObject()
|
|||
|
.markdownHighlighter;
|
|||
|
|
|||
|
let mdLib = md();
|
|||
|
mdLib.set({
|
|||
|
highlight: markdownHighlight
|
|||
|
});
|
|||
|
tr.engine.setLibrary(mdLib);
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(`\`\`\` text/0
|
|||
|
var key = "value";
|
|||
|
\`\`\``);
|
|||
|
t.is(
|
|||
|
(await fn()).trim(),
|
|||
|
`<pre class="language-text"><code class="language-text"><mark class="highlight-line highlight-line-active">var key = "value";</mark></code></pre>`
|
|||
|
);
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: use Markdown inside of a Liquid shortcode (Issue #536)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
|
|||
|
let cls = require("../src/Engines/Liquid");
|
|||
|
let liquidEngine = new cls("liquid", tr.getIncludesDir());
|
|||
|
liquidEngine.addShortcode("testShortcode", function() {
|
|||
|
return "## My Other Title";
|
|||
|
});
|
|||
|
tr.setMarkdownEngine(liquidEngine);
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(`# {{title}}
|
|||
|
{% testShortcode %}`);
|
|||
|
t.is(
|
|||
|
(await fn({
|
|||
|
title: "My Title",
|
|||
|
otherTitle: "My Other Title"
|
|||
|
})).trim(),
|
|||
|
`<h1>My Title</h1>
|
|||
|
<h2>My Other Title</h2>`
|
|||
|
);
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: use Markdown inside of a Nunjucks shortcode (Issue #536)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
|
|||
|
let cls = require("../src/Engines/Nunjucks");
|
|||
|
let nunjucksEngine = new cls("njk", tr.getIncludesDir());
|
|||
|
nunjucksEngine.addShortcode("testShortcode", function() {
|
|||
|
return "## My Other Title";
|
|||
|
});
|
|||
|
tr.setMarkdownEngine(nunjucksEngine);
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(`# {{title}}
|
|||
|
{% testShortcode %}`);
|
|||
|
t.is(
|
|||
|
(await fn({
|
|||
|
title: "My Title",
|
|||
|
otherTitle: "My Other Title"
|
|||
|
})).trim(),
|
|||
|
`<h1>My Title</h1>
|
|||
|
<h2>My Other Title</h2>`
|
|||
|
);
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: use Markdown inside of a Liquid paired shortcode (Issue #536)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
|
|||
|
let cls = require("../src/Engines/Liquid");
|
|||
|
let liquidEngine = new cls("liquid", tr.getIncludesDir());
|
|||
|
liquidEngine.addPairedShortcode("testShortcode", function(content) {
|
|||
|
return content;
|
|||
|
});
|
|||
|
tr.setMarkdownEngine(liquidEngine);
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(`# {{title}}
|
|||
|
{% testShortcode %}## My Other Title{% endtestShortcode %}`);
|
|||
|
t.is(
|
|||
|
(await fn({
|
|||
|
title: "My Title",
|
|||
|
otherTitle: "My Other Title"
|
|||
|
})).trim(),
|
|||
|
`<h1>My Title</h1>
|
|||
|
<h2>My Other Title</h2>`
|
|||
|
);
|
|||
|
});
|
|||
|
|
|||
|
test("Markdown Render: use Markdown inside of a Nunjucks paired shortcode (Issue #536)", async t => {
|
|||
|
let tr = new TemplateRender("md");
|
|||
|
|
|||
|
let cls = require("../src/Engines/Nunjucks");
|
|||
|
let nunjucksEngine = new cls("njk", tr.getIncludesDir());
|
|||
|
nunjucksEngine.addPairedShortcode("testShortcode", function(content) {
|
|||
|
return content;
|
|||
|
});
|
|||
|
tr.setMarkdownEngine(nunjucksEngine);
|
|||
|
|
|||
|
let fn = await tr.getCompiledTemplate(`# {{title}}
|
|||
|
{% testShortcode %}## My Other Title{% endtestShortcode %}`);
|
|||
|
t.is(
|
|||
|
(await fn({
|
|||
|
title: "My Title",
|
|||
|
otherTitle: "My Other Title"
|
|||
|
})).trim(),
|
|||
|
`<h1>My Title</h1>
|
|||
|
<h2>My Other Title</h2>`
|
|||
|
);
|
|||
|
});
|