Skip to content

Commit e01d0f1

Browse files
committed
fix: add safe filter
1 parent 02b6416 commit e01d0f1

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

demo/_layouts/base.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<body>
1010
<html-include src="header.html"/>
1111
<main>
12-
{{ content }}
12+
{{ content | safe }}
1313
</main>
1414
<html-include src="footer.html"/>
1515
</body>

src/transforms/template-data.js

+16-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ const TEMPLATE_REGEX = /\{\{\s*([\w\.\[\]]+)(?:\((.*)\))?(?:\s*\|\s([a-zA-Z*]\w*
88
const JSON_PATH_REGEX = /^[a-zA-Z_]\w*((?:\.\w+)|(?:\[\d+\]))*$/
99
const JSON_PATH_TOKEN = /(^[a-zA-Z_]\w*)|(\.[a-zA-Z_]\w*)|(\[\d+\])/g
1010

11+
function mergeMaps(map1, map2) {
12+
return new Map([...map1, ...map2]);
13+
}
14+
15+
function htmlEscape(input) {
16+
return input?.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
17+
}
18+
1119
/**
1220
* Poor girl's jsonpath
1321
*
@@ -59,7 +67,11 @@ export function parseArguments(args, data) {
5967
* @returns {(data: any, filters: Map<string, function>) => string} a function that takes a data object and returns the processed template
6068
*/
6169
export function template(str) {
62-
return (data, filters) => {
70+
const defaultFilters = new Map();
71+
let isSafe = false;
72+
defaultFilters.set('safe', (input) => { isSafe = true; return input; })
73+
return (data, providedFilters) => {
74+
const filters = mergeMaps(defaultFilters || new Map(), providedFilters || new Map())
6375
return str.replace(TEMPLATE_REGEX, (_, expr, params, filter, filterParams) => {
6476
let result = dataPath(expr)(data);
6577
const args = parseArguments(params, data);
@@ -73,7 +85,7 @@ export function template(str) {
7385
const filterArgs = parseArguments(filterParams, data);
7486
result = filters.get(filter)(result, ...filterArgs);
7587
}
76-
return result;
88+
return isSafe ? result : htmlEscape(result);
7789
});
7890
}
7991
}
@@ -123,11 +135,12 @@ export async function handleTemplateFile(config, data, inputFile) {
123135
const l = await handleTemplateFile(config,
124136
{...fileData, content: fileContent, layout: null}, layoutFilePath);
125137
if (l) {
126-
fileContent = l.content;;
138+
fileContent = l.content;
127139
} else {
128140
throw new Error('Layout not found:' + layoutFilePath);
129141
}
130142
}
131143

132144
return {content: fileContent, filename: outputFile};
133145
}
146+

0 commit comments

Comments
 (0)