Skip to content
Snippets Groups Projects
Commit 50dc8ecf authored by Antoine Lambert's avatar Antoine Lambert
Browse files

highlightjs-line-numbers: Upgrade to version 2.2.0

This new release fixes multi-line strings and comments highlighting bugs
(see https://github.com/wcoder/highlightjs-line-numbers.js/pull/22 and
https://github.com/wcoder/highlightjs-line-numbers.js/pull/30).
parent c16583c4
No related branches found
No related tags found
No related merge requests found
!function(t,e){"use strict";function n(){var t=e.createElement("style");t.type="text/css",t.innerHTML=m(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[d,f,p]),e.getElementsByTagName("head")[0].appendChild(t)}function r(n){"complete"===e.readyState?l(n):t.addEventListener("DOMContentLoaded",function(){l(n)})}function l(n){try{var r=e.querySelectorAll("code.hljs");for(var l in r)r.hasOwnProperty(l)&&o(r[l],n)}catch(s){t.console.error("LineNumbers error: ",s)}}function o(t,e){if("object"==typeof t){e=e||{singleLine:!1};var n=e.singleLine?0:1,r=a(t),l=c(r);if(l.length>n){for(var o="",s=0,i=l.length;s<i;s++)o+=m('<tr><td class="{0}"><div class="{1} {2}" {3}="{5}"></div></td><td class="{4}"><div class="{1}">{6}</div></td></tr>',[g,u,f,p,h,s+1,l[s].length>0?l[s]:" "]);t.innerHTML=m('<table class="{0}">{1}</table>',[d,o])}}}function s(t){for(var e="",n=t.innerText.split(/\r\n|\r|\n/g),r=0;r<n.length;r++)t.innerText=n[r],e+=t.outerHTML,r<n.length-1&&(e+="\n");return e}function i(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}function a(t){var e="",n=t.childNodes;for(var r in n)n.hasOwnProperty(r)&&(e+="hljs-comment"===n[r].className||"hljs-string"===n[r].className?s(n[r]):n[r].childNodes.length?n[r].outerHTML:i(n[r].textContent));return e}function c(t){return 0===t.length?[]:t.split(/\r\n|\r|\n/g)}var d="hljs-ln",u="hljs-ln-line",h="hljs-ln-code",g="hljs-ln-numbers",f="hljs-ln-n",p="data-line-number",m=function(t,e){return t.replace(/\{(\d+)\}/g,function(t,n){return e[n]?e[n]:t})};t.hljs?(t.hljs.initLineNumbersOnLoad=r,t.hljs.lineNumbersBlock=o,n()):t.console.error("highlight.js not detected!")}(window,document);
\ No newline at end of file
!function(n,e){"use strict";function t(){var n=e.createElement("style");n.type="text/css",n.innerHTML=h(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[f,m,j]),e.getElementsByTagName("head")[0].appendChild(n)}function r(t){"complete"===e.readyState?l(t):n.addEventListener("DOMContentLoaded",function(){l(t)})}function l(t){try{var r=e.querySelectorAll("code.hljs");for(var l in r)r.hasOwnProperty(l)&&i(r[l],t)}catch(o){n.console.error("LineNumbers error: ",o)}}function i(n,e){if("object"==typeof n){e=e||{singleLine:!1};var t=e.singleLine?0:1;u(function(){s(n),n.innerHTML=o(n.innerHTML,t)})}}function o(n,e){var t=c(n);if(t.length>e){for(var r="",l=0,i=t.length;l<i;l++)r+=h('<tr><td class="{0}"><div class="{1} {2}" {3}="{5}"></div></td><td class="{4}"><div class="{1}">{6}</div></td></tr>',[p,v,m,j,g,l+1,t[l].length>0?t[l]:" "]);return h('<table class="{0}">{1}</table>',[f,r])}return n}function s(n){var e=n.childNodes;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];d(r.textContent)>0&&(r.childNodes.length>0?s(r):a(r))}}function a(n){var e=n.parentNode.className;if(/hljs-/.test(e)){for(var t=c(n.textContent),r=0,l="";r<t.length;r++)l+=h('<span class="{0}">{1}</span>\n',[e,t[r]]);n.parentNode.innerHTML=l.trim()}}function c(n){return 0===n.length?[]:n.split(L)}function d(n){return(n.trim().match(L)||[]).length}function u(e){n.setTimeout(e,0)}function h(n,e){return n.replace(/\{(\d+)\}/g,function(n,t){return e[t]?e[t]:n})}var f="hljs-ln",v="hljs-ln-line",g="hljs-ln-code",p="hljs-ln-numbers",m="hljs-ln-n",j="data-line-number",L=/\r\n|\r|\n/g;n.hljs?(n.hljs.initLineNumbersOnLoad=r,n.hljs.lineNumbersBlock=i,t()):n.console.error("highlight.js not detected!")}(window,document);
\ No newline at end of file
// jshint multistr:true
(function (w, d) {
'use strict';
var TABLE_NAME = 'hljs-ln',
LINE_NAME = 'hljs-ln-line',
CODE_BLOCK_NAME = 'hljs-ln-code',
NUMBERS_BLOCK_NAME = 'hljs-ln-numbers',
NUMBER_LINE_NAME = 'hljs-ln-n',
DATA_ATTR_NAME = 'data-line-number';
// string format
// https://wcoder.github.io/notes/string-format-for-string-formating-in-javascript
var format = function (str, args) {
return str.replace(/\{(\d+)\}/g, function(m, n){
return args[n] ? args[n] : m;
});
};
if (w.hljs) {
w.hljs.initLineNumbersOnLoad = initLineNumbersOnLoad;
w.hljs.lineNumbersBlock = lineNumbersBlock;
addStyles();
} else {
w.console.error('highlight.js not detected!');
}
function addStyles () {
var css = d.createElement('style');
css.type = 'text/css';
css.innerHTML = format(
'.{0}{border-collapse:collapse}\
.{0} td{padding:0}\
.{1}:before{content:attr({2})}',
[
TABLE_NAME,
NUMBER_LINE_NAME,
DATA_ATTR_NAME
]);
d.getElementsByTagName('head')[0].appendChild(css);
}
function initLineNumbersOnLoad (options) {
if (d.readyState === 'complete') {
documentReady(options);
} else {
w.addEventListener('DOMContentLoaded', function () {
documentReady(options);
});
}
}
function documentReady (options) {
try {
var blocks = d.querySelectorAll('code.hljs');
for (var i in blocks) {
if (blocks.hasOwnProperty(i)) {
lineNumbersBlock(blocks[i], options);
}
}
} catch (e) {
w.console.error('LineNumbers error: ', e);
}
}
function lineNumbersBlock (element, options) {
if (typeof element !== 'object') return;
// define options or set default
options = options || {
singleLine: false
};
// convert options
var firstLineIndex = !!options.singleLine ? 0 : 1;
var text = changeMultilineComments(element);
var lines = getLines(text);
if (lines.length > firstLineIndex) {
var html = '';
for (var i = 0, l = lines.length; i < l; i++) {
html += format(
'<tr>\
<td class="{0}">\
<div class="{1} {2}" {3}="{5}"></div>\
</td>\
<td class="{4}">\
<div class="{1}">{6}</div>\
</td>\
</tr>',
[
NUMBERS_BLOCK_NAME,
LINE_NAME,
NUMBER_LINE_NAME,
DATA_ATTR_NAME,
CODE_BLOCK_NAME,
i + 1,
lines[i].length > 0 ? lines[i] : ' '
]);
}
element.innerHTML = format('<table class="{0}">{1}</table>', [ TABLE_NAME, html ]);
}
}
function duplicateMultilineTag(element){
var result = '';
var lines = element.innerText.split(/\r\n|\r|\n/g);
for(var i = 0; i<lines.length; i++){
element.innerText = lines[i];
result += element.outerHTML;
if(i < lines.length -1)
result += '\n';
}
return result;
}
function escapeHtml(unsafe) {
return unsafe.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
'use strict';
var TABLE_NAME = 'hljs-ln',
LINE_NAME = 'hljs-ln-line',
CODE_BLOCK_NAME = 'hljs-ln-code',
NUMBERS_BLOCK_NAME = 'hljs-ln-numbers',
NUMBER_LINE_NAME = 'hljs-ln-n',
DATA_ATTR_NAME = 'data-line-number',
BREAK_LINE_REGEXP = /\r\n|\r|\n/g;
if (w.hljs) {
w.hljs.initLineNumbersOnLoad = initLineNumbersOnLoad;
w.hljs.lineNumbersBlock = lineNumbersBlock;
addStyles();
} else {
w.console.error('highlight.js not detected!');
}
function addStyles () {
var css = d.createElement('style');
css.type = 'text/css';
css.innerHTML = format(
'.{0}{border-collapse:collapse}\
.{0} td{padding:0}\
.{1}:before{content:attr({2})}',
[
TABLE_NAME,
NUMBER_LINE_NAME,
DATA_ATTR_NAME
]);
d.getElementsByTagName('head')[0].appendChild(css);
}
function initLineNumbersOnLoad (options) {
if (d.readyState === 'complete') {
documentReady(options);
} else {
w.addEventListener('DOMContentLoaded', function () {
documentReady(options);
});
}
}
function documentReady (options) {
try {
var blocks = d.querySelectorAll('code.hljs');
for (var i in blocks) {
if (blocks.hasOwnProperty(i)) {
lineNumbersBlock(blocks[i], options);
}
}
} catch (e) {
w.console.error('LineNumbers error: ', e);
}
}
function lineNumbersBlock (element, options) {
if (typeof element !== 'object') return;
// define options or set default
options = options || {
singleLine: false
};
// convert options
var firstLineIndex = !!options.singleLine ? 0 : 1;
async(function () {
duplicateMultilineNodes(element);
element.innerHTML = addLineNumbersBlockFor(element.innerHTML, firstLineIndex);
});
}
function addLineNumbersBlockFor (inputHtml, firstLineIndex) {
var lines = getLines(inputHtml);
if (lines.length > firstLineIndex) {
var html = '';
for (var i = 0, l = lines.length; i < l; i++) {
html += format(
'<tr>\
<td class="{0}">\
<div class="{1} {2}" {3}="{5}"></div>\
</td>\
<td class="{4}">\
<div class="{1}">{6}</div>\
</td>\
</tr>',
[
NUMBERS_BLOCK_NAME,
LINE_NAME,
NUMBER_LINE_NAME,
DATA_ATTR_NAME,
CODE_BLOCK_NAME,
i + 1,
lines[i].length > 0 ? lines[i] : ' '
]);
}
return format('<table class="{0}">{1}</table>', [ TABLE_NAME, html ]);
}
return inputHtml;
}
function changeMultilineComments(element) {
var result = '';
var children = element.childNodes;
for(var child in children) {
if(children.hasOwnProperty(child)) {
if(children[child].className === "hljs-comment" ||
children[child].className === "hljs-string") {
result += duplicateMultilineTag(children[child]);
}
else if(children[child].childNodes.length) {
result += children[child].outerHTML;
}
else {
result += escapeHtml(children[child].textContent);
}
}
/**
* Recursive method for fix multi-line elements implementation in highlight.js
* Doing deep passage on child nodes.
* @param {HTMLElement} element
*/
function duplicateMultilineNodes (element) {
var nodes = element.childNodes;
for (var node in nodes){
if (nodes.hasOwnProperty(node)) {
var child = nodes[node];
if (getLinesCount(child.textContent) > 0) {
if (child.childNodes.length > 0) {
duplicateMultilineNodes(child);
} else {
duplicateMultilineNode(child);
}
}
}
}
return result;
}
}
/**
* Method for fix multi-line elements implementation in highlight.js
* @param {HTMLElement} element
*/
function duplicateMultilineNode (element) {
var className = element.parentNode.className;
function getLines(text) {
if (text.length === 0) return [];
return text.split(/\r\n|\r|\n/g);
}
if ( ! /hljs-/.test(className)) return;
var lines = getLines(element.textContent);
for (var i = 0, result = ''; i < lines.length; i++) {
result += format('<span class="{0}">{1}</span>\n', [ className, lines[i] ]);
}
element.parentNode.innerHTML = result.trim();
}
function getLines (text) {
if (text.length === 0) return [];
return text.split(BREAK_LINE_REGEXP);
}
function getLinesCount (text) {
return (text.trim().match(BREAK_LINE_REGEXP) || []).length;
}
function async (func) {
w.setTimeout(func, 0);
}
/**
* {@link https://wcoder.github.io/notes/string-format-for-string-formating-in-javascript}
* @param {string} format
* @param {array} args
*/
function format (format, args) {
return format.replace(/\{(\d+)\}/g, function(m, n){
return args[n] ? args[n] : m;
});
}
}(window, document));
\ No newline at end of file
}(window, document));
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment