-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'gh-pages' of https://github.com/VitaliyR/prism into Vit…
…aliyR-gh-pages # Conflicts: # plugins/line-numbers/index.html # plugins/line-numbers/prism-line-numbers.js
- Loading branch information
Showing
3 changed files
with
106 additions
and
42 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,57 +1,114 @@ | ||
(function() { | ||
(function () { | ||
|
||
if (typeof self === 'undefined' || !self.Prism || !self.document) { | ||
return; | ||
} | ||
|
||
Prism.hooks.add('complete', function (env) { | ||
if (!env.code) { | ||
if (typeof self === 'undefined' || !self.Prism || !self.document) { | ||
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) || | ||
/** | ||
* 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; | ||
} | ||
(!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 (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'; | ||
} | ||
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 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>'); | ||
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; | ||
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); | ||
} | ||
if (pre.hasAttribute('data-start')) { | ||
pre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1); | ||
} | ||
|
||
env.element.appendChild(lineNumbersWrapper); | ||
env.element.appendChild(lineNumbersWrapper); | ||
|
||
}); | ||
_resizeElement(pre); | ||
}); | ||
|
||
}()); |