{"version":3,"file":"ngx-highlight-js.mjs","sources":["../../lib/src/config.ts","../../lib/src/highlight-js.ts","../../lib/src/ngx-highlight-js.ts"],"sourcesContent":["import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders, Provider } from '@angular/core';\nimport type { HLJSOptions } from 'highlight.js';\n\nexport interface HighlightJsConfig {\n  /**\n   * Specify rendering mode\n   * - `default` Will render each `<pre><code>`\n   * - `simple` Render all content according to `lang` language\n   */\n  mode?: 'default' | 'simple';\n  /**\n   * Uses language detection by default but you can specify the language\n   */\n  lang?: string;\n  /**\n   * Equar [configure(options)](https://highlightjs.readthedocs.io/en/latest/api.html#configure)\n   */\n  options?: Partial<HLJSOptions>;\n}\n\nexport const HIGHLIGHTJS_CONFIG = new InjectionToken<HighlightJsConfig>('HighlightJs-Config');\n\nexport function provideHighlightJsConfig(options: Partial<HighlightJsConfig>): EnvironmentProviders {\n  const provides: (Provider | EnvironmentProviders)[] = [\n    {\n      provide: HIGHLIGHTJS_CONFIG,\n      useValue: {\n        lang: 'html',\n        ...options,\n      } as HighlightJsConfig,\n    },\n  ];\n  return makeEnvironmentProviders(provides);\n}\n","import { Directive, ElementRef, OnDestroy, input, model, inject, afterNextRender } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { NgModel } from '@angular/forms';\nimport { HIGHLIGHTJS_CONFIG } from './config';\nimport type { HLJSApi, HLJSOptions } from 'highlight.js';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\ndeclare const ngDevMode: boolean;\n\n@Directive({\n  selector: '[highlight-js]',\n  host: {\n    '[style.display]': `mode() === 'simple' ? 'none' : null`,\n  },\n  exportAs: 'highlightJs',\n})\nexport class HighlightJsDirective implements OnDestroy {\n  private readonly cog = inject(HIGHLIGHTJS_CONFIG, { optional: true });\n  readonly options = input<Partial<HLJSOptions>>(this.cog?.options ?? {});\n  readonly lang = input<string>(this.cog?.lang ?? 'html');\n  readonly code = model<string>();\n  readonly mode = input<'default' | 'simple'>(this.cog?.mode ?? 'simple');\n\n  protected codeEl?: HTMLElement;\n  protected parentEl?: HTMLElement;\n  private observer?: MutationObserver;\n  private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly ngModel = inject<NgModel>(NgModel, { optional: true });\n  private readonly doc = inject(DOCUMENT);\n\n  constructor() {\n    this.ngModel?.valueChanges?.pipe(takeUntilDestroyed()).subscribe((res) => {\n      this.code.set(this.escapeHTML(res));\n      this.init();\n    });\n\n    afterNextRender(() => {\n      this.init();\n\n      if (!this.ngModel) {\n        this.initMutation();\n      }\n    });\n  }\n\n  private escapeHTML(str: string): string {\n    return (str || '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&apos;');\n  }\n\n  private init(): void {\n    this.destroy();\n    const el = this.el.nativeElement;\n    const code = this.code() ?? '' + el.innerHTML.trim();\n    const doc = this.doc as Document;\n    this.codeEl = doc.createElement(this.mode() === 'default' ? 'div' : 'pre') as HTMLElement;\n    if (this.codeEl == null) return;\n\n    const isSimple = this.mode() === 'simple';\n    if (isSimple) {\n      const lang = this.lang();\n      if (lang) {\n        this.codeEl.className = lang;\n      }\n      this.parentEl = el.parentNode as HTMLElement;\n      this.parentEl.insertBefore(this.codeEl, el.nextSibling);\n    } else {\n      this.parentEl = el;\n      this.parentEl.innerHTML = ``;\n      this.parentEl.appendChild(this.codeEl);\n    }\n    this.codeEl.innerHTML = code;\n    const hljs: HLJSApi = (doc.defaultView as any).hljs;\n    if (hljs == null) {\n      if (typeof ngDevMode === 'undefined' || ngDevMode) {\n        console.warn(`Can't find hljs under window`);\n      }\n      return;\n    }\n\n    hljs.configure({ ...this.options() });\n\n    if (isSimple) {\n      hljs.highlightElement(this.codeEl);\n    } else {\n      this.codeEl.querySelectorAll<HTMLElement>(this.options()?.cssSelector ?? 'pre code').forEach((block) => {\n        hljs.highlightElement(block);\n      });\n    }\n  }\n\n  private destroy(): void {\n    if (this.codeEl && this.parentEl) {\n      this.parentEl.removeChild(this.codeEl);\n      this.codeEl = undefined;\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy();\n    this.observer?.disconnect();\n  }\n\n  private initMutation(): void {\n    if (typeof MutationObserver === 'undefined') {\n      return;\n    }\n    this.observer = new MutationObserver(this.init.bind(this));\n    this.observer.observe(this.el.nativeElement, {\n      characterData: true,\n      childList: true,\n      subtree: true,\n    });\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}