diff options
author | Patrick McDermott <pj@pehjota.net> | 2017-10-31 04:09:44 (EDT) |
---|---|---|
committer | Patrick McDermott <pj@pehjota.net> | 2017-10-31 04:09:44 (EDT) |
commit | 490c2d20475e8b16136422d3d426b84abb828a23 (patch) | |
tree | 8a96f7932bf3fe969a0dcfc665c8e18f798f44eb /data/resources/prism/plugins/line-numbers/prism-line-numbers.js | |
parent | 3f57a98661ac2fc4c73eab89e1b1590e3c547dba (diff) | |
download | marquee-490c2d20475e8b16136422d3d426b84abb828a23.zip marquee-490c2d20475e8b16136422d3d426b84abb828a23.tar.gz marquee-490c2d20475e8b16136422d3d426b84abb828a23.tar.bz2 |
data/resources/prism/: Import from upstream, HEAD of branch gh-pages
Diffstat (limited to 'data/resources/prism/plugins/line-numbers/prism-line-numbers.js')
-rw-r--r-- | data/resources/prism/plugins/line-numbers/prism-line-numbers.js | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/data/resources/prism/plugins/line-numbers/prism-line-numbers.js b/data/resources/prism/plugins/line-numbers/prism-line-numbers.js new file mode 100644 index 0000000..dea8e3a --- /dev/null +++ b/data/resources/prism/plugins/line-numbers/prism-line-numbers.js @@ -0,0 +1,114 @@ +(function () { + + if (typeof self === 'undefined' || !self.Prism || !self.document) { + return; + } + + /** + * Class name for <pre> which is activating the plugin + * @type {String} + */ + var PLUGIN_CLASS = 'line-numbers'; + + /** + * Resizes line numbers spans according to height of line of code + * @param {Element} element <pre> element + */ + var _resizeElement = function (element) { + var codeStyles = getStyles(element); + var whiteSpace = codeStyles['white-space']; + + if (whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line') { + var codeElement = element.querySelector('code'); + var lineNumbersWrapper = element.querySelector('.line-numbers-rows'); + var lineNumberSizer = element.querySelector('.line-numbers-sizer'); + var codeLines = element.textContent.split('\n'); + + if (!lineNumberSizer) { + lineNumberSizer = document.createElement('span'); + lineNumberSizer.className = 'line-numbers-sizer'; + + codeElement.appendChild(lineNumberSizer); + } + + lineNumberSizer.style.display = 'block'; + + codeLines.forEach(function (line, lineNumber) { + lineNumberSizer.textContent = line || '\n'; + var lineSize = lineNumberSizer.getBoundingClientRect().height; + lineNumbersWrapper.children[lineNumber].style.height = lineSize + 'px'; + }); + + lineNumberSizer.textContent = ''; + lineNumberSizer.style.display = 'none'; + } + }; + + /** + * Returns style declarations for the element + * @param {Element} element + */ + var getStyles = function (element) { + if (!element) { + return null; + } + + return window.getComputedStyle ? getComputedStyle(element) : (element.currentStyle || null); + }; + + window.addEventListener('resize', function () { + Array.prototype.forEach.call(document.querySelectorAll('pre.' + PLUGIN_CLASS), _resizeElement); + }); + + Prism.hooks.add('complete', function (env) { + if (!env.code) { + return; + } + + // works only for <code> wrapped inside <pre> (not inline) + var pre = env.element.parentNode; + var clsReg = /\s*\bline-numbers\b\s*/; + if ( + !pre || !/pre/i.test(pre.nodeName) || + // Abort only if nor the <pre> nor the <code> have the class + (!clsReg.test(pre.className) && !clsReg.test(env.element.className)) + ) { + return; + } + + if (env.element.querySelector(".line-numbers-rows")) { + // Abort if line numbers already exists + return; + } + + if (clsReg.test(env.element.className)) { + // Remove the class "line-numbers" from the <code> + env.element.className = env.element.className.replace(clsReg, ' '); + } + if (!clsReg.test(pre.className)) { + // Add the class "line-numbers" to the <pre> + pre.className += ' line-numbers'; + } + + var match = env.code.match(/\n(?!$)/g); + var linesNum = match ? match.length + 1 : 1; + var lineNumbersWrapper; + + var lines = new Array(linesNum + 1); + lines = lines.join('<span></span>'); + + lineNumbersWrapper = document.createElement('span'); + lineNumbersWrapper.setAttribute('aria-hidden', 'true'); + lineNumbersWrapper.className = 'line-numbers-rows'; + lineNumbersWrapper.innerHTML = lines; + + if (pre.hasAttribute('data-start')) { + pre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1); + } + + env.element.appendChild(lineNumbersWrapper); + + _resizeElement(pre); + }); + +}());
\ No newline at end of file |