import { Injectable } from '@angular/core'; declare const Handlebars: any; @Injectable({ providedIn: 'root' }) export class HbsRenderService { private handlebarsInstance: any; constructor() { this.initializeHandlebars(); } private initializeHandlebars() { // Create a new Handlebars instance for the playground this.handlebarsInstance = Handlebars.create(); // Register common helpers used in Compodoc templates this.registerHelpers(); } private registerHelpers() { // Register the 'compare' helper this.handlebarsInstance.registerHelper('compare', (left: any, operator: string, right: any, options: any) => { let result; switch (operator) { case '===': result = left === right; break; case '!==': result = left !== right; break; case '<': result = left < right; break; case '>': result = left > right; break; case '<=': result = left <= right; break; case '>=': result = left >= right; break; default: result = false; } return result ? options.fn(this) : options.inverse(this); }); // Register the 'unless' helper this.handlebarsInstance.registerHelper('unless', (conditional: any, options: any) => { return !conditional ? options.fn(this) : options.inverse(this); }); // Register the 'each' helper with index this.handlebarsInstance.registerHelper('each', (context: any, options: any) => { let ret = ''; for (let i = 0; i < context.length; i++) { ret += options.fn(context[i], { data: { index: i } }); } return ret; }); // Register the 'if' helper this.handlebarsInstance.registerHelper('if', (conditional: any, options: any) => { return conditional ? options.fn(this) : options.inverse(this); }); // Register the 'relativeURL' helper this.handlebarsInstance.registerHelper('relativeURL', (depth: number, page?: string) => { let url = ''; for (let i = 0; i < depth; i++) { url += '../'; } return url + (page || ''); }); // Register the 't' helper for translations this.handlebarsInstance.registerHelper('t', (key: string) => { // Simple translation mapping for preview const translations: { [key: string]: string } = { 'info': 'Information', 'source': 'Source', 'example': 'Example', 'template': 'Template', 'styles': 'Styles', 'component': 'Component', 'module': 'Module', 'overview': 'Overview', 'components': 'Components', 'modules': 'Modules', 'file': 'File', 'description': 'Description', 'selector': 'Selector', 'properties': 'Properties', 'methods': 'Methods', 'inputs': 'Inputs', 'outputs': 'Outputs' }; return translations[key] || key; }); // Register the 'orLength' helper this.handlebarsInstance.registerHelper('orLength', (...args: any[]) => { const options = args[args.length - 1]; const values = args.slice(0, -1); for (const value of values) { if (value && value.length && value.length > 0) { return options.fn(this); } } return options.inverse(this); }); // Register the 'isTabEnabled' helper this.handlebarsInstance.registerHelper('isTabEnabled', (navTabs: any[], tabId: string, options: any) => { const tab = navTabs && navTabs.find((t: any) => t.id === tabId); return tab ? options.fn(this) : options.inverse(this); }); // Register the 'isInitialTab' helper this.handlebarsInstance.registerHelper('isInitialTab', (navTabs: any[], tabId: string, options: any) => { const isInitial = navTabs && navTabs.length > 0 && navTabs[0].id === tabId; return isInitial ? options.fn(this) : options.inverse(this); }); } renderTemplate(templateContent: string, data: any): string { try { // Create a complete HTML document for preview const template = this.handlebarsInstance.compile(templateContent); const rendered = template({ data }); // Wrap in a basic HTML structure for preview return `
Error: ${error.message}
Please check your template syntax and try again.