A minimal, blazing fast JavaScript template engine for hackers.
+import { template } from 'micro-template';
-
-const result = template('<div><%= message %></div>', { message: 'Hello, inline!' });
-console.log(result); // <div>Hello, inline!</div>
-
- <script type="application/x-template" id="tmpl1">
@@ -200,6 +200,7 @@ In HTML
npm install micro-template
import fs from 'node:fs';
import { template } from 'micro-template';
diff --git a/lib/micro-template.js b/lib/micro-template.js
index b92496f..665c947 100644
--- a/lib/micro-template.js
+++ b/lib/micro-template.js
@@ -10,19 +10,19 @@ const template = function (id, data) {
let line = 1;
const body = (
`try {` +
- (me.variable ? `let ${me.variable}=__this.stash;` : ``) +
+ (me.variable ? `let ${me.variable}=__this.stash;__this.ret+=\`` : `__this.ret+=\``) +
string.trim().split(/(<%.+?%>)/g).map(part =>
- part.startsWith('<%=raw') && part.endsWith('%>') ? `/*raw*/__this.ret+=(${part.slice(6, -2)});` :
- part.startsWith('<%=') && part.endsWith('%>') ? `/*=*/__this.ret+=__this.escapeHTML(${part.slice(3, -2)});` :
- part.startsWith('<%') && part.endsWith('%>') ? `/* */${part.slice(2, -2)};` :
+ part.startsWith('<%=raw') && part.endsWith('%>') ? `\${/*raw*/(${part.slice(6, -2)})}` :
+ part.startsWith('<%=') && part.endsWith('%>') ? `\${/*=*/__this.escapeHTML(${part.slice(3, -2)})}` :
+ part.startsWith('<%') && part.endsWith('%>') ? `\`;/* */${part.slice(2, -2)};__this.ret+=\`` :
(
part = part.replace(/\\/g, "\\\\")
.replace(/'/g, "\\'")
- .replace(/\n|\r\n/g, () => `';\n__this.line=${++line};__this.ret+='\\n`),
- part ? `/*+*/__this.ret+='${part}';` : ''
+ .replace(/\n|\r\n/g, () => `\n\${__this.line=${++line},''}`),
+ part ? part : ''
)
).join('') +
- `/*end*/ return __this.ret;` +
+ `\`;/*end*/ return __this.ret;` +
`} catch (e) { throw new Error('TemplateError: '+e+' (on ${name} line ' + __this.line + ')',{cause:e}); }` +
`//# sourceURL=${name}\n` +
`//# sourceMappingURL=data:application/json,${encodeURIComponent(JSON.stringify({version:3, file:name, sources:[`${name}.ejs`], sourcesContent:[string], mappings:";;AAAA;"+Array(line-1).fill('AACA').join(';')}))}`