prism/plugins/show-invisibles/prism-show-invisibles.js

84 lines
1.7 KiB
JavaScript

(function () {
if (typeof Prism === 'undefined') {
return;
}
var invisibles = {
'tab': /\t/,
'crlf': /\r\n/,
'lf': /\n/,
'cr': /\r/,
'space': / /
};
/**
* Handles the recursive calling of `addInvisibles` for one token.
*
* @param {Object|Array} tokens The grammar or array which contains the token.
* @param {string|number} name The name or index of the token in `tokens`.
*/
function handleToken(tokens, name) {
var value = tokens[name];
var type = Prism.util.type(value);
switch (type) {
case 'RegExp':
var inside = {};
tokens[name] = {
pattern: value,
inside: inside
};
addInvisibles(inside);
break;
case 'Array':
for (var i = 0, l = value.length; i < l; i++) {
handleToken(value, i);
}
break;
default: // 'Object'
// eslint-disable-next-line no-redeclare
var inside = value.inside || (value.inside = {});
addInvisibles(inside);
break;
}
}
/**
* Recursively adds patterns to match invisible characters to the given grammar (if not added already).
*
* @param {Object} grammar
*/
function addInvisibles(grammar) {
if (!grammar || grammar['tab']) {
return;
}
// assign invisibles here to "mark" the grammar in case of self references
for (var name in invisibles) {
if (invisibles.hasOwnProperty(name)) {
grammar[name] = invisibles[name];
}
}
// eslint-disable-next-line no-redeclare
for (var name in grammar) {
if (grammar.hasOwnProperty(name) && !invisibles[name]) {
if (name === 'rest') {
addInvisibles(grammar['rest']);
} else {
handleToken(grammar, name);
}
}
}
}
Prism.hooks.add('before-highlight', function (env) {
addInvisibles(env.grammar);
});
}());