edge-fragment
Version:
Add ability to render fragments from Edge template engine
90 lines (85 loc) • 2.62 kB
JavaScript
// src/provider.ts
import edge2 from "edge.js";
// src/fragment_tag.ts
var fragmentTag = {
block: true,
seekable: true,
tagName: "fragment",
compile(parser, buffer, token) {
token.children.forEach((child) => {
parser.processToken(child, buffer);
});
}
};
// src/renderer.ts
import edge from "edge.js";
// src/utils.ts
function extractFragment(content, sectionName) {
const lines = content.split("\n").map((x) => x.trim());
const found = lines.findIndex(
(item) => item.startsWith(`@fragment("${sectionName}")`) || item.startsWith(`@fragment('${sectionName}')`)
);
if (found < 0) {
throw new Error(`Fragment ${sectionName} not found`);
}
let endCount = 1;
let fragmentEnd = -1;
for (const [i, line] of lines.slice(found + 1).entries()) {
const isEnd = line.startsWith("@end");
const isSelfClosedComponent = line.startsWith("@!");
const isComponent = line.startsWith("@");
if (isEnd) {
endCount -= 1;
} else if (isComponent && !isSelfClosedComponent) {
endCount += 1;
}
if (endCount === 0) {
fragmentEnd = i;
break;
}
}
if (endCount !== 0) {
throw new Error("Unbalanced edge template");
}
if (fragmentEnd === -1) {
fragmentEnd = lines.length - 1;
}
return lines.slice(found + 1, found + fragmentEnd + 1).join("\n");
}
// src/renderer.ts
var enrichRenderer = (renderer) => {
const { render, renderSync, renderRaw, renderRawSync } = renderer;
renderer.render = async function(combinedPath, state) {
const [templatePath, fragmentName] = combinedPath.split("#");
if (fragmentName) {
const rawTemplate = edge.loader.resolve(templatePath).template;
const extracted = extractFragment(rawTemplate, fragmentName);
return renderRaw.apply(renderer, [extracted, state]);
}
return render.apply(renderer, [templatePath, state]);
};
renderer.renderSync = function(combinedPath, state) {
const [templatePath, fragmentName] = combinedPath.split("#");
if (fragmentName) {
const rawTemplate = edge.loader.resolve(templatePath).template;
const extracted = extractFragment(rawTemplate, fragmentName);
return renderRawSync.apply(renderer, [extracted, state]);
}
return renderSync.apply(renderer, [templatePath, state]);
};
return renderer;
};
// src/provider.ts
var EdgeFragmentServiceProvider = class {
constructor(app) {
this.app = app;
}
async boot() {
edge2.registerTag(fragmentTag);
edge2.onRender(enrichRenderer);
}
};
export {
EdgeFragmentServiceProvider as default
};
//# sourceMappingURL=provider.js.map