Skip to content

Commit

Permalink
Improvements to #2679 makes commas optional
Browse files Browse the repository at this point in the history
  • Loading branch information
zachleat committed Jul 22, 2024
1 parent ff6338f commit 0976d7d
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 19 deletions.
30 changes: 20 additions & 10 deletions src/Engines/Liquid.js
Original file line number Diff line number Diff line change
Expand Up @@ -164,18 +164,32 @@ class Liquid extends TemplateEngine {
return argArray;
}

static parseArgumentsBuiltin(args) {
let tokenizer = new Tokenizer(args);
let parsedArgs = [];

let value = tokenizer.readValue();
while (value) {
parsedArgs.push(value);
tokenizer.skipBlank();
if (tokenizer.peek() === ",") {
tokenizer.advance();
}
value = tokenizer.readValue();
}
tokenizer.end();

return parsedArgs;
}

addShortcode(shortcodeName, shortcodeFn) {
let _t = this;
this.addTag(shortcodeName, function (liquidEngine) {
return {
parse(tagToken) {
this.name = tagToken.name;
if (_t.config.liquidParameterParsing === "builtin") {
let tokenizer = new Tokenizer(tagToken.args);
this.orderedArgs = [];
while (!tokenizer.end()) {
this.orderedArgs.push(tokenizer.readValue());
}
this.orderedArgs = Liquid.parseArgumentsBuiltin(tagToken.args);
// note that Liquid does have a Hash class for name-based argument parsing but offers no easy to support both modes in one class
} else {
this.legacyArgs = tagToken.args;
Expand Down Expand Up @@ -212,11 +226,7 @@ class Liquid extends TemplateEngine {
this.name = tagToken.name;

if (_t.config.liquidParameterParsing === "builtin") {
let tokenizer = new Tokenizer(tagToken.args);
this.orderedArgs = [];
while (!tokenizer.end()) {
this.orderedArgs.push(tokenizer.readValue());
}
this.orderedArgs = Liquid.parseArgumentsBuiltin(tagToken.args);
// note that Liquid does have a Hash class for name-based argument parsing but offers no easy to support both modes in one class
} else {
this.legacyArgs = tagToken.args;
Expand Down
8 changes: 2 additions & 6 deletions src/Plugins/RenderPlugin.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import fs from "graceful-fs";
import { Merge, TemplatePath, isPlainObject } from "@11ty/eleventy-utils";
import { Tokenizer, evalToken } from "liquidjs";
import { evalToken } from "liquidjs";

// TODO add a first-class Markdown component to expose this using Markdown-only syntax (will need to be synchronous for markdown-it)

Expand Down Expand Up @@ -154,11 +154,7 @@ function eleventyRenderPlugin(eleventyConfig, options = {}) {
this.name = tagToken.name;

if (eleventyConfig.liquid.parameterParsing === "builtin") {
let tokenizer = new Tokenizer(tagToken.args);
this.orderedArgs = [];
while (!tokenizer.end()) {
this.orderedArgs.push(tokenizer.readValue());
}
this.orderedArgs = Liquid.parseArgumentsBuiltin(tagToken.args);
// note that Liquid does have a Hash class for name-based argument parsing but offers no easy to support both modes in one class
} else {
this.legacyArgs = tagToken.args;
Expand Down
80 changes: 78 additions & 2 deletions test/TemplateRenderLiquidTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -1042,7 +1042,7 @@ test("Liquid Parse for Symbols", async (t) => {
t.deepEqual(engine.parseForSymbols("{{ collections.mine | test }}>"), ["collections.mine"]);
});

test("Eleventy shortcode uses new built-in Liquid argument parsing behavior", async (t) => {
test("Eleventy shortcode uses new built-in Liquid argument parsing behavior (spaces)", async (t) => {
let elev = new Eleventy("./test/stubs-virtual/", undefined, {
config: eleventyConfig => {
eleventyConfig.setLiquidParameterParsing("builtin");
Expand All @@ -1061,7 +1061,45 @@ test("Eleventy shortcode uses new built-in Liquid argument parsing behavior", as
t.deepEqual(result.content, "[123,456]");
});

test("Eleventy paired shortcode uses new built-in Liquid argument parsing behavior", async (t) => {
test("Eleventy shortcode uses new built-in Liquid argument parsing behavior (commas)", async (t) => {
let elev = new Eleventy("./test/stubs-virtual/", undefined, {
config: eleventyConfig => {
eleventyConfig.setLiquidParameterParsing("builtin");
eleventyConfig.addShortcode("test", (...args) => {
return JSON.stringify(args);
})
eleventyConfig.addTemplate("index.liquid", `{% test abc, def %}`, {
abc: 123,
def: 456
});
}
});
elev.disableLogger();

let [result] = await elev.toJSON();
t.deepEqual(result.content, "[123,456]");
});

test("Eleventy shortcode uses new built-in Liquid argument parsing behavior (commas, no spaces)", async (t) => {
let elev = new Eleventy("./test/stubs-virtual/", undefined, {
config: eleventyConfig => {
eleventyConfig.setLiquidParameterParsing("builtin");
eleventyConfig.addShortcode("test", (...args) => {
return JSON.stringify(args);
})
eleventyConfig.addTemplate("index.liquid", `{% test abc,def %}`, {
abc: 123,
def: 456
});
}
});
elev.disableLogger();

let [result] = await elev.toJSON();
t.deepEqual(result.content, "[123,456]");
});

test("Eleventy paired shortcode uses new built-in Liquid argument parsing behavior (spaces)", async (t) => {
let elev = new Eleventy("./test/stubs-virtual/", undefined, {
config: eleventyConfig => {
eleventyConfig.setLiquidParameterParsing("builtin");
Expand All @@ -1079,3 +1117,41 @@ test("Eleventy paired shortcode uses new built-in Liquid argument parsing behavi
let [result] = await elev.toJSON();
t.deepEqual(result.content, `["hi",123,456]`);
});

test("Eleventy paired shortcode uses new built-in Liquid argument parsing behavior (commas)", async (t) => {
let elev = new Eleventy("./test/stubs-virtual/", undefined, {
config: eleventyConfig => {
eleventyConfig.setLiquidParameterParsing("builtin");
eleventyConfig.addPairedShortcode("test", (...args) => {
return JSON.stringify(args);
})
eleventyConfig.addTemplate("index.liquid", `{% test abc, def %}hi{% endtest %}`, {
abc: 123,
def: 456
});
}
});
elev.disableLogger();

let [result] = await elev.toJSON();
t.deepEqual(result.content, `["hi",123,456]`);
});

test("Eleventy paired shortcode uses new built-in Liquid argument parsing behavior (commas, no spaces)", async (t) => {
let elev = new Eleventy("./test/stubs-virtual/", undefined, {
config: eleventyConfig => {
eleventyConfig.setLiquidParameterParsing("builtin");
eleventyConfig.addPairedShortcode("test", (...args) => {
return JSON.stringify(args);
})
eleventyConfig.addTemplate("index.liquid", `{% test abc,def %}hi{% endtest %}`, {
abc: 123,
def: 456
});
}
});
elev.disableLogger();

let [result] = await elev.toJSON();
t.deepEqual(result.content, `["hi",123,456]`);
});
2 changes: 1 addition & 1 deletion test/TemplateRenderPluginTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ test.skip("Use liquid in njk (access to all global data)", async (t) => {
t.is(html, `globalHi`);
});

test("Render front matter via renderTemplate (njk)", async (t) => {
test("renderContent filter #3369 #3370 via renderTemplate (njk)", async (t) => {
let html = await getTestOutputForFile("./test/stubs-render-plugin/nunjucks-frontmatter.njk", (eleventyConfig) => {
eleventyConfig.addShortcode("test", () => "test content")
});
Expand Down

0 comments on commit 0976d7d

Please # to comment.