@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
110 lines • 14.8 kB
JavaScript
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=