You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.7 KiB
83 lines
1.7 KiB
(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); |
|
}); |
|
}());
|
|
|