Skip to content

Commit

Permalink
Enable --content to access page variables
Browse files Browse the repository at this point in the history
  • Loading branch information
dpilafian committed Apr 18, 2024
1 parent e10855e commit 2941c7e
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 21 deletions.
40 changes: 27 additions & 13 deletions replacer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,6 @@ const replacer = {
file: getFileInfo(file.origin),
webRoot: getWebRoot(file.origin),
};
globals[<keyof typeof globals>'pkg'] = pkg; //pkg global is deprecated
const engine = new Liquid({ globals });
const versionFormatter = (numIds: number) =>
(str: string): string => str.replace(/[^0-9]*/, '').split('.').slice(0, numIds).join('.');
Expand All @@ -149,20 +148,35 @@ const replacer = {
engine.registerFilter('major-version', versionFormatter(1));
return engine;
};
const extractPageVars = (engine: Liquid, file: string) => {
// Exammple:
// {% assign colorScheme = 'dark mode' %} ==> { colorScheme: 'dark mode' }
type AssignTag = { //warning: this type accesses unsupported private fields
name: string,
key: number,
value: { initial: { postfix: { content: string }[] } },
};
const tags = <AssignTag[]><object[]>engine.parseFileSync(file);
const toPair = (tag: AssignTag) => [tag.key, tag.value.initial.postfix[0]?.content];
const tagPairs = tags.filter(tag => tag.name === 'assign').map(toPair);
return Object.fromEntries(tagPairs);
}
const processFile = (file: ResultsFile, index: number) => {
const engine = createEngine(file);
const render = (text: string) => engine.parseAndRenderSync(text);
const append = settings.concat && index > 0;
const altText = settings.content ? render(settings.content) : null;
const content = render(header) + (altText ?? fs.readFileSync(file.origin, 'utf-8'));
const newStr = render(rep);
const out1 = settings.templatingOn ? render(content) : content;
const out2 = out1.replace(normalizeEol, '').replace(normalizeEof, '\n');
const out3 = settings.find ? out2.replaceAll(settings.find, newStr) : out2;
const out4 = settings.regex ? out3.replace(settings.regex, newStr) : out3;
const out5 = settings.noSourceMap ? out4.replace(sourceMapLine, '') : out4;
const out6 = out5.trimStart();
const final = append && settings.header ? '\n' + out6 : out6;
const pageVars = settings.content ? extractPageVars(engine, file.origin) : {};
const render = (text: string) => engine.parseAndRenderSync(text, pageVars);
const append = settings.concat && index > 0;
const altText = settings.content ? render(settings.content) : null;
const text = altText ?? fs.readFileSync(file.origin, 'utf-8');
const content = render(header) + text;
const newStr = render(rep);
const out1 = settings.templatingOn ? render(content) : content;
const out2 = out1.replace(normalizeEol, '').replace(normalizeEof, '\n');
const out3 = settings.find ? out2.replaceAll(settings.find, newStr) : out2;
const out4 = settings.regex ? out3.replace(settings.regex, newStr) : out3;
const out5 = settings.noSourceMap ? out4.replace(sourceMapLine, '') : out4;
const out6 = out5.trimStart();
const final = append && settings.header ? '\n' + out6 : out6;
fs.mkdirSync(path.dirname(file.dest), { recursive: true });
return append ? fs.appendFileSync(file.dest, final) : fs.writeFileSync(file.dest, final);
};
Expand Down
4 changes: 4 additions & 0 deletions spec/fixtures/page-variables.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
mock1: I, for one, welcome our new insect overlords.
mock2: I, for one, welcome our new insect overlords.
mock3: I, for one, welcome our new insect overlords.
mock4: I, for one, welcome our new insect overlords.
6 changes: 4 additions & 2 deletions spec/fixtures/source/mock1.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
{% assign charset = 'utf-8' %}
{% assign slogan = 'I, for one, welcome our new insect overlords.' %}
<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<meta charset={{charset}}>
<title>🔍🔍🔍 {{package.name}} 🔍🔍🔍</title>
<link rel=stylesheet href=https://cdn.jsdelivr.net/npm/pretty-print-json@{{package.devDependencies.pretty-print-json|version}}/dist/css/pretty-print-json.css>
<link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@{{package.devDependencies.-fortawesome-fontawesome-free|version}}/css/all.min.css>
Expand All @@ -15,7 +17,7 @@ <h1>🔍🔍🔍 {{package.name}} 🔍🔍🔍</h1>
<h2>{{package.description}}</h2>
</header>
<main>
<p>I, for one, welcome our new insect overlords.</p>
<p>{{slogan}}</p>
<ul>
<li>Release: v{{package.version | version}}</li>
<li>Minor: v{{package.version | minor-version}}</li>
Expand Down
6 changes: 4 additions & 2 deletions spec/fixtures/source/subfolder-a/mock2.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
{% assign charset = 'utf-8' %}
{% assign slogan = 'I, for one, welcome our new insect overlords.' %}
<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<meta charset={{charset}}>
<title>🔍🔍🔍 {{package.name}} 🔍🔍🔍</title>
<link rel=stylesheet href=https://cdn.jsdelivr.net/npm/pretty-print-json@{{package.devDependencies.pretty-print-json|version}}/dist/css/pretty-print-json.css>
<script src=https://cdn.jsdelivr.net/npm/pretty-print-json@{{package.devDependencies.pretty-print-json|version}}/dist/pretty-print-json.min.js></script>
Expand All @@ -10,7 +12,7 @@
<body>
<h1>🔍🔍🔍 {{package.name}} 🔍🔍🔍</h1>
<h2>{{package.description}}</h2>
<p>I, for one, welcome our new insect overlords.</p>
<p>{{slogan}}</p>
<ul>
<li>Release: v{{package.version | version}}</li>
<li>Minor: v{{package.version | minor-version}}</li>
Expand Down
6 changes: 4 additions & 2 deletions spec/fixtures/source/subfolder-b/mock3.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
{% assign charset = 'utf-8' %}
{% assign slogan = 'I, for one, welcome our new insect overlords.' %}
<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<meta charset={{charset}}>
<title>🔍🔍🔍 {{package.name}} 🔍🔍🔍</title>
<link rel=stylesheet href=https://cdn.jsdelivr.net/npm/pretty-print-json@{{package.devDependencies.pretty-print-json|version}}/dist/css/pretty-print-json.css>
<script src=https://cdn.jsdelivr.net/npm/pretty-print-json@{{package.devDependencies.pretty-print-json|version}}/dist/pretty-print-json.min.js></script>
Expand All @@ -13,7 +15,7 @@ <h1>🔍🔍🔍 {{package.name}} 🔍🔍🔍</h1>
<h2>{{package.description}}</h2>
</header>
<main>
<p>I, for one, welcome our new insect overlords.</p>
<p>{{slogan}}</p>
<ul>
<li>Release: v{{package.version | version}}</li>
<li>Minor: v{{package.version | minor-version}}</li>
Expand Down
6 changes: 4 additions & 2 deletions spec/fixtures/source/subfolder-b/subfolder-bb/mock4.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
{% assign charset = 'utf-8' %}
{% assign slogan = 'I, for one, welcome our new insect overlords.' %}
<!doctype html>
<html lang=en>
<head>
<meta charset=utf-8>
<meta charset={{charset}}>
<title>🔍🔍🔍 {{package.name}} 🔍🔍🔍</title>
<link rel=stylesheet href=https://cdn.jsdelivr.net/npm/pretty-print-json@{{package.devDependencies.pretty-print-json|version}}/dist/css/pretty-print-json.css>
<script src=https://cdn.jsdelivr.net/npm/pretty-print-json@{{package.devDependencies.pretty-print-json|version}}/dist/pretty-print-json.min.js></script>
Expand All @@ -13,7 +15,7 @@ <h1>🔍🔍🔍 {{package.name}} 🔍🔍🔍</h1>
<h2>{{package.description}}</h2>
</header>
<main>
<p>I, for one, welcome our new insect overlords.</p>
<p>{{slogan}}</p>
<ul>
<li>Release: v{{package.version | version}}</li>
<li>Minor: v{{package.version | minor-version}}</li>
Expand Down
12 changes: 12 additions & 0 deletions spec/mocha.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,16 @@ describe('Executing the CLI', () => {
assertDeepStrictEqual(actual, expected);
});

it('with the --content flag is able to access page variables in the source files', () => {
run('replacer spec/fixtures/source --ext=.html spec/fixtures --content={{file.name}}:{{space}}{{slogan}} --concat=page-variables.txt');
const actual = fs.readFileSync('spec/fixtures/page-variables.txt').toString().trim().split('\n');
const expected = [
'mock1: I, for one, welcome our new insect overlords.',
'mock2: I, for one, welcome our new insect overlords.',
'mock3: I, for one, welcome our new insect overlords.',
'mock4: I, for one, welcome our new insect overlords.',
];
assertDeepStrictEqual(actual, expected);
});

});

0 comments on commit 2941c7e

Please sign in to comment.