{"version":3,"file":"koobiq-components-markdown.mjs","sources":["../../../packages/components/markdown/markdown.values.ts","../../../packages/components/markdown/markdown.service.ts","../../../packages/components/markdown/markdown.component.ts","../../../packages/components/markdown/markdown.module.ts","../../../packages/components/markdown/koobiq-components-markdown.ts"],"sourcesContent":["/** @docs-private */\nexport const MARKDOWN_TAGS_TO_CLASS_ALIAS = [\n    'a',\n    'blockquote',\n    'h1',\n    'h2',\n    'h3',\n    'h4',\n    'h5',\n    'h6',\n    'hr',\n    'li',\n    'ol',\n    'table',\n    'tbody',\n    'thead',\n    'td',\n    'tr',\n    'ul',\n    'pre',\n    'code',\n    'img'\n];\n\n/**\n * separating `th` and `p` to prevent it's conflict with `thead` and `pre`\n *\n * @docs-private\n */\nexport const MARKDOWN_WHOLE_TAGS_TO_CLASS_ALIAS = [\n    'th',\n    'p'\n];\n\n/** @docs-private */\nexport const CLASS_PREFIX: string = 'kbq-markdown';\n","import { Injectable } from '@angular/core';\nimport { marked, MarkedOptions } from 'marked';\nimport { CLASS_PREFIX, MARKDOWN_TAGS_TO_CLASS_ALIAS, MARKDOWN_WHOLE_TAGS_TO_CLASS_ALIAS } from './markdown.values';\n\n/**\n * Service for converting Markdown into HTML.\n */\n@Injectable()\nexport class KbqMarkdownService {\n    /**\n     * Converts a given Markdown string into HTML.\n     * NOTE! Method does not sanitize the output HTML string.\n     *\n     * @param markdown - The Markdown string to be converted.\n     * @param options - Optional MarkedOptions to customize the parsing behavior.\n     * @returns The transformed HTML string.\n     */\n    parseToHtml(markdown: string, options?: MarkedOptions): string {\n        return this.transform(<string>marked.parse(markdown, options));\n    }\n\n    private transform(htmlContent: string): string {\n        let transformed = htmlContent;\n\n        MARKDOWN_TAGS_TO_CLASS_ALIAS.forEach((tag) => {\n            transformed = transformed.replace(new RegExp(`<${tag}`, 'g'), (_match: string) => {\n                if (tag === 'a') {\n                    return `<${tag} class=\"${CLASS_PREFIX}__${tag} kbq-link kbq-text-only kbq-link_use-visited\"`;\n                }\n\n                return `<${tag} class=\"${CLASS_PREFIX}__${tag}\"`;\n            });\n        });\n\n        MARKDOWN_WHOLE_TAGS_TO_CLASS_ALIAS.forEach((tag) => {\n            transformed = transformed.replace(\n                new RegExp(`<${tag}\\s*>`, 'g'),\n                (_match: string) => `<${tag} class=\"${CLASS_PREFIX}__${tag}\">`\n            );\n        });\n\n        return transformed;\n    }\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport {\n    afterNextRender,\n    ChangeDetectionStrategy,\n    Component,\n    effect,\n    ElementRef,\n    inject,\n    Inject,\n    InjectionToken,\n    Input,\n    OnDestroy,\n    Optional,\n    Provider,\n    signal,\n    ViewChild,\n    ViewEncapsulation\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { MarkedOptions } from 'marked';\nimport { KbqMarkdownService } from './markdown.service';\n\n/** List of options for `marked` library. */\nexport const KBQ_MARKDOWN_MARKED_OPTIONS = new InjectionToken<MarkedOptions>('KBQ_MARKDOWN_MARKED_OPTIONS');\n\n/** Utility provider for `KBQ_MARKDOWN_MARKED_OPTIONS`. */\nexport const kbqMarkdownMarkedOptionsProvider = (options: MarkedOptions): Provider => ({\n    provide: KBQ_MARKDOWN_MARKED_OPTIONS,\n    useValue: options\n});\n\n/** Component which allows to convert `Markdown` into `HTML` */\n@Component({\n    selector: 'kbq-markdown',\n    // no need format line with ng-content it's broke textContent for markdownService.parseToHtml()\n    template: `\n        <pre #contentWrapper class=\"kbq-markdown__input\" ngPreserveWhitespaces><ng-content /></pre>\n        <div #outputWrapper class=\"kbq-markdown__output\" [innerHtml]=\"resultHtml()\"></div>\n    `,\n    styleUrls: ['./markdown.scss', 'markdown-tokens.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {\n        class: 'kbq-markdown'\n    }\n})\nexport class KbqMarkdown implements OnDestroy {\n    @ViewChild('contentWrapper', { static: true }) private readonly contentWrapper: ElementRef<HTMLPreElement>;\n    @ViewChild('outputWrapper', { static: true }) private readonly outputWrapper: ElementRef<HTMLDivElement>;\n\n    protected resultHtml = signal<SafeHtml | null>(null);\n\n    /** `Markdown` text. */\n    @Input()\n    get markdownText(): string | null {\n        return this._markdownText;\n    }\n\n    set markdownText(value: string | null) {\n        if (value && this.markdownText !== value) {\n            this.resultHtml.set(this.getResultHTML(value));\n        }\n\n        this._markdownText = value;\n    }\n\n    private _markdownText: string | null = null;\n    private readonly focusMonitor = inject(FocusMonitor);\n    private readonly links: HTMLAnchorElement[] = [];\n\n    constructor(\n        private readonly markdownService: KbqMarkdownService,\n        private sanitizer: DomSanitizer,\n        @Optional() @Inject(KBQ_MARKDOWN_MARKED_OPTIONS) private readonly markedOptions?: MarkedOptions | undefined\n    ) {\n        afterNextRender(() => {\n            if (!this.markdownText && this.contentWrapper?.nativeElement.textContent) {\n                this.resultHtml.set(this.getResultHTML(this.contentWrapper?.nativeElement.textContent));\n            }\n        });\n\n        effect(() => {\n            if (this.resultHtml()) {\n                Promise.resolve().then(() => this.startMonitoringLinks());\n            } else {\n                this.stopMonitoringLinks();\n            }\n        });\n    }\n\n    ngOnDestroy(): void {\n        this.stopMonitoringLinks();\n    }\n\n    private getResultHTML(markdown: string): SafeHtml {\n        return this.sanitizer.bypassSecurityTrustHtml(this.markdownService.parseToHtml(markdown, this.markedOptions));\n    }\n\n    private startMonitoringLinks(): void {\n        this.stopMonitoringLinks();\n        this.outputWrapper.nativeElement.querySelectorAll<HTMLAnchorElement>('.kbq-markdown__a').forEach((link) => {\n            this.links.push(link);\n            this.focusMonitor.monitor(link, true);\n        });\n    }\n\n    private stopMonitoringLinks(): void {\n        this.links.forEach((link) => this.focusMonitor.stopMonitoring(link));\n        this.links.length = 0;\n    }\n}\n","import { NgModule } from '@angular/core';\nimport { KbqMarkdown } from './markdown.component';\nimport { KbqMarkdownService } from './markdown.service';\n\nconst COMPONENTS = [\n    KbqMarkdown\n];\n\n@NgModule({\n    imports: COMPONENTS,\n    exports: COMPONENTS,\n    providers: [KbqMarkdownService]\n})\nexport class KbqMarkdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}