UNPKG

@cisstech/nge

Version:

NG Essentials is a collection of libraries for Angular developers.

110 lines 14.8 kB
import { Inject, Injectable, Optional } from '@angular/core'; import { marked } from 'marked'; import { NGE_MARKDOWN_CONFIG } from './nge-markdown-config'; import { NgeMarkdownTransformer } from './nge-markdown-transformer'; import { lastValueFrom } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@cisstech/nge/services"; const WINDOW = window; /** * Markdown compiler service. */ export class NgeMarkdownService { constructor(config, resourceLoader) { this.config = config; this.resourceLoader = resourceLoader; this.config = config || {}; } /** * Compiles a markdown string to an html string. * @param options compilation options. * @returns A promise that resolve with the AST of the compiled markdown * (with the modifications of the contributions). */ async compile(options) { let markdown = this.trimIndent(options.markdown); if (options.isHtmlString) { markdown = this.decodeHtml(markdown); } const transformer = await this.createTransformer(options); const renderer = this.renderer(transformer); const tokenizer = this.tokenizer(transformer); const markedOptions = { gfm: true, ...this.config, renderer, tokenizer, }; markdown = transformer.transformMarkdown(markdown); const tokens = transformer.transformAst(marked.lexer(markdown, markedOptions)); options.target.innerHTML = marked.parser(tokens, markedOptions); transformer.transformHTML(options.target); return tokens; } async createTransformer(options) { const contributions = [...(options.contributions || [])]; const transformer = new NgeMarkdownTransformer(this.config); const dependencies = []; for (const contrib of contributions) { if (contrib.dependencies) { dependencies.push(...contrib.dependencies()); } contrib.contribute(transformer); } // Try to fix the issues described here by loading monaco editor // after all the other scripts. // https://stackoverflow.com/a/33635881 // https://github.com/microsoft/monaco-editor/issues/662 // https://github.com/microsoft/monaco-editor/issues/1249 const define = WINDOW.define; WINDOW.define = undefined; await lastValueFrom(this.resourceLoader.loadAllSync(dependencies)); WINDOW.define = define; return transformer; } renderer(transformer) { const renderer = transformer.transformRenderer(this.config?.renderer || new marked.Renderer()); return renderer; } tokenizer(transformer) { return transformer.transformTokenizer(this.config?.tokenizer || new marked.Tokenizer()); } decodeHtml(html) { const textarea = document.createElement('textarea'); textarea.innerHTML = html; return textarea.value; } trimIndent(markdown) { if (!markdown) { return ''; } let indentStart; return markdown .split('\n') .map((line) => { let lineIdentStart = indentStart; if (line.length > 0) { lineIdentStart = isNaN(lineIdentStart) ? line.search(/\S|$/) : Math.min(line.search(/\S|$/), lineIdentStart); } if (isNaN(indentStart)) { indentStart = lineIdentStart; } return !!lineIdentStart ? line.substring(lineIdentStart) : line; }) .join('\n'); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownService, deps: [{ token: NGE_MARKDOWN_CONFIG, optional: true }, { token: i1.ResourceLoaderService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NGE_MARKDOWN_CONFIG] }] }, { type: i1.ResourceLoaderService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdlLW1hcmtkb3duLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ2UvbWFya2Rvd24vc3JjL25nZS1tYXJrZG93bi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQWlCLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUU5QyxPQUFPLEVBQXFCLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFFbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQTs7O0FBRXBDLE1BQU0sTUFBTSxHQUFHLE1BQWEsQ0FBQTtBQUU1Qjs7R0FFRztBQUlILE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFHVyxNQUF5QixFQUNqQixjQUFxQztRQUQ3QyxXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUNqQixtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFFdEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFBO0lBQzVCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBa0M7UUFDOUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEQsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekIsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEMsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3pELE1BQU0sUUFBUSxHQUFHLElB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O1lBQ1osSUFBSSxjQUFjLEdBQUcsV0FBVyxDQUFBO1lBQ2hDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1lBQzlHLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUN2QixXQUFXLEdBQUcsY0FBYyxDQUFBO1lBQzlCLENBQUM7WUFDRCxPQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUNqRSxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDZixDQUFDOzhHQXJHVSxrQkFBa0Isa0JBR25CLG1CQUFtQjtrSEFIbEIsa0JBQWtCLGNBRmpCLE1BQU07OzJGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQUdJLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBNYXJrZWRPcHRpb25zLCBtYXJrZWQgfSBmcm9tICdtYXJrZWQnXG5pbXBvcnQgeyBOZ2VNYXJrZG93bkNvbnRyaWJ1dGlvbiB9IGZyb20gJy4vbmdlLW1hcmtkb3duLWNvbnRyaWJ1dGlvbidcbmltcG9ydCB7IE5nZU1hcmtkb3duQ29uZmlnLCBOR0VfTUFSS0RPV05fQ09ORklHIH0gZnJvbSAnLi9uZ2UtbWFya2Rvd24tY29uZmlnJ1xuaW1wb3J0IHsgTmdlTWFya2Rvd25UcmFuc2Zvcm1lciB9IGZyb20gJy4vbmdlLW1hcmtkb3duLXRyYW5zZm9ybWVyJ1xuaW1wb3J0IHsgUmVzb3VyY2VMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnQGNpc3N0ZWNoL25nZS9zZXJ2aWNlcydcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJ1xuXG5jb25zdCBXSU5ET1cgPSB3aW5kb3cgYXMgYW55XG5cbi8qKlxuICogTWFya2Rvd24gY29tcGlsZXIgc2VydmljZS5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE5nZU1hcmtkb3duU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChOR0VfTUFSS0RPV05fQ09ORklHKVxuICAgIHJlYWRvbmx5IGNvbmZpZzogTmdlTWFya2Rvd25Db25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUxvYWRlcjogUmVzb3VyY2VMb2FkZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnIHx8IHt9XG4gIH1cblxuICAvKipcbiAgICogQ29tcGlsZXMgYSBtYXJrZG93biBzdHJpbmcgdG8gYW4gaHRtbCBzdHJpbmcuXG4gICAqIEBwYXJhbSBvcHRpb25zIGNvbXBpbGF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmUgd2l0aCB0aGUgQVNUIG9mIHRoZSBjb21waWxlZCBtYXJrZG93blxuICAgKiAod2l0aCB0aGUgbW9kaWZpY2F0aW9ucyBvZiB0aGUgY29udHJpYnV0aW9ucykuXG4gICAqL1xuICBhc3luYyBjb21waWxlKG9wdGlvbnM6IE5nZU1hcmtkb3duQ29tcGlsZU9wdGlvbnMpIHtcbiAgICBsZXQgbWFya2Rvd24gPSB0aGlzLnRyaW1JbmRlbnQob3B0aW9ucy5tYXJrZG93bilcbiAgICBpZiAob3B0aW9ucy5pc0h0bWxTdHJpbmcpIHtcbiAgICAgIG1hcmtkb3duID0gdGhpcy5kZWNvZGVIdG1sKG1hcmtkb3duKVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gYXdhaXQgdGhpcy5jcmVhdGVUcmFuc2Zvcm1lcihvcHRpb25zKVxuICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcih0cmFuc2Zvcm1lcilcbiAgICBjb25zdCB0b2tlbml6ZXIgPSB0aGlzLnRva2VuaXplcih0cmFuc2Zvcm1lcilcblxuICAgIGNvbnN0IG1hcmtlZE9wdGlvbnM6IE1hcmtlZE9wdGlvbnMgPSB7XG4gICAgICBnZm06IHRydWUsXG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIHJlbmRlcmVyLFxuICAgICAgdG9rZW5pemVyLFxuICAgIH1cblxuICAgIG1hcmtkb3duID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtTWFya2Rvd24obWFya2Rvd24pXG5cbiAgICBjb25zdCB0b2tlbnMgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm1Bc3QobWFya2VkLmxleGVyKG1hcmtkb3duLCBtYXJrZWRPcHRpb25zKSlcblxuICAgIG9wdGlvbnMudGFyZ2V0LmlubmVySFRNTCA9IG1hcmtlZC5wYXJzZXIodG9rZW5zLCBtYXJrZWRPcHRpb25zKVxuXG4gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtSFRNTChvcHRpb25zLnRhcmdldClcblxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlVHJhbnNmb3JtZXIob3B0aW9uczogTmdlTWFya2Rvd25Db21waWxlT3B0aW9ucykge1xuICAgIGNvbnN0IGNvbnRyaWJ1dGlvbnMgPSBbLi4uKG9wdGlvbnMuY29udHJpYnV0aW9ucyB8fCBbXSldXG4gICAgY29uc3QgdHJhbnNmb3JtZXIgPSBuZXcgTmdlTWFya2Rvd25UcmFuc2Zvcm1lcih0aGlzLmNvbmZpZylcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IGFueVtdID0gW11cbiAgICBmb3IgKGNvbnN0IGNvbnRyaWIgb2YgY29udHJpYnV0aW9ucykge1xuICAgICAgaWYgKGNvbnRyaWIuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKC4uLmNvbnRyaWIuZGVwZW5kZW5jaWVzKCkpXG4gICAgICB9XG4gICAgICBjb250cmliLmNvbnRyaWJ1dGUodHJhbnNmb3JtZXIpXG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGZpeCB0aGUgaXNzdWVzIGRlc2NyaWJlZCBoZXJlIGJ5IGxvYWRpbmcgbW9uYWNvIGVkaXRvclxuICAgIC8vIGFmdGVyIGFsbCB0aGUgb3RoZXIgc2NyaXB0cy5cbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzM2MzU4ODFcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L21vbmFjby1lZGl0b3IvaXNzdWVzLzY2MlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvbW9uYWNvLWVkaXRvci9pc3N1ZXMvMTI0OVxuICAgIGNvbnN0IGRlZmluZSA9IFdJTkRPVy5kZWZpbmVcbiAgICBXSU5ET1cuZGVmaW5lID0gdW5kZWZpbmVkXG4gICAgYXdhaXQgbGFzdFZhbHVlRnJvbSh0aGlzLnJlc291cmNlTG9hZGVyLmxvYWRBbGxTeW5jKGRlcGVuZGVuY2llcykpXG4gICAgV0lORE9XLmRlZmluZSA9IGRlZmluZVxuICAgIHJldHVybiB0cmFuc2Zvcm1lclxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJlcih0cmFuc2Zvcm1lcjogTmdlTWFya2Rvd25UcmFuc2Zvcm1lcikge1xuICAgIGNvbnN0IHJlbmRlcmVyID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtUmVuZGVyZXIodGhpcy5jb25maWc/LnJlbmRlcmVyIHx8IG5ldyBtYXJrZWQuUmVuZGVyZXIoKSlcbiAgICByZXR1cm4gcmVuZGVyZXJcbiAgfVxuXG4gIHByaXZhdGUgdG9rZW5pemVyKHRyYW5zZm9ybWVyOiBOZ2VNYXJrZG93blRyYW5zZm9ybWVyKSB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVyLnRyYW5zZm9ybVRva2VuaXplcih0aGlzLmNvbmZpZz8udG9rZW5pemVyIHx8IG5ldyBtYXJrZWQuVG9rZW5pemVyKCkpXG4gIH1cblxuICBwcml2YXRlIGRlY29kZUh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJylcbiAgICB0ZXh0YXJlYS5pbm5lckhUTUwgPSBodG1sXG4gICAgcmV0dXJuIHRleHRhcmVhLnZhbHVlXG4gIH1cblxuICBwcml2YXRlIHRyaW1JbmRlbnQobWFya2Rvd246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFtYXJrZG93bikge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgbGV0IGluZGVudFN0YXJ0OiBudW1iZXJcbiAgICByZXR1cm4gbWFya2Rvd25cbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgbGV0IGxpbmVJZGVudFN0YXJ0ID0gaW5kZW50U3RhcnRcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxpbmVJZGVudFN0YXJ0ID0gaXNOYU4obGluZUlkZW50U3RhcnQpID8gbGluZS5zZWFyY2goL1xcU3wkLykgOiBNYXRoLm1pbihsaW5lLnNlYXJjaCgvXFxTfCQvKSwgbGluZUlkZW50U3RhcnQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmFOKGluZGVudFN0YXJ0KSkge1xuICAgICAgICAgIGluZGVudFN0YXJ0ID0gbGluZUlkZW50U3RhcnRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFsaW5lSWRlbnRTdGFydCA/IGxpbmUuc3Vic3RyaW5nKGxpbmVJZGVudFN0YXJ0KSA6IGxpbmVcbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuJylcbiAgfVxufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgb2YgTmdlTWFya2Rvd25TZXJ2aWNlIGBjb21waWxlYCBtZXRob2QuXG4gKi9cbmludGVyZmFjZSBOZ2VNYXJrZG93bkNvbXBpbGVPcHRpb25zIHtcbiAgLyoqIE1hcmtkb3duIHN0cmluZyB0byBjb21waWxlLiAqL1xuICBtYXJrZG93bjogc3RyaW5nXG4gIC8qKiBIVE1MRWxlbWVudCBvbiB3aGljaCB0byByZW5kZXIgdGhlIGNvbXBpbGVkIG1hcmtkb3duLiAgKi9cbiAgdGFyZ2V0OiBIVE1MRWxlbWVudFxuICAvKiogSXMgdGhlIG1hcmtkb3duIGNvbnRhaW5zIGh0bWwgY29kZT8gKi9cbiAgaXNIdG1sU3RyaW5nPzogYm9vbGVhblxuICAvKiogTGlzdCBvZiBjb250cmlidXRpb24gdG8gdXNlIGR1cmluZyB0aGUgY29tcGlsYXRpb24uICovXG4gIGNvbnRyaWJ1dGlvbnM/OiBOZ2VNYXJrZG93bkNvbnRyaWJ1dGlvbltdXG59XG4iXX0=