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.
90 lines
2.8 KiB
90 lines
2.8 KiB
(function () { |
|
|
|
if (typeof Prism === 'undefined') { |
|
return; |
|
} |
|
|
|
|
|
var LANGUAGE_REGEX = /^diff-([\w-]+)/i; |
|
var HTML_TAG = /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/g; |
|
//this will match a line plus the line break while ignoring the line breaks HTML tags may contain. |
|
var HTML_LINE = RegExp(/(?:__|[^\r\n<])*(?:\r\n?|\n|(?:__|[^\r\n<])(?![^\r\n]))/.source.replace(/__/g, function () { return HTML_TAG.source; }), 'gi'); |
|
|
|
var warningLogged = false; |
|
|
|
Prism.hooks.add('before-sanity-check', function (env) { |
|
var lang = env.language; |
|
if (LANGUAGE_REGEX.test(lang) && !env.grammar) { |
|
env.grammar = Prism.languages[lang] = Prism.languages.diff; |
|
} |
|
}); |
|
Prism.hooks.add('before-tokenize', function (env) { |
|
if (!warningLogged && !Prism.languages.diff && !Prism.plugins.autoloader) { |
|
warningLogged = true; |
|
console.warn("Prism's Diff Highlight plugin requires the Diff language definition (prism-diff.js)." + |
|
"Make sure the language definition is loaded or use Prism's Autoloader plugin."); |
|
} |
|
|
|
var lang = env.language; |
|
if (LANGUAGE_REGEX.test(lang) && !Prism.languages[lang]) { |
|
Prism.languages[lang] = Prism.languages.diff; |
|
} |
|
}); |
|
|
|
Prism.hooks.add('wrap', function (env) { |
|
var diffLanguage; var diffGrammar; |
|
|
|
if (env.language !== 'diff') { |
|
var langMatch = LANGUAGE_REGEX.exec(env.language); |
|
if (!langMatch) { |
|
return; // not a language specific diff |
|
} |
|
|
|
diffLanguage = langMatch[1]; |
|
diffGrammar = Prism.languages[diffLanguage]; |
|
} |
|
|
|
var PREFIXES = Prism.languages.diff && Prism.languages.diff.PREFIXES; |
|
|
|
// one of the diff tokens without any nested tokens |
|
if (PREFIXES && env.type in PREFIXES) { |
|
/** @type {string} */ |
|
var content = env.content.replace(HTML_TAG, ''); // remove all HTML tags |
|
|
|
/** @type {string} */ |
|
var decoded = content.replace(/</g, '<').replace(/&/g, '&'); |
|
|
|
// remove any one-character prefix |
|
var code = decoded.replace(/(^|[\r\n])./g, '$1'); |
|
|
|
// highlight, if possible |
|
var highlighted; |
|
if (diffGrammar) { |
|
highlighted = Prism.highlight(code, diffGrammar, diffLanguage); |
|
} else { |
|
highlighted = Prism.util.encode(code); |
|
} |
|
|
|
// get the HTML source of the prefix token |
|
var prefixToken = new Prism.Token('prefix', PREFIXES[env.type], [/\w+/.exec(env.type)[0]]); |
|
var prefix = Prism.Token.stringify(prefixToken, env.language); |
|
|
|
// add prefix |
|
var lines = []; var m; |
|
HTML_LINE.lastIndex = 0; |
|
while ((m = HTML_LINE.exec(highlighted))) { |
|
lines.push(prefix + m[0]); |
|
} |
|
if (/(?:^|[\r\n]).$/.test(decoded)) { |
|
// because both "+a\n+" and "+a\n" will map to "a\n" after the line prefixes are removed |
|
lines.push(prefix); |
|
} |
|
env.content = lines.join(''); |
|
|
|
if (diffGrammar) { |
|
env.classes.push('language-' + diffLanguage); |
|
} |
|
} |
|
}); |
|
|
|
}());
|
|
|