ngx-highlightjs
Version:
Instant code highlighting, auto-detect language, super easy to use.
1 lines • 24.7 kB
Source Map (JSON)
{"version":3,"file":"ngx-highlightjs-line-numbers.mjs","sources":["../../../projects/ngx-highlightjs/line-numbers/src/line-numbers-lib.ts","../../../projects/ngx-highlightjs/line-numbers/src/line-numbers.ts","../../../projects/ngx-highlightjs/line-numbers/src/ngx-highlightjs-line-numbers.ts"],"sourcesContent":["export function activateLineNumbers() {\r\n const w: any = window;\r\n const d: Document = document;\r\n\r\n const TABLE_NAME: string = 'hljs-ln',\r\n LINE_NAME: string = 'hljs-ln-line',\r\n CODE_BLOCK_NAME: string = 'hljs-ln-code',\r\n NUMBERS_BLOCK_NAME: string = 'hljs-ln-numbers',\r\n NUMBER_LINE_NAME: string = 'hljs-ln-n',\r\n DATA_ATTR_NAME: string = 'data-line-number',\r\n BREAK_LINE_REGEXP: RegExp = /\\r\\n|\\r|\\n/g;\r\n\r\n if (w.hljs) {\r\n w.hljs.initLineNumbersOnLoad = initLineNumbersOnLoad;\r\n w.hljs.lineNumbersBlock = lineNumbersBlock;\r\n w.hljs.lineNumbersValue = lineNumbersValue;\r\n\r\n addStyles();\r\n } else {\r\n w.console.error('highlight.js not detected!');\r\n }\r\n\r\n function isHljsLnCodeDescendant(domElt): boolean {\r\n let curElt = domElt;\r\n while (curElt) {\r\n if (curElt.className && curElt.className.indexOf('hljs-ln-code') !== -1) {\r\n return true;\r\n }\r\n curElt = curElt.parentNode;\r\n }\r\n return false;\r\n }\r\n\r\n function getHljsLnTable(hljsLnDomElt) {\r\n let curElt = hljsLnDomElt;\r\n while (curElt.nodeName !== 'TABLE') {\r\n curElt = curElt.parentNode;\r\n }\r\n return curElt;\r\n }\r\n\r\n // Function to workaround a copy issue with Microsoft Edge.\r\n // Due to hljs-ln wrapping the lines of code inside a <table> element,\r\n // itself wrapped inside a <pre> element, window.getSelection().toString()\r\n // does not contain any line breaks. So we need to get them back using the\r\n // rendered code in the DOM as reference.\r\n function edgeGetSelectedCodeLines(selection) {\r\n // current selected text without line breaks\r\n const selectionText = selection.toString();\r\n\r\n // get the <td> element wrapping the first line of selected code\r\n let tdAnchor = selection.anchorNode;\r\n while (tdAnchor.nodeName !== 'TD') {\r\n tdAnchor = tdAnchor.parentNode;\r\n }\r\n\r\n // get the <td> element wrapping the last line of selected code\r\n let tdFocus = selection.focusNode;\r\n while (tdFocus.nodeName !== 'TD') {\r\n tdFocus = tdFocus.parentNode;\r\n }\r\n\r\n // extract line numbers\r\n let firstLineNumber = parseInt(tdAnchor.dataset.lineNumber);\r\n let lastLineNumber = parseInt(tdFocus.dataset.lineNumber);\r\n\r\n // multi-lines copied case\r\n if (firstLineNumber != lastLineNumber) {\r\n\r\n let firstLineText = tdAnchor.textContent;\r\n let lastLineText = tdFocus.textContent;\r\n\r\n // if the selection was made backward, swap values\r\n if (firstLineNumber > lastLineNumber) {\r\n let tmp = firstLineNumber;\r\n firstLineNumber = lastLineNumber;\r\n lastLineNumber = tmp;\r\n tmp = firstLineText;\r\n firstLineText = lastLineText;\r\n lastLineText = tmp;\r\n }\r\n\r\n // discard not copied characters in first line\r\n while (selectionText.indexOf(firstLineText) !== 0) {\r\n firstLineText = firstLineText.slice(1);\r\n }\r\n\r\n // discard not copied characters in last line\r\n while (selectionText.lastIndexOf(lastLineText) === -1) {\r\n lastLineText = lastLineText.slice(0, -1);\r\n }\r\n\r\n // reconstruct and return the real copied text\r\n let selectedText = firstLineText;\r\n const hljsLnTable = getHljsLnTable(tdAnchor);\r\n for (let i: number = firstLineNumber + 1; i < lastLineNumber; ++i) {\r\n const codeLineSel = format('.{0}[{1}=\"{2}\"]', [CODE_BLOCK_NAME, DATA_ATTR_NAME, i]);\r\n const codeLineElt = hljsLnTable.querySelector(codeLineSel);\r\n selectedText += '\\n' + codeLineElt.textContent;\r\n }\r\n selectedText += '\\n' + lastLineText;\r\n return selectedText;\r\n // single copied line case\r\n } else {\r\n return selectionText;\r\n }\r\n }\r\n\r\n // ensure consistent code copy/paste behavior across all browsers\r\n // (see https://github.com/wcoder/highlightjs-line-numbers.js/issues/51)\r\n document.addEventListener('copy', function (e: ClipboardEvent) {\r\n // get current selection\r\n const selection: Selection = window.getSelection();\r\n // override behavior when one wants to copy line of codes\r\n if (isHljsLnCodeDescendant(selection.anchorNode)) {\r\n let selectionText;\r\n // workaround an issue with Microsoft Edge as copied line breaks\r\n // are removed otherwise from the selection string\r\n if (window.navigator.userAgent.indexOf('Edge') !== -1) {\r\n selectionText = edgeGetSelectedCodeLines(selection);\r\n } else {\r\n // other browsers can directly use the selection string\r\n selectionText = selection.toString();\r\n }\r\n e.clipboardData.setData('text/plain', selectionText);\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n function addStyles() {\r\n const css: HTMLStyleElement = d.createElement('style');\r\n css.type = 'text/css';\r\n css.innerHTML = format(\r\n '.{0}{border-collapse:collapse}' +\r\n '.{0} td{padding:0}' +\r\n '.{1}:before{content:attr({2})}',\r\n [\r\n TABLE_NAME,\r\n NUMBER_LINE_NAME,\r\n DATA_ATTR_NAME\r\n ]);\r\n d.getElementsByTagName('head')[0].appendChild(css);\r\n }\r\n\r\n function initLineNumbersOnLoad(options) {\r\n if (d.readyState === 'interactive' || d.readyState === 'complete') {\r\n documentReady(options);\r\n } else {\r\n w.addEventListener('DOMContentLoaded', function () {\r\n documentReady(options);\r\n });\r\n }\r\n }\r\n\r\n function documentReady(options): void {\r\n try {\r\n const blocks: NodeListOf<Element> = d.querySelectorAll('code.hljs,code.nohighlight');\r\n\r\n for (const i in blocks) {\r\n if (blocks.hasOwnProperty(i)) {\r\n if (!isPluginDisabledForBlock(blocks[i])) {\r\n lineNumbersBlock(blocks[i], options);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n w.console.error('LineNumbers error: ', e);\r\n }\r\n }\r\n\r\n function isPluginDisabledForBlock(element) {\r\n return element.classList.contains('nohljsln');\r\n }\r\n\r\n function lineNumbersBlock(element, options) {\r\n if (typeof element !== 'object') {\r\n return;\r\n }\r\n\r\n async(function () {\r\n element.innerHTML = lineNumbersInternal(element, options);\r\n });\r\n }\r\n\r\n function lineNumbersValue(value, options) {\r\n if (typeof value !== 'string') {\r\n return;\r\n }\r\n\r\n const element: HTMLElement = document.createElement('code');\r\n element.innerHTML = value;\r\n\r\n return lineNumbersInternal(element, options);\r\n }\r\n\r\n function lineNumbersInternal(element, options) {\r\n\r\n const internalOptions = mapOptions(element, options);\r\n\r\n duplicateMultilineNodes(element);\r\n\r\n return addLineNumbersBlockFor(element.innerHTML, internalOptions);\r\n }\r\n\r\n function addLineNumbersBlockFor(inputHtml, options) {\r\n const lines = getLines(inputHtml);\r\n\r\n // if last line contains only carriage return remove it\r\n if (lines[lines.length - 1].trim() === '') {\r\n lines.pop();\r\n }\r\n\r\n if (lines.length > 1 || options.singleLine) {\r\n let html = '';\r\n\r\n for (let i = 0, l = lines.length; i < l; i++) {\r\n html += format(\r\n '<tr>' +\r\n '<td class=\"{0} {1}\" {3}=\"{5}\">' +\r\n '<div class=\"{2}\" {3}=\"{5}\"></div>' +\r\n '</td>' +\r\n '<td class=\"{0} {4}\" {3}=\"{5}\">' +\r\n '{6}' +\r\n '</td>' +\r\n '</tr>',\r\n [\r\n LINE_NAME,\r\n NUMBERS_BLOCK_NAME,\r\n NUMBER_LINE_NAME,\r\n DATA_ATTR_NAME,\r\n CODE_BLOCK_NAME,\r\n i + options.startFrom,\r\n lines[i].length > 0 ? lines[i] : ' '\r\n ]);\r\n }\r\n\r\n return format('<table class=\"{0}\">{1}</table>', [TABLE_NAME, html]);\r\n }\r\n\r\n return inputHtml;\r\n }\r\n\r\n /**\r\n * @param {HTMLElement} element Code block.\r\n * @param {Object} options External API options.\r\n * @returns {Object} Internal API options.\r\n */\r\n function mapOptions(element, options) {\r\n options = options || {};\r\n return {\r\n singleLine: getSingleLineOption(options),\r\n startFrom: getStartFromOption(element, options)\r\n };\r\n }\r\n\r\n function getSingleLineOption(options) {\r\n const defaultValue: boolean = false;\r\n if (options.singleLine) {\r\n return options.singleLine;\r\n }\r\n return defaultValue;\r\n }\r\n\r\n function getStartFromOption(element, options) {\r\n const defaultValue: number = 1;\r\n let startFrom: number = defaultValue;\r\n\r\n if (isFinite(options.startFrom)) {\r\n startFrom = options.startFrom;\r\n }\r\n\r\n // can be overridden because local option is priority\r\n const value = getAttribute(element, 'data-ln-start-from');\r\n if (value !== null) {\r\n startFrom = toNumber(value, defaultValue);\r\n }\r\n\r\n return startFrom;\r\n }\r\n\r\n /**\r\n * Recursive method for fix multi-line elements implementation in highlight.js\r\n * Doing deep passage on child nodes.\r\n * @param {HTMLElement} element\r\n */\r\n function duplicateMultilineNodes(element) {\r\n const nodes = element.childNodes;\r\n for (const node in nodes) {\r\n if (nodes.hasOwnProperty(node)) {\r\n const child = nodes[node];\r\n if (getLinesCount(child.textContent) > 0) {\r\n if (child.childNodes.length > 0) {\r\n duplicateMultilineNodes(child);\r\n } else {\r\n duplicateMultilineNode(child.parentNode);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Method for fix multi-line elements implementation in highlight.js\r\n * @param {HTMLElement} element\r\n */\r\n function duplicateMultilineNode(element) {\r\n const className = element.className;\r\n\r\n if (!/hljs-/.test(className)) {\r\n return;\r\n }\r\n\r\n const lines = getLines(element.innerHTML);\r\n let result: string = '';\r\n\r\n for (let i: number = 0; i < lines.length; i++) {\r\n const lineText = lines[i].length > 0 ? lines[i] : ' ';\r\n result += format('<span class=\"{0}\">{1}</span>\\n', [className, lineText]);\r\n }\r\n\r\n element.innerHTML = result.trim();\r\n }\r\n\r\n function getLines(text) {\r\n if (text.length === 0) {\r\n return [];\r\n }\r\n return text.split(BREAK_LINE_REGEXP);\r\n }\r\n\r\n function getLinesCount(text) {\r\n return (text.trim().match(BREAK_LINE_REGEXP) || []).length;\r\n }\r\n\r\n ///\r\n /// HELPERS\r\n ///\r\n\r\n function async(func) {\r\n w.setTimeout(func, 0);\r\n }\r\n\r\n /**\r\n * {@link https://wcoder.github.io/notes/string-format-for-string-formating-in-javascript}\r\n * @param {string} format\r\n * @param {array} args\r\n */\r\n function format(format, args) {\r\n return format.replace(/\\{(\\d+)\\}/g, function (m, n) {\r\n return args[n] !== undefined ? args[n] : m;\r\n });\r\n }\r\n\r\n /**\r\n * @param {HTMLElement} element Code block.\r\n * @param {String} attrName Attribute name.\r\n * @returns {String} Attribute value or empty.\r\n */\r\n function getAttribute(element, attrName) {\r\n return element.hasAttribute(attrName) ? element.getAttribute(attrName) : null;\r\n }\r\n\r\n /**\r\n * @param {String} str Source string.\r\n * @param {Number} fallback Fallback value.\r\n * @returns Parsed number or fallback value.\r\n */\r\n function toNumber(str, fallback) {\r\n if (!str) {\r\n return fallback;\r\n }\r\n const number: number = Number(str);\r\n return isFinite(number) ? number : fallback;\r\n }\r\n}\r\n","import {\r\n Directive,\r\n inject,\r\n numberAttribute,\r\n booleanAttribute,\r\n afterRenderEffect,\r\n input,\r\n ElementRef,\r\n InputSignalWithTransform\r\n} from '@angular/core';\r\nimport { HIGHLIGHT_OPTIONS, HighlightJS, HighlightBase, LineNumbersOptions } from 'ngx-highlightjs';\r\n\r\n@Directive({\r\n selector: '[highlight][lineNumbers], [highlightAuto][lineNumbers]'\r\n})\r\nexport class HighlightLineNumbers {\r\n\r\n private readonly options: LineNumbersOptions = inject(HIGHLIGHT_OPTIONS)?.lineNumbersOptions;\r\n private readonly _hljs: HighlightJS = inject(HighlightJS);\r\n private readonly _highlight: HighlightBase = inject(HighlightBase);\r\n private readonly _nativeElement: HTMLElement = inject(ElementRef<HTMLElement>).nativeElement;\r\n\r\n // Temp observer to observe when line numbers has been added to code element\r\n private _lineNumbersObs: MutationObserver;\r\n\r\n readonly startFrom: InputSignalWithTransform<number, unknown> = input<number, unknown>(this.options?.startFrom, {\r\n transform: numberAttribute\r\n });\r\n\r\n readonly singleLine: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(this.options?.singleLine, {\r\n transform: booleanAttribute\r\n });\r\n\r\n constructor() {\r\n afterRenderEffect({\r\n write: () => {\r\n if (this._highlight.highlightResult()) {\r\n this.addLineNumbers();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private addLineNumbers(): void {\r\n // Clean up line numbers observer\r\n this.destroyLineNumbersObserver();\r\n requestAnimationFrame(async () => {\r\n // Add line numbers\r\n await this._hljs.lineNumbersBlock(this._nativeElement, {\r\n startFrom: this.startFrom(),\r\n singleLine: this.singleLine()\r\n });\r\n // If lines count is 1, the line numbers library will not add numbers\r\n // Observe changes to add 'hljs-line-numbers' class only when line numbers is added to the code element\r\n this._lineNumbersObs = new MutationObserver(() => {\r\n if (this._nativeElement.firstElementChild?.tagName.toUpperCase() === 'TABLE') {\r\n this._nativeElement.classList.add('hljs-line-numbers');\r\n }\r\n this.destroyLineNumbersObserver();\r\n });\r\n this._lineNumbersObs.observe(this._nativeElement, { childList: true });\r\n });\r\n }\r\n\r\n private destroyLineNumbersObserver(): void {\r\n if (this._lineNumbersObs) {\r\n this._lineNumbersObs.disconnect();\r\n this._lineNumbersObs = null;\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}