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.
2449 lines
92 KiB
2449 lines
92 KiB
/** |
|
* TinyMCE version 6.4.2 (2023-04-26) |
|
*/ |
|
|
|
(function () { |
|
'use strict'; |
|
|
|
var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager'); |
|
|
|
const isNullable = a => a === null || a === undefined; |
|
const isNonNullable = a => !isNullable(a); |
|
|
|
const constant = value => { |
|
return () => { |
|
return value; |
|
}; |
|
}; |
|
|
|
class Optional { |
|
constructor(tag, value) { |
|
this.tag = tag; |
|
this.value = value; |
|
} |
|
static some(value) { |
|
return new Optional(true, value); |
|
} |
|
static none() { |
|
return Optional.singletonNone; |
|
} |
|
fold(onNone, onSome) { |
|
if (this.tag) { |
|
return onSome(this.value); |
|
} else { |
|
return onNone(); |
|
} |
|
} |
|
isSome() { |
|
return this.tag; |
|
} |
|
isNone() { |
|
return !this.tag; |
|
} |
|
map(mapper) { |
|
if (this.tag) { |
|
return Optional.some(mapper(this.value)); |
|
} else { |
|
return Optional.none(); |
|
} |
|
} |
|
bind(binder) { |
|
if (this.tag) { |
|
return binder(this.value); |
|
} else { |
|
return Optional.none(); |
|
} |
|
} |
|
exists(predicate) { |
|
return this.tag && predicate(this.value); |
|
} |
|
forall(predicate) { |
|
return !this.tag || predicate(this.value); |
|
} |
|
filter(predicate) { |
|
if (!this.tag || predicate(this.value)) { |
|
return this; |
|
} else { |
|
return Optional.none(); |
|
} |
|
} |
|
getOr(replacement) { |
|
return this.tag ? this.value : replacement; |
|
} |
|
or(replacement) { |
|
return this.tag ? this : replacement; |
|
} |
|
getOrThunk(thunk) { |
|
return this.tag ? this.value : thunk(); |
|
} |
|
orThunk(thunk) { |
|
return this.tag ? this : thunk(); |
|
} |
|
getOrDie(message) { |
|
if (!this.tag) { |
|
throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); |
|
} else { |
|
return this.value; |
|
} |
|
} |
|
static from(value) { |
|
return isNonNullable(value) ? Optional.some(value) : Optional.none(); |
|
} |
|
getOrNull() { |
|
return this.tag ? this.value : null; |
|
} |
|
getOrUndefined() { |
|
return this.value; |
|
} |
|
each(worker) { |
|
if (this.tag) { |
|
worker(this.value); |
|
} |
|
} |
|
toArray() { |
|
return this.tag ? [this.value] : []; |
|
} |
|
toString() { |
|
return this.tag ? `some(${ this.value })` : 'none()'; |
|
} |
|
} |
|
Optional.singletonNone = new Optional(false); |
|
|
|
const get$1 = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); |
|
const head = xs => get$1(xs, 0); |
|
|
|
var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); |
|
|
|
const Global = typeof window !== 'undefined' ? window : Function('return this;')(); |
|
|
|
const prismjs = function (global, module, exports) { |
|
const oldprism = window.Prism; |
|
window.Prism = { manual: true }; |
|
var _self = typeof window !== 'undefined' ? window : typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ? self : {}; |
|
var Prism = function (_self) { |
|
var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i; |
|
var uniqueId = 0; |
|
var plainTextGrammar = {}; |
|
var _ = { |
|
manual: _self.Prism && _self.Prism.manual, |
|
disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler, |
|
util: { |
|
encode: function encode(tokens) { |
|
if (tokens instanceof Token) { |
|
return new Token(tokens.type, encode(tokens.content), tokens.alias); |
|
} else if (Array.isArray(tokens)) { |
|
return tokens.map(encode); |
|
} else { |
|
return tokens.replace(/&/g, '&').replace(/</g, '<').replace(/\u00a0/g, ' '); |
|
} |
|
}, |
|
type: function (o) { |
|
return Object.prototype.toString.call(o).slice(8, -1); |
|
}, |
|
objId: function (obj) { |
|
if (!obj['__id']) { |
|
Object.defineProperty(obj, '__id', { value: ++uniqueId }); |
|
} |
|
return obj['__id']; |
|
}, |
|
clone: function deepClone(o, visited) { |
|
visited = visited || {}; |
|
var clone; |
|
var id; |
|
switch (_.util.type(o)) { |
|
case 'Object': |
|
id = _.util.objId(o); |
|
if (visited[id]) { |
|
return visited[id]; |
|
} |
|
clone = {}; |
|
visited[id] = clone; |
|
for (var key in o) { |
|
if (o.hasOwnProperty(key)) { |
|
clone[key] = deepClone(o[key], visited); |
|
} |
|
} |
|
return clone; |
|
case 'Array': |
|
id = _.util.objId(o); |
|
if (visited[id]) { |
|
return visited[id]; |
|
} |
|
clone = []; |
|
visited[id] = clone; |
|
o.forEach(function (v, i) { |
|
clone[i] = deepClone(v, visited); |
|
}); |
|
return clone; |
|
default: |
|
return o; |
|
} |
|
}, |
|
getLanguage: function (element) { |
|
while (element) { |
|
var m = lang.exec(element.className); |
|
if (m) { |
|
return m[1].toLowerCase(); |
|
} |
|
element = element.parentElement; |
|
} |
|
return 'none'; |
|
}, |
|
setLanguage: function (element, language) { |
|
element.className = element.className.replace(RegExp(lang, 'gi'), ''); |
|
element.classList.add('language-' + language); |
|
}, |
|
currentScript: function () { |
|
if (typeof document === 'undefined') { |
|
return null; |
|
} |
|
if ('currentScript' in document && 1 < 2) { |
|
return document.currentScript; |
|
} |
|
try { |
|
throw new Error(); |
|
} catch (err) { |
|
var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1]; |
|
if (src) { |
|
var scripts = document.getElementsByTagName('script'); |
|
for (var i in scripts) { |
|
if (scripts[i].src == src) { |
|
return scripts[i]; |
|
} |
|
} |
|
} |
|
return null; |
|
} |
|
}, |
|
isActive: function (element, className, defaultActivation) { |
|
var no = 'no-' + className; |
|
while (element) { |
|
var classList = element.classList; |
|
if (classList.contains(className)) { |
|
return true; |
|
} |
|
if (classList.contains(no)) { |
|
return false; |
|
} |
|
element = element.parentElement; |
|
} |
|
return !!defaultActivation; |
|
} |
|
}, |
|
languages: { |
|
plain: plainTextGrammar, |
|
plaintext: plainTextGrammar, |
|
text: plainTextGrammar, |
|
txt: plainTextGrammar, |
|
extend: function (id, redef) { |
|
var lang = _.util.clone(_.languages[id]); |
|
for (var key in redef) { |
|
lang[key] = redef[key]; |
|
} |
|
return lang; |
|
}, |
|
insertBefore: function (inside, before, insert, root) { |
|
root = root || _.languages; |
|
var grammar = root[inside]; |
|
var ret = {}; |
|
for (var token in grammar) { |
|
if (grammar.hasOwnProperty(token)) { |
|
if (token == before) { |
|
for (var newToken in insert) { |
|
if (insert.hasOwnProperty(newToken)) { |
|
ret[newToken] = insert[newToken]; |
|
} |
|
} |
|
} |
|
if (!insert.hasOwnProperty(token)) { |
|
ret[token] = grammar[token]; |
|
} |
|
} |
|
} |
|
var old = root[inside]; |
|
root[inside] = ret; |
|
_.languages.DFS(_.languages, function (key, value) { |
|
if (value === old && key != inside) { |
|
this[key] = ret; |
|
} |
|
}); |
|
return ret; |
|
}, |
|
DFS: function DFS(o, callback, type, visited) { |
|
visited = visited || {}; |
|
var objId = _.util.objId; |
|
for (var i in o) { |
|
if (o.hasOwnProperty(i)) { |
|
callback.call(o, i, o[i], type || i); |
|
var property = o[i]; |
|
var propertyType = _.util.type(property); |
|
if (propertyType === 'Object' && !visited[objId(property)]) { |
|
visited[objId(property)] = true; |
|
DFS(property, callback, null, visited); |
|
} else if (propertyType === 'Array' && !visited[objId(property)]) { |
|
visited[objId(property)] = true; |
|
DFS(property, callback, i, visited); |
|
} |
|
} |
|
} |
|
} |
|
}, |
|
plugins: {}, |
|
highlightAll: function (async, callback) { |
|
_.highlightAllUnder(document, async, callback); |
|
}, |
|
highlightAllUnder: function (container, async, callback) { |
|
var env = { |
|
callback: callback, |
|
container: container, |
|
selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code' |
|
}; |
|
_.hooks.run('before-highlightall', env); |
|
env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector)); |
|
_.hooks.run('before-all-elements-highlight', env); |
|
for (var i = 0, element; element = env.elements[i++];) { |
|
_.highlightElement(element, async === true, env.callback); |
|
} |
|
}, |
|
highlightElement: function (element, async, callback) { |
|
var language = _.util.getLanguage(element); |
|
var grammar = _.languages[language]; |
|
_.util.setLanguage(element, language); |
|
var parent = element.parentElement; |
|
if (parent && parent.nodeName.toLowerCase() === 'pre') { |
|
_.util.setLanguage(parent, language); |
|
} |
|
var code = element.textContent; |
|
var env = { |
|
element: element, |
|
language: language, |
|
grammar: grammar, |
|
code: code |
|
}; |
|
function insertHighlightedCode(highlightedCode) { |
|
env.highlightedCode = highlightedCode; |
|
_.hooks.run('before-insert', env); |
|
env.element.innerHTML = env.highlightedCode; |
|
_.hooks.run('after-highlight', env); |
|
_.hooks.run('complete', env); |
|
callback && callback.call(env.element); |
|
} |
|
_.hooks.run('before-sanity-check', env); |
|
parent = env.element.parentElement; |
|
if (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) { |
|
parent.setAttribute('tabindex', '0'); |
|
} |
|
if (!env.code) { |
|
_.hooks.run('complete', env); |
|
callback && callback.call(env.element); |
|
return; |
|
} |
|
_.hooks.run('before-highlight', env); |
|
if (!env.grammar) { |
|
insertHighlightedCode(_.util.encode(env.code)); |
|
return; |
|
} |
|
if (async && _self.Worker) { |
|
var worker = new Worker(_.filename); |
|
worker.onmessage = function (evt) { |
|
insertHighlightedCode(evt.data); |
|
}; |
|
worker.postMessage(JSON.stringify({ |
|
language: env.language, |
|
code: env.code, |
|
immediateClose: true |
|
})); |
|
} else { |
|
insertHighlightedCode(_.highlight(env.code, env.grammar, env.language)); |
|
} |
|
}, |
|
highlight: function (text, grammar, language) { |
|
var env = { |
|
code: text, |
|
grammar: grammar, |
|
language: language |
|
}; |
|
_.hooks.run('before-tokenize', env); |
|
if (!env.grammar) { |
|
throw new Error('The language "' + env.language + '" has no grammar.'); |
|
} |
|
env.tokens = _.tokenize(env.code, env.grammar); |
|
_.hooks.run('after-tokenize', env); |
|
return Token.stringify(_.util.encode(env.tokens), env.language); |
|
}, |
|
tokenize: function (text, grammar) { |
|
var rest = grammar.rest; |
|
if (rest) { |
|
for (var token in rest) { |
|
grammar[token] = rest[token]; |
|
} |
|
delete grammar.rest; |
|
} |
|
var tokenList = new LinkedList(); |
|
addAfter(tokenList, tokenList.head, text); |
|
matchGrammar(text, tokenList, grammar, tokenList.head, 0); |
|
return toArray(tokenList); |
|
}, |
|
hooks: { |
|
all: {}, |
|
add: function (name, callback) { |
|
var hooks = _.hooks.all; |
|
hooks[name] = hooks[name] || []; |
|
hooks[name].push(callback); |
|
}, |
|
run: function (name, env) { |
|
var callbacks = _.hooks.all[name]; |
|
if (!callbacks || !callbacks.length) { |
|
return; |
|
} |
|
for (var i = 0, callback; callback = callbacks[i++];) { |
|
callback(env); |
|
} |
|
} |
|
}, |
|
Token: Token |
|
}; |
|
_self.Prism = _; |
|
function Token(type, content, alias, matchedStr) { |
|
this.type = type; |
|
this.content = content; |
|
this.alias = alias; |
|
this.length = (matchedStr || '').length | 0; |
|
} |
|
Token.stringify = function stringify(o, language) { |
|
if (typeof o == 'string') { |
|
return o; |
|
} |
|
if (Array.isArray(o)) { |
|
var s = ''; |
|
o.forEach(function (e) { |
|
s += stringify(e, language); |
|
}); |
|
return s; |
|
} |
|
var env = { |
|
type: o.type, |
|
content: stringify(o.content, language), |
|
tag: 'span', |
|
classes: [ |
|
'token', |
|
o.type |
|
], |
|
attributes: {}, |
|
language: language |
|
}; |
|
var aliases = o.alias; |
|
if (aliases) { |
|
if (Array.isArray(aliases)) { |
|
Array.prototype.push.apply(env.classes, aliases); |
|
} else { |
|
env.classes.push(aliases); |
|
} |
|
} |
|
_.hooks.run('wrap', env); |
|
var attributes = ''; |
|
for (var name in env.attributes) { |
|
attributes += ' ' + name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"'; |
|
} |
|
return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + attributes + '>' + env.content + '</' + env.tag + '>'; |
|
}; |
|
function matchPattern(pattern, pos, text, lookbehind) { |
|
pattern.lastIndex = pos; |
|
var match = pattern.exec(text); |
|
if (match && lookbehind && match[1]) { |
|
var lookbehindLength = match[1].length; |
|
match.index += lookbehindLength; |
|
match[0] = match[0].slice(lookbehindLength); |
|
} |
|
return match; |
|
} |
|
function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) { |
|
for (var token in grammar) { |
|
if (!grammar.hasOwnProperty(token) || !grammar[token]) { |
|
continue; |
|
} |
|
var patterns = grammar[token]; |
|
patterns = Array.isArray(patterns) ? patterns : [patterns]; |
|
for (var j = 0; j < patterns.length; ++j) { |
|
if (rematch && rematch.cause == token + ',' + j) { |
|
return; |
|
} |
|
var patternObj = patterns[j]; |
|
var inside = patternObj.inside; |
|
var lookbehind = !!patternObj.lookbehind; |
|
var greedy = !!patternObj.greedy; |
|
var alias = patternObj.alias; |
|
if (greedy && !patternObj.pattern.global) { |
|
var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0]; |
|
patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g'); |
|
} |
|
var pattern = patternObj.pattern || patternObj; |
|
for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, currentNode = currentNode.next) { |
|
if (rematch && pos >= rematch.reach) { |
|
break; |
|
} |
|
var str = currentNode.value; |
|
if (tokenList.length > text.length) { |
|
return; |
|
} |
|
if (str instanceof Token) { |
|
continue; |
|
} |
|
var removeCount = 1; |
|
var match; |
|
if (greedy) { |
|
match = matchPattern(pattern, pos, text, lookbehind); |
|
if (!match || match.index >= text.length) { |
|
break; |
|
} |
|
var from = match.index; |
|
var to = match.index + match[0].length; |
|
var p = pos; |
|
p += currentNode.value.length; |
|
while (from >= p) { |
|
currentNode = currentNode.next; |
|
p += currentNode.value.length; |
|
} |
|
p -= currentNode.value.length; |
|
pos = p; |
|
if (currentNode.value instanceof Token) { |
|
continue; |
|
} |
|
for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === 'string'); k = k.next) { |
|
removeCount++; |
|
p += k.value.length; |
|
} |
|
removeCount--; |
|
str = text.slice(pos, p); |
|
match.index -= pos; |
|
} else { |
|
match = matchPattern(pattern, 0, str, lookbehind); |
|
if (!match) { |
|
continue; |
|
} |
|
} |
|
var from = match.index; |
|
var matchStr = match[0]; |
|
var before = str.slice(0, from); |
|
var after = str.slice(from + matchStr.length); |
|
var reach = pos + str.length; |
|
if (rematch && reach > rematch.reach) { |
|
rematch.reach = reach; |
|
} |
|
var removeFrom = currentNode.prev; |
|
if (before) { |
|
removeFrom = addAfter(tokenList, removeFrom, before); |
|
pos += before.length; |
|
} |
|
removeRange(tokenList, removeFrom, removeCount); |
|
var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr); |
|
currentNode = addAfter(tokenList, removeFrom, wrapped); |
|
if (after) { |
|
addAfter(tokenList, currentNode, after); |
|
} |
|
if (removeCount > 1) { |
|
var nestedRematch = { |
|
cause: token + ',' + j, |
|
reach: reach |
|
}; |
|
matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch); |
|
if (rematch && nestedRematch.reach > rematch.reach) { |
|
rematch.reach = nestedRematch.reach; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
function LinkedList() { |
|
var head = { |
|
value: null, |
|
prev: null, |
|
next: null |
|
}; |
|
var tail = { |
|
value: null, |
|
prev: head, |
|
next: null |
|
}; |
|
head.next = tail; |
|
this.head = head; |
|
this.tail = tail; |
|
this.length = 0; |
|
} |
|
function addAfter(list, node, value) { |
|
var next = node.next; |
|
var newNode = { |
|
value: value, |
|
prev: node, |
|
next: next |
|
}; |
|
node.next = newNode; |
|
next.prev = newNode; |
|
list.length++; |
|
return newNode; |
|
} |
|
function removeRange(list, node, count) { |
|
var next = node.next; |
|
for (var i = 0; i < count && next !== list.tail; i++) { |
|
next = next.next; |
|
} |
|
node.next = next; |
|
next.prev = node; |
|
list.length -= i; |
|
} |
|
function toArray(list) { |
|
var array = []; |
|
var node = list.head.next; |
|
while (node !== list.tail) { |
|
array.push(node.value); |
|
node = node.next; |
|
} |
|
return array; |
|
} |
|
if (!_self.document) { |
|
if (!_self.addEventListener) { |
|
return _; |
|
} |
|
if (!_.disableWorkerMessageHandler) { |
|
_self.addEventListener('message', function (evt) { |
|
var message = JSON.parse(evt.data); |
|
var lang = message.language; |
|
var code = message.code; |
|
var immediateClose = message.immediateClose; |
|
_self.postMessage(_.highlight(code, _.languages[lang], lang)); |
|
if (immediateClose) { |
|
_self.close(); |
|
} |
|
}, false); |
|
} |
|
return _; |
|
} |
|
var script = _.util.currentScript(); |
|
if (script) { |
|
_.filename = script.src; |
|
if (script.hasAttribute('data-manual')) { |
|
_.manual = true; |
|
} |
|
} |
|
function highlightAutomaticallyCallback() { |
|
if (!_.manual) { |
|
_.highlightAll(); |
|
} |
|
} |
|
if (!_.manual) { |
|
var readyState = document.readyState; |
|
if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) { |
|
document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback); |
|
} else { |
|
if (window.requestAnimationFrame) { |
|
window.requestAnimationFrame(highlightAutomaticallyCallback); |
|
} else { |
|
window.setTimeout(highlightAutomaticallyCallback, 16); |
|
} |
|
} |
|
} |
|
return _; |
|
}(_self); |
|
if (typeof module !== 'undefined' && module.exports) { |
|
module.exports = Prism; |
|
} |
|
if (typeof global !== 'undefined') { |
|
global.Prism = Prism; |
|
} |
|
Prism.languages.clike = { |
|
'comment': [ |
|
{ |
|
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, |
|
lookbehind: true, |
|
greedy: true |
|
}, |
|
{ |
|
pattern: /(^|[^\\:])\/\/.*/, |
|
lookbehind: true, |
|
greedy: true |
|
} |
|
], |
|
'string': { |
|
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, |
|
greedy: true |
|
}, |
|
'class-name': { |
|
pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i, |
|
lookbehind: true, |
|
inside: { 'punctuation': /[.\\]/ } |
|
}, |
|
'keyword': /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/, |
|
'boolean': /\b(?:false|true)\b/, |
|
'function': /\b\w+(?=\()/, |
|
'number': /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i, |
|
'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, |
|
'punctuation': /[{}[\];(),.:]/ |
|
}; |
|
(function (Prism) { |
|
function getPlaceholder(language, index) { |
|
return '___' + language.toUpperCase() + index + '___'; |
|
} |
|
Object.defineProperties(Prism.languages['markup-templating'] = {}, { |
|
buildPlaceholders: { |
|
value: function (env, language, placeholderPattern, replaceFilter) { |
|
if (env.language !== language) { |
|
return; |
|
} |
|
var tokenStack = env.tokenStack = []; |
|
env.code = env.code.replace(placeholderPattern, function (match) { |
|
if (typeof replaceFilter === 'function' && !replaceFilter(match)) { |
|
return match; |
|
} |
|
var i = tokenStack.length; |
|
var placeholder; |
|
while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) { |
|
++i; |
|
} |
|
tokenStack[i] = match; |
|
return placeholder; |
|
}); |
|
env.grammar = Prism.languages.markup; |
|
} |
|
}, |
|
tokenizePlaceholders: { |
|
value: function (env, language) { |
|
if (env.language !== language || !env.tokenStack) { |
|
return; |
|
} |
|
env.grammar = Prism.languages[language]; |
|
var j = 0; |
|
var keys = Object.keys(env.tokenStack); |
|
function walkTokens(tokens) { |
|
for (var i = 0; i < tokens.length; i++) { |
|
if (j >= keys.length) { |
|
break; |
|
} |
|
var token = tokens[i]; |
|
if (typeof token === 'string' || token.content && typeof token.content === 'string') { |
|
var k = keys[j]; |
|
var t = env.tokenStack[k]; |
|
var s = typeof token === 'string' ? token : token.content; |
|
var placeholder = getPlaceholder(language, k); |
|
var index = s.indexOf(placeholder); |
|
if (index > -1) { |
|
++j; |
|
var before = s.substring(0, index); |
|
var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t); |
|
var after = s.substring(index + placeholder.length); |
|
var replacement = []; |
|
if (before) { |
|
replacement.push.apply(replacement, walkTokens([before])); |
|
} |
|
replacement.push(middle); |
|
if (after) { |
|
replacement.push.apply(replacement, walkTokens([after])); |
|
} |
|
if (typeof token === 'string') { |
|
tokens.splice.apply(tokens, [ |
|
i, |
|
1 |
|
].concat(replacement)); |
|
} else { |
|
token.content = replacement; |
|
} |
|
} |
|
} else if (token.content) { |
|
walkTokens(token.content); |
|
} |
|
} |
|
return tokens; |
|
} |
|
walkTokens(env.tokens); |
|
} |
|
} |
|
}); |
|
}(Prism)); |
|
Prism.languages.c = Prism.languages.extend('clike', { |
|
'comment': { |
|
pattern: /\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/, |
|
greedy: true |
|
}, |
|
'string': { |
|
pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/, |
|
greedy: true |
|
}, |
|
'class-name': { |
|
pattern: /(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/, |
|
lookbehind: true |
|
}, |
|
'keyword': /\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/, |
|
'function': /\b[a-z_]\w*(?=\s*\()/i, |
|
'number': /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i, |
|
'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/ |
|
}); |
|
Prism.languages.insertBefore('c', 'string', { |
|
'char': { |
|
pattern: /'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/, |
|
greedy: true |
|
} |
|
}); |
|
Prism.languages.insertBefore('c', 'string', { |
|
'macro': { |
|
pattern: /(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im, |
|
lookbehind: true, |
|
greedy: true, |
|
alias: 'property', |
|
inside: { |
|
'string': [ |
|
{ |
|
pattern: /^(#\s*include\s*)<[^>]+>/, |
|
lookbehind: true |
|
}, |
|
Prism.languages.c['string'] |
|
], |
|
'char': Prism.languages.c['char'], |
|
'comment': Prism.languages.c['comment'], |
|
'macro-name': [ |
|
{ |
|
pattern: /(^#\s*define\s+)\w+\b(?!\()/i, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /(^#\s*define\s+)\w+\b(?=\()/i, |
|
lookbehind: true, |
|
alias: 'function' |
|
} |
|
], |
|
'directive': { |
|
pattern: /^(#\s*)[a-z]+/, |
|
lookbehind: true, |
|
alias: 'keyword' |
|
}, |
|
'directive-hash': /^#/, |
|
'punctuation': /##|\\(?=[\r\n])/, |
|
'expression': { |
|
pattern: /\S[\s\S]*/, |
|
inside: Prism.languages.c |
|
} |
|
} |
|
} |
|
}); |
|
Prism.languages.insertBefore('c', 'function', { 'constant': /\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/ }); |
|
delete Prism.languages.c['boolean']; |
|
(function (Prism) { |
|
var keyword = /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/; |
|
var modName = /\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g, function () { |
|
return keyword.source; |
|
}); |
|
Prism.languages.cpp = Prism.languages.extend('c', { |
|
'class-name': [ |
|
{ |
|
pattern: RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g, function () { |
|
return keyword.source; |
|
})), |
|
lookbehind: true |
|
}, |
|
/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/, |
|
/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i, |
|
/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/ |
|
], |
|
'keyword': keyword, |
|
'number': { |
|
pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i, |
|
greedy: true |
|
}, |
|
'operator': />>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/, |
|
'boolean': /\b(?:false|true)\b/ |
|
}); |
|
Prism.languages.insertBefore('cpp', 'string', { |
|
'module': { |
|
pattern: RegExp(/(\b(?:import|module)\s+)/.source + '(?:' + /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source + '|' + /<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g, function () { |
|
return modName; |
|
}) + ')'), |
|
lookbehind: true, |
|
greedy: true, |
|
inside: { |
|
'string': /^[<"][\s\S]+/, |
|
'operator': /:/, |
|
'punctuation': /\./ |
|
} |
|
}, |
|
'raw-string': { |
|
pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/, |
|
alias: 'string', |
|
greedy: true |
|
} |
|
}); |
|
Prism.languages.insertBefore('cpp', 'keyword', { |
|
'generic-function': { |
|
pattern: /\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i, |
|
inside: { |
|
'function': /^\w+/, |
|
'generic': { |
|
pattern: /<[\s\S]+/, |
|
alias: 'class-name', |
|
inside: Prism.languages.cpp |
|
} |
|
} |
|
} |
|
}); |
|
Prism.languages.insertBefore('cpp', 'operator', { |
|
'double-colon': { |
|
pattern: /::/, |
|
alias: 'punctuation' |
|
} |
|
}); |
|
Prism.languages.insertBefore('cpp', 'class-name', { |
|
'base-clause': { |
|
pattern: /(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/, |
|
lookbehind: true, |
|
greedy: true, |
|
inside: Prism.languages.extend('cpp', {}) |
|
} |
|
}); |
|
Prism.languages.insertBefore('inside', 'double-colon', { 'class-name': /\b[a-z_]\w*\b(?!\s*::)/i }, Prism.languages.cpp['base-clause']); |
|
}(Prism)); |
|
(function (Prism) { |
|
function replace(pattern, replacements) { |
|
return pattern.replace(/<<(\d+)>>/g, function (m, index) { |
|
return '(?:' + replacements[+index] + ')'; |
|
}); |
|
} |
|
function re(pattern, replacements, flags) { |
|
return RegExp(replace(pattern, replacements), flags || ''); |
|
} |
|
function nested(pattern, depthLog2) { |
|
for (var i = 0; i < depthLog2; i++) { |
|
pattern = pattern.replace(/<<self>>/g, function () { |
|
return '(?:' + pattern + ')'; |
|
}); |
|
} |
|
return pattern.replace(/<<self>>/g, '[^\\s\\S]'); |
|
} |
|
var keywordKinds = { |
|
type: 'bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void', |
|
typeDeclaration: 'class enum interface record struct', |
|
contextual: 'add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)', |
|
other: 'abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield' |
|
}; |
|
function keywordsToPattern(words) { |
|
return '\\b(?:' + words.trim().replace(/ /g, '|') + ')\\b'; |
|
} |
|
var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration); |
|
var keywords = RegExp(keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other)); |
|
var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other); |
|
var nonContextualKeywords = keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.other); |
|
var generic = nested(/<(?:[^<>;=+\-*/%&|^]|<<self>>)*>/.source, 2); |
|
var nestedRound = nested(/\((?:[^()]|<<self>>)*\)/.source, 2); |
|
var name = /@?\b[A-Za-z_]\w*\b/.source; |
|
var genericName = replace(/<<0>>(?:\s*<<1>>)?/.source, [ |
|
name, |
|
generic |
|
]); |
|
var identifier = replace(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source, [ |
|
nonTypeKeywords, |
|
genericName |
|
]); |
|
var array = /\[\s*(?:,\s*)*\]/.source; |
|
var typeExpressionWithoutTuple = replace(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source, [ |
|
identifier, |
|
array |
|
]); |
|
var tupleElement = replace(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [ |
|
generic, |
|
nestedRound, |
|
array |
|
]); |
|
var tuple = replace(/\(<<0>>+(?:,<<0>>+)+\)/.source, [tupleElement]); |
|
var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source, [ |
|
tuple, |
|
identifier, |
|
array |
|
]); |
|
var typeInside = { |
|
'keyword': keywords, |
|
'punctuation': /[<>()?,.:[\]]/ |
|
}; |
|
var character = /'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source; |
|
var regularString = /"(?:\\.|[^\\"\r\n])*"/.source; |
|
var verbatimString = /@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source; |
|
Prism.languages.csharp = Prism.languages.extend('clike', { |
|
'string': [ |
|
{ |
|
pattern: re(/(^|[^$\\])<<0>>/.source, [verbatimString]), |
|
lookbehind: true, |
|
greedy: true |
|
}, |
|
{ |
|
pattern: re(/(^|[^@$\\])<<0>>/.source, [regularString]), |
|
lookbehind: true, |
|
greedy: true |
|
} |
|
], |
|
'class-name': [ |
|
{ |
|
pattern: re(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source, [identifier]), |
|
lookbehind: true, |
|
inside: typeInside |
|
}, |
|
{ |
|
pattern: re(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source, [ |
|
name, |
|
typeExpression |
|
]), |
|
lookbehind: true, |
|
inside: typeInside |
|
}, |
|
{ |
|
pattern: re(/(\busing\s+)<<0>>(?=\s*=)/.source, [name]), |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: re(/(\b<<0>>\s+)<<1>>/.source, [ |
|
typeDeclarationKeywords, |
|
genericName |
|
]), |
|
lookbehind: true, |
|
inside: typeInside |
|
}, |
|
{ |
|
pattern: re(/(\bcatch\s*\(\s*)<<0>>/.source, [identifier]), |
|
lookbehind: true, |
|
inside: typeInside |
|
}, |
|
{ |
|
pattern: re(/(\bwhere\s+)<<0>>/.source, [name]), |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: re(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source, [typeExpressionWithoutTuple]), |
|
lookbehind: true, |
|
inside: typeInside |
|
}, |
|
{ |
|
pattern: re(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source, [ |
|
typeExpression, |
|
nonContextualKeywords, |
|
name |
|
]), |
|
inside: typeInside |
|
} |
|
], |
|
'keyword': keywords, |
|
'number': /(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i, |
|
'operator': />>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/, |
|
'punctuation': /\?\.?|::|[{}[\];(),.:]/ |
|
}); |
|
Prism.languages.insertBefore('csharp', 'number', { |
|
'range': { |
|
pattern: /\.\./, |
|
alias: 'operator' |
|
} |
|
}); |
|
Prism.languages.insertBefore('csharp', 'punctuation', { |
|
'named-parameter': { |
|
pattern: re(/([(,]\s*)<<0>>(?=\s*:)/.source, [name]), |
|
lookbehind: true, |
|
alias: 'punctuation' |
|
} |
|
}); |
|
Prism.languages.insertBefore('csharp', 'class-name', { |
|
'namespace': { |
|
pattern: re(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source, [name]), |
|
lookbehind: true, |
|
inside: { 'punctuation': /\./ } |
|
}, |
|
'type-expression': { |
|
pattern: re(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source, [nestedRound]), |
|
lookbehind: true, |
|
alias: 'class-name', |
|
inside: typeInside |
|
}, |
|
'return-type': { |
|
pattern: re(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source, [ |
|
typeExpression, |
|
identifier |
|
]), |
|
inside: typeInside, |
|
alias: 'class-name' |
|
}, |
|
'constructor-invocation': { |
|
pattern: re(/(\bnew\s+)<<0>>(?=\s*[[({])/.source, [typeExpression]), |
|
lookbehind: true, |
|
inside: typeInside, |
|
alias: 'class-name' |
|
}, |
|
'generic-method': { |
|
pattern: re(/<<0>>\s*<<1>>(?=\s*\()/.source, [ |
|
name, |
|
generic |
|
]), |
|
inside: { |
|
'function': re(/^<<0>>/.source, [name]), |
|
'generic': { |
|
pattern: RegExp(generic), |
|
alias: 'class-name', |
|
inside: typeInside |
|
} |
|
} |
|
}, |
|
'type-list': { |
|
pattern: re(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source, [ |
|
typeDeclarationKeywords, |
|
genericName, |
|
name, |
|
typeExpression, |
|
keywords.source, |
|
nestedRound, |
|
/\bnew\s*\(\s*\)/.source |
|
]), |
|
lookbehind: true, |
|
inside: { |
|
'record-arguments': { |
|
pattern: re(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source, [ |
|
genericName, |
|
nestedRound |
|
]), |
|
lookbehind: true, |
|
greedy: true, |
|
inside: Prism.languages.csharp |
|
}, |
|
'keyword': keywords, |
|
'class-name': { |
|
pattern: RegExp(typeExpression), |
|
greedy: true, |
|
inside: typeInside |
|
}, |
|
'punctuation': /[,()]/ |
|
} |
|
}, |
|
'preprocessor': { |
|
pattern: /(^[\t ]*)#.*/m, |
|
lookbehind: true, |
|
alias: 'property', |
|
inside: { |
|
'directive': { |
|
pattern: /(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/, |
|
lookbehind: true, |
|
alias: 'keyword' |
|
} |
|
} |
|
} |
|
}); |
|
var regularStringOrCharacter = regularString + '|' + character; |
|
var regularStringCharacterOrComment = replace(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source, [regularStringOrCharacter]); |
|
var roundExpression = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2); |
|
var attrTarget = /\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source; |
|
var attr = replace(/<<0>>(?:\s*\(<<1>>*\))?/.source, [ |
|
identifier, |
|
roundExpression |
|
]); |
|
Prism.languages.insertBefore('csharp', 'class-name', { |
|
'attribute': { |
|
pattern: re(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source, [ |
|
attrTarget, |
|
attr |
|
]), |
|
lookbehind: true, |
|
greedy: true, |
|
inside: { |
|
'target': { |
|
pattern: re(/^<<0>>(?=\s*:)/.source, [attrTarget]), |
|
alias: 'keyword' |
|
}, |
|
'attribute-arguments': { |
|
pattern: re(/\(<<0>>*\)/.source, [roundExpression]), |
|
inside: Prism.languages.csharp |
|
}, |
|
'class-name': { |
|
pattern: RegExp(identifier), |
|
inside: { 'punctuation': /\./ } |
|
}, |
|
'punctuation': /[:,]/ |
|
} |
|
} |
|
}); |
|
var formatString = /:[^}\r\n]+/.source; |
|
var mInterpolationRound = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2); |
|
var mInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [ |
|
mInterpolationRound, |
|
formatString |
|
]); |
|
var sInterpolationRound = nested(replace(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<<self>>*\)/.source, [regularStringOrCharacter]), 2); |
|
var sInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [ |
|
sInterpolationRound, |
|
formatString |
|
]); |
|
function createInterpolationInside(interpolation, interpolationRound) { |
|
return { |
|
'interpolation': { |
|
pattern: re(/((?:^|[^{])(?:\{\{)*)<<0>>/.source, [interpolation]), |
|
lookbehind: true, |
|
inside: { |
|
'format-string': { |
|
pattern: re(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source, [ |
|
interpolationRound, |
|
formatString |
|
]), |
|
lookbehind: true, |
|
inside: { 'punctuation': /^:/ } |
|
}, |
|
'punctuation': /^\{|\}$/, |
|
'expression': { |
|
pattern: /[\s\S]+/, |
|
alias: 'language-csharp', |
|
inside: Prism.languages.csharp |
|
} |
|
} |
|
}, |
|
'string': /[\s\S]+/ |
|
}; |
|
} |
|
Prism.languages.insertBefore('csharp', 'string', { |
|
'interpolation-string': [ |
|
{ |
|
pattern: re(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source, [mInterpolation]), |
|
lookbehind: true, |
|
greedy: true, |
|
inside: createInterpolationInside(mInterpolation, mInterpolationRound) |
|
}, |
|
{ |
|
pattern: re(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source, [sInterpolation]), |
|
lookbehind: true, |
|
greedy: true, |
|
inside: createInterpolationInside(sInterpolation, sInterpolationRound) |
|
} |
|
], |
|
'char': { |
|
pattern: RegExp(character), |
|
greedy: true |
|
} |
|
}); |
|
Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp; |
|
}(Prism)); |
|
(function (Prism) { |
|
var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/; |
|
Prism.languages.css = { |
|
'comment': /\/\*[\s\S]*?\*\//, |
|
'atrule': { |
|
pattern: /@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/, |
|
inside: { |
|
'rule': /^@[\w-]+/, |
|
'selector-function-argument': { |
|
pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/, |
|
lookbehind: true, |
|
alias: 'selector' |
|
}, |
|
'keyword': { |
|
pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, |
|
lookbehind: true |
|
} |
|
} |
|
}, |
|
'url': { |
|
pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'), |
|
greedy: true, |
|
inside: { |
|
'function': /^url/i, |
|
'punctuation': /^\(|\)$/, |
|
'string': { |
|
pattern: RegExp('^' + string.source + '$'), |
|
alias: 'url' |
|
} |
|
} |
|
}, |
|
'selector': { |
|
pattern: RegExp('(^|[{}\\s])[^{}\\s](?:[^{};"\'\\s]|\\s+(?![\\s{])|' + string.source + ')*(?=\\s*\\{)'), |
|
lookbehind: true |
|
}, |
|
'string': { |
|
pattern: string, |
|
greedy: true |
|
}, |
|
'property': { |
|
pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i, |
|
lookbehind: true |
|
}, |
|
'important': /!important\b/i, |
|
'function': { |
|
pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i, |
|
lookbehind: true |
|
}, |
|
'punctuation': /[(){};:,]/ |
|
}; |
|
Prism.languages.css['atrule'].inside.rest = Prism.languages.css; |
|
var markup = Prism.languages.markup; |
|
if (markup) { |
|
markup.tag.addInlined('style', 'css'); |
|
markup.tag.addAttribute('style', 'css'); |
|
} |
|
}(Prism)); |
|
(function (Prism) { |
|
var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; |
|
var classNamePrefix = /(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source; |
|
var className = { |
|
pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source), |
|
lookbehind: true, |
|
inside: { |
|
'namespace': { |
|
pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/, |
|
inside: { 'punctuation': /\./ } |
|
}, |
|
'punctuation': /\./ |
|
} |
|
}; |
|
Prism.languages.java = Prism.languages.extend('clike', { |
|
'string': { |
|
pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"/, |
|
lookbehind: true, |
|
greedy: true |
|
}, |
|
'class-name': [ |
|
className, |
|
{ |
|
pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source), |
|
lookbehind: true, |
|
inside: className.inside |
|
}, |
|
{ |
|
pattern: RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source + classNamePrefix + /[A-Z]\w*\b/.source), |
|
lookbehind: true, |
|
inside: className.inside |
|
} |
|
], |
|
'keyword': keywords, |
|
'function': [ |
|
Prism.languages.clike.function, |
|
{ |
|
pattern: /(::\s*)[a-z_]\w*/, |
|
lookbehind: true |
|
} |
|
], |
|
'number': /\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i, |
|
'operator': { |
|
pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m, |
|
lookbehind: true |
|
} |
|
}); |
|
Prism.languages.insertBefore('java', 'string', { |
|
'triple-quoted-string': { |
|
pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/, |
|
greedy: true, |
|
alias: 'string' |
|
}, |
|
'char': { |
|
pattern: /'(?:\\.|[^'\\\r\n]){1,6}'/, |
|
greedy: true |
|
} |
|
}); |
|
Prism.languages.insertBefore('java', 'class-name', { |
|
'annotation': { |
|
pattern: /(^|[^.])@\w+(?:\s*\.\s*\w+)*/, |
|
lookbehind: true, |
|
alias: 'punctuation' |
|
}, |
|
'generics': { |
|
pattern: /<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/, |
|
inside: { |
|
'class-name': className, |
|
'keyword': keywords, |
|
'punctuation': /[<>(),.:]/, |
|
'operator': /[?&|]/ |
|
} |
|
}, |
|
'import': [ |
|
{ |
|
pattern: RegExp(/(\bimport\s+)/.source + classNamePrefix + /(?:[A-Z]\w*|\*)(?=\s*;)/.source), |
|
lookbehind: true, |
|
inside: { |
|
'namespace': className.inside.namespace, |
|
'punctuation': /\./, |
|
'operator': /\*/, |
|
'class-name': /\w+/ |
|
} |
|
}, |
|
{ |
|
pattern: RegExp(/(\bimport\s+static\s+)/.source + classNamePrefix + /(?:\w+|\*)(?=\s*;)/.source), |
|
lookbehind: true, |
|
alias: 'static', |
|
inside: { |
|
'namespace': className.inside.namespace, |
|
'static': /\b\w+$/, |
|
'punctuation': /\./, |
|
'operator': /\*/, |
|
'class-name': /\w+/ |
|
} |
|
} |
|
], |
|
'namespace': { |
|
pattern: RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g, function () { |
|
return keywords.source; |
|
})), |
|
lookbehind: true, |
|
inside: { 'punctuation': /\./ } |
|
} |
|
}); |
|
}(Prism)); |
|
Prism.languages.javascript = Prism.languages.extend('clike', { |
|
'class-name': [ |
|
Prism.languages.clike['class-name'], |
|
{ |
|
pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/, |
|
lookbehind: true |
|
} |
|
], |
|
'keyword': [ |
|
{ |
|
pattern: /((?:^|\})\s*)catch\b/, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, |
|
lookbehind: true |
|
} |
|
], |
|
'function': /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, |
|
'number': { |
|
pattern: RegExp(/(^|[^\w$])/.source + '(?:' + (/NaN|Infinity/.source + '|' + /0[bB][01]+(?:_[01]+)*n?/.source + '|' + /0[oO][0-7]+(?:_[0-7]+)*n?/.source + '|' + /0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source + '|' + /\d+(?:_\d+)*n/.source + '|' + /(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source) + ')' + /(?![\w$])/.source), |
|
lookbehind: true |
|
}, |
|
'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/ |
|
}); |
|
Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/; |
|
Prism.languages.insertBefore('javascript', 'keyword', { |
|
'regex': { |
|
pattern: RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + /\//.source + '(?:' + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + '|' + /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + ')' + /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source), |
|
lookbehind: true, |
|
greedy: true, |
|
inside: { |
|
'regex-source': { |
|
pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/, |
|
lookbehind: true, |
|
alias: 'language-regex', |
|
inside: Prism.languages.regex |
|
}, |
|
'regex-delimiter': /^\/|\/$/, |
|
'regex-flags': /^[a-z]+$/ |
|
} |
|
}, |
|
'function-variable': { |
|
pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/, |
|
alias: 'function' |
|
}, |
|
'parameter': [ |
|
{ |
|
pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/, |
|
lookbehind: true, |
|
inside: Prism.languages.javascript |
|
}, |
|
{ |
|
pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i, |
|
lookbehind: true, |
|
inside: Prism.languages.javascript |
|
}, |
|
{ |
|
pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/, |
|
lookbehind: true, |
|
inside: Prism.languages.javascript |
|
}, |
|
{ |
|
pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/, |
|
lookbehind: true, |
|
inside: Prism.languages.javascript |
|
} |
|
], |
|
'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ |
|
}); |
|
Prism.languages.insertBefore('javascript', 'string', { |
|
'hashbang': { |
|
pattern: /^#!.*/, |
|
greedy: true, |
|
alias: 'comment' |
|
}, |
|
'template-string': { |
|
pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/, |
|
greedy: true, |
|
inside: { |
|
'template-punctuation': { |
|
pattern: /^`|`$/, |
|
alias: 'string' |
|
}, |
|
'interpolation': { |
|
pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/, |
|
lookbehind: true, |
|
inside: { |
|
'interpolation-punctuation': { |
|
pattern: /^\$\{|\}$/, |
|
alias: 'punctuation' |
|
}, |
|
rest: Prism.languages.javascript |
|
} |
|
}, |
|
'string': /[\s\S]+/ |
|
} |
|
}, |
|
'string-property': { |
|
pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m, |
|
lookbehind: true, |
|
greedy: true, |
|
alias: 'property' |
|
} |
|
}); |
|
Prism.languages.insertBefore('javascript', 'operator', { |
|
'literal-property': { |
|
pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m, |
|
lookbehind: true, |
|
alias: 'property' |
|
} |
|
}); |
|
if (Prism.languages.markup) { |
|
Prism.languages.markup.tag.addInlined('script', 'javascript'); |
|
Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source, 'javascript'); |
|
} |
|
Prism.languages.js = Prism.languages.javascript; |
|
Prism.languages.markup = { |
|
'comment': { |
|
pattern: /<!--(?:(?!<!--)[\s\S])*?-->/, |
|
greedy: true |
|
}, |
|
'prolog': { |
|
pattern: /<\?[\s\S]+?\?>/, |
|
greedy: true |
|
}, |
|
'doctype': { |
|
pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i, |
|
greedy: true, |
|
inside: { |
|
'internal-subset': { |
|
pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/, |
|
lookbehind: true, |
|
greedy: true, |
|
inside: null |
|
}, |
|
'string': { |
|
pattern: /"[^"]*"|'[^']*'/, |
|
greedy: true |
|
}, |
|
'punctuation': /^<!|>$|[[\]]/, |
|
'doctype-tag': /^DOCTYPE/i, |
|
'name': /[^\s<>'"]+/ |
|
} |
|
}, |
|
'cdata': { |
|
pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i, |
|
greedy: true |
|
}, |
|
'tag': { |
|
pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/, |
|
greedy: true, |
|
inside: { |
|
'tag': { |
|
pattern: /^<\/?[^\s>\/]+/, |
|
inside: { |
|
'punctuation': /^<\/?/, |
|
'namespace': /^[^\s>\/:]+:/ |
|
} |
|
}, |
|
'special-attr': [], |
|
'attr-value': { |
|
pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/, |
|
inside: { |
|
'punctuation': [ |
|
{ |
|
pattern: /^=/, |
|
alias: 'attr-equals' |
|
}, |
|
/"|'/ |
|
] |
|
} |
|
}, |
|
'punctuation': /\/?>/, |
|
'attr-name': { |
|
pattern: /[^\s>\/]+/, |
|
inside: { 'namespace': /^[^\s>\/:]+:/ } |
|
} |
|
} |
|
}, |
|
'entity': [ |
|
{ |
|
pattern: /&[\da-z]{1,8};/i, |
|
alias: 'named-entity' |
|
}, |
|
/&#x?[\da-f]{1,8};/i |
|
] |
|
}; |
|
Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity']; |
|
Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup; |
|
Prism.hooks.add('wrap', function (env) { |
|
if (env.type === 'entity') { |
|
env.attributes['title'] = env.content.replace(/&/, '&'); |
|
} |
|
}); |
|
Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { |
|
value: function addInlined(tagName, lang) { |
|
var includedCdataInside = {}; |
|
includedCdataInside['language-' + lang] = { |
|
pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i, |
|
lookbehind: true, |
|
inside: Prism.languages[lang] |
|
}; |
|
includedCdataInside['cdata'] = /^<!\[CDATA\[|\]\]>$/i; |
|
var inside = { |
|
'included-cdata': { |
|
pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i, |
|
inside: includedCdataInside |
|
} |
|
}; |
|
inside['language-' + lang] = { |
|
pattern: /[\s\S]+/, |
|
inside: Prism.languages[lang] |
|
}; |
|
var def = {}; |
|
def[tagName] = { |
|
pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function () { |
|
return tagName; |
|
}), 'i'), |
|
lookbehind: true, |
|
greedy: true, |
|
inside: inside |
|
}; |
|
Prism.languages.insertBefore('markup', 'cdata', def); |
|
} |
|
}); |
|
Object.defineProperty(Prism.languages.markup.tag, 'addAttribute', { |
|
value: function (attrName, lang) { |
|
Prism.languages.markup.tag.inside['special-attr'].push({ |
|
pattern: RegExp(/(^|["'\s])/.source + '(?:' + attrName + ')' + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source, 'i'), |
|
lookbehind: true, |
|
inside: { |
|
'attr-name': /^[^\s=]+/, |
|
'attr-value': { |
|
pattern: /=[\s\S]+/, |
|
inside: { |
|
'value': { |
|
pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/, |
|
lookbehind: true, |
|
alias: [ |
|
lang, |
|
'language-' + lang |
|
], |
|
inside: Prism.languages[lang] |
|
}, |
|
'punctuation': [ |
|
{ |
|
pattern: /^=/, |
|
alias: 'attr-equals' |
|
}, |
|
/"|'/ |
|
] |
|
} |
|
} |
|
} |
|
}); |
|
} |
|
}); |
|
Prism.languages.html = Prism.languages.markup; |
|
Prism.languages.mathml = Prism.languages.markup; |
|
Prism.languages.svg = Prism.languages.markup; |
|
Prism.languages.xml = Prism.languages.extend('markup', {}); |
|
Prism.languages.ssml = Prism.languages.xml; |
|
Prism.languages.atom = Prism.languages.xml; |
|
Prism.languages.rss = Prism.languages.xml; |
|
(function (Prism) { |
|
var comment = /\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/; |
|
var constant = [ |
|
{ |
|
pattern: /\b(?:false|true)\b/i, |
|
alias: 'boolean' |
|
}, |
|
{ |
|
pattern: /(::\s*)\b[a-z_]\w*\b(?!\s*\()/i, |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i, |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
/\b(?:null)\b/i, |
|
/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/ |
|
]; |
|
var number = /\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i; |
|
var operator = /<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/; |
|
var punctuation = /[{}\[\](),:;]/; |
|
Prism.languages.php = { |
|
'delimiter': { |
|
pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i, |
|
alias: 'important' |
|
}, |
|
'comment': comment, |
|
'variable': /\$+(?:\w+\b|(?=\{))/, |
|
'package': { |
|
pattern: /(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i, |
|
lookbehind: true, |
|
inside: { 'punctuation': /\\/ } |
|
}, |
|
'class-name-definition': { |
|
pattern: /(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i, |
|
lookbehind: true, |
|
alias: 'class-name' |
|
}, |
|
'function-definition': { |
|
pattern: /(\bfunction\s+)[a-z_]\w*(?=\s*\()/i, |
|
lookbehind: true, |
|
alias: 'function' |
|
}, |
|
'keyword': [ |
|
{ |
|
pattern: /(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i, |
|
alias: 'type-casting', |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i, |
|
alias: 'type-hint', |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i, |
|
alias: 'return-type', |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i, |
|
alias: 'type-declaration', |
|
greedy: true |
|
}, |
|
{ |
|
pattern: /(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i, |
|
alias: 'type-declaration', |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /\b(?:parent|self|static)(?=\s*::)/i, |
|
alias: 'static-context', |
|
greedy: true |
|
}, |
|
{ |
|
pattern: /(\byield\s+)from\b/i, |
|
lookbehind: true |
|
}, |
|
/\bclass\b/i, |
|
{ |
|
pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i, |
|
lookbehind: true |
|
} |
|
], |
|
'argument-name': { |
|
pattern: /([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i, |
|
lookbehind: true |
|
}, |
|
'class-name': [ |
|
{ |
|
pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i, |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /(\|\s*)\b[a-z_]\w*(?!\\)\b/i, |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i, |
|
greedy: true |
|
}, |
|
{ |
|
pattern: /(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i, |
|
alias: 'class-name-fully-qualified', |
|
greedy: true, |
|
lookbehind: true, |
|
inside: { 'punctuation': /\\/ } |
|
}, |
|
{ |
|
pattern: /(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i, |
|
alias: 'class-name-fully-qualified', |
|
greedy: true, |
|
inside: { 'punctuation': /\\/ } |
|
}, |
|
{ |
|
pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i, |
|
alias: 'class-name-fully-qualified', |
|
greedy: true, |
|
lookbehind: true, |
|
inside: { 'punctuation': /\\/ } |
|
}, |
|
{ |
|
pattern: /\b[a-z_]\w*(?=\s*\$)/i, |
|
alias: 'type-declaration', |
|
greedy: true |
|
}, |
|
{ |
|
pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i, |
|
alias: [ |
|
'class-name-fully-qualified', |
|
'type-declaration' |
|
], |
|
greedy: true, |
|
inside: { 'punctuation': /\\/ } |
|
}, |
|
{ |
|
pattern: /\b[a-z_]\w*(?=\s*::)/i, |
|
alias: 'static-context', |
|
greedy: true |
|
}, |
|
{ |
|
pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*::)/i, |
|
alias: [ |
|
'class-name-fully-qualified', |
|
'static-context' |
|
], |
|
greedy: true, |
|
inside: { 'punctuation': /\\/ } |
|
}, |
|
{ |
|
pattern: /([(,?]\s*)[a-z_]\w*(?=\s*\$)/i, |
|
alias: 'type-hint', |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i, |
|
alias: [ |
|
'class-name-fully-qualified', |
|
'type-hint' |
|
], |
|
greedy: true, |
|
lookbehind: true, |
|
inside: { 'punctuation': /\\/ } |
|
}, |
|
{ |
|
pattern: /(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i, |
|
alias: 'return-type', |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i, |
|
alias: [ |
|
'class-name-fully-qualified', |
|
'return-type' |
|
], |
|
greedy: true, |
|
lookbehind: true, |
|
inside: { 'punctuation': /\\/ } |
|
} |
|
], |
|
'constant': constant, |
|
'function': { |
|
pattern: /(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i, |
|
lookbehind: true, |
|
inside: { 'punctuation': /\\/ } |
|
}, |
|
'property': { |
|
pattern: /(->\s*)\w+/, |
|
lookbehind: true |
|
}, |
|
'number': number, |
|
'operator': operator, |
|
'punctuation': punctuation |
|
}; |
|
var string_interpolation = { |
|
pattern: /\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/, |
|
lookbehind: true, |
|
inside: Prism.languages.php |
|
}; |
|
var string = [ |
|
{ |
|
pattern: /<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/, |
|
alias: 'nowdoc-string', |
|
greedy: true, |
|
inside: { |
|
'delimiter': { |
|
pattern: /^<<<'[^']+'|[a-z_]\w*;$/i, |
|
alias: 'symbol', |
|
inside: { 'punctuation': /^<<<'?|[';]$/ } |
|
} |
|
} |
|
}, |
|
{ |
|
pattern: /<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i, |
|
alias: 'heredoc-string', |
|
greedy: true, |
|
inside: { |
|
'delimiter': { |
|
pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i, |
|
alias: 'symbol', |
|
inside: { 'punctuation': /^<<<"?|[";]$/ } |
|
}, |
|
'interpolation': string_interpolation |
|
} |
|
}, |
|
{ |
|
pattern: /`(?:\\[\s\S]|[^\\`])*`/, |
|
alias: 'backtick-quoted-string', |
|
greedy: true |
|
}, |
|
{ |
|
pattern: /'(?:\\[\s\S]|[^\\'])*'/, |
|
alias: 'single-quoted-string', |
|
greedy: true |
|
}, |
|
{ |
|
pattern: /"(?:\\[\s\S]|[^\\"])*"/, |
|
alias: 'double-quoted-string', |
|
greedy: true, |
|
inside: { 'interpolation': string_interpolation } |
|
} |
|
]; |
|
Prism.languages.insertBefore('php', 'variable', { |
|
'string': string, |
|
'attribute': { |
|
pattern: /#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im, |
|
greedy: true, |
|
inside: { |
|
'attribute-content': { |
|
pattern: /^(#\[)[\s\S]+(?=\]$)/, |
|
lookbehind: true, |
|
inside: { |
|
'comment': comment, |
|
'string': string, |
|
'attribute-class-name': [ |
|
{ |
|
pattern: /([^:]|^)\b[a-z_]\w*(?!\\)\b/i, |
|
alias: 'class-name', |
|
greedy: true, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /([^:]|^)(?:\\?\b[a-z_]\w*)+/i, |
|
alias: [ |
|
'class-name', |
|
'class-name-fully-qualified' |
|
], |
|
greedy: true, |
|
lookbehind: true, |
|
inside: { 'punctuation': /\\/ } |
|
} |
|
], |
|
'constant': constant, |
|
'number': number, |
|
'operator': operator, |
|
'punctuation': punctuation |
|
} |
|
}, |
|
'delimiter': { |
|
pattern: /^#\[|\]$/, |
|
alias: 'punctuation' |
|
} |
|
} |
|
} |
|
}); |
|
Prism.hooks.add('before-tokenize', function (env) { |
|
if (!/<\?/.test(env.code)) { |
|
return; |
|
} |
|
var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g; |
|
Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern); |
|
}); |
|
Prism.hooks.add('after-tokenize', function (env) { |
|
Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php'); |
|
}); |
|
}(Prism)); |
|
Prism.languages.python = { |
|
'comment': { |
|
pattern: /(^|[^\\])#.*/, |
|
lookbehind: true, |
|
greedy: true |
|
}, |
|
'string-interpolation': { |
|
pattern: /(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, |
|
greedy: true, |
|
inside: { |
|
'interpolation': { |
|
pattern: /((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/, |
|
lookbehind: true, |
|
inside: { |
|
'format-spec': { |
|
pattern: /(:)[^:(){}]+(?=\}$)/, |
|
lookbehind: true |
|
}, |
|
'conversion-option': { |
|
pattern: //, |
|
alias: 'punctuation' |
|
}, |
|
rest: null |
|
} |
|
}, |
|
'string': /[\s\S]+/ |
|
} |
|
}, |
|
'triple-quoted-string': { |
|
pattern: /(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i, |
|
greedy: true, |
|
alias: 'string' |
|
}, |
|
'string': { |
|
pattern: /(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, |
|
greedy: true |
|
}, |
|
'function': { |
|
pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, |
|
lookbehind: true |
|
}, |
|
'class-name': { |
|
pattern: /(\bclass\s+)\w+/i, |
|
lookbehind: true |
|
}, |
|
'decorator': { |
|
pattern: /(^[\t ]*)@\w+(?:\.\w+)*/m, |
|
lookbehind: true, |
|
alias: [ |
|
'annotation', |
|
'punctuation' |
|
], |
|
inside: { 'punctuation': /\./ } |
|
}, |
|
'keyword': /\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, |
|
'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/, |
|
'boolean': /\b(?:False|None|True)\b/, |
|
'number': /\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i, |
|
'operator': /[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, |
|
'punctuation': /[{}[\];(),.:]/ |
|
}; |
|
Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python; |
|
Prism.languages.py = Prism.languages.python; |
|
(function (Prism) { |
|
Prism.languages.ruby = Prism.languages.extend('clike', { |
|
'comment': { |
|
pattern: /#.*|^=begin\s[\s\S]*?^=end/m, |
|
greedy: true |
|
}, |
|
'class-name': { |
|
pattern: /(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/, |
|
lookbehind: true, |
|
inside: { 'punctuation': /[.\\]/ } |
|
}, |
|
'keyword': /\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/, |
|
'operator': /\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/, |
|
'punctuation': /[(){}[\].,;]/ |
|
}); |
|
Prism.languages.insertBefore('ruby', 'operator', { |
|
'double-colon': { |
|
pattern: /::/, |
|
alias: 'punctuation' |
|
} |
|
}); |
|
var interpolation = { |
|
pattern: /((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/, |
|
lookbehind: true, |
|
inside: { |
|
'content': { |
|
pattern: /^(#\{)[\s\S]+(?=\}$)/, |
|
lookbehind: true, |
|
inside: Prism.languages.ruby |
|
}, |
|
'delimiter': { |
|
pattern: /^#\{|\}$/, |
|
alias: 'punctuation' |
|
} |
|
} |
|
}; |
|
delete Prism.languages.ruby.function; |
|
var percentExpression = '(?:' + [ |
|
/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source, |
|
/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source, |
|
/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source, |
|
/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source, |
|
/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source |
|
].join('|') + ')'; |
|
var symbolName = /(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source; |
|
Prism.languages.insertBefore('ruby', 'keyword', { |
|
'regex-literal': [ |
|
{ |
|
pattern: RegExp(/%r/.source + percentExpression + /[egimnosux]{0,6}/.source), |
|
greedy: true, |
|
inside: { |
|
'interpolation': interpolation, |
|
'regex': /[\s\S]+/ |
|
} |
|
}, |
|
{ |
|
pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/, |
|
lookbehind: true, |
|
greedy: true, |
|
inside: { |
|
'interpolation': interpolation, |
|
'regex': /[\s\S]+/ |
|
} |
|
} |
|
], |
|
'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, |
|
'symbol': [ |
|
{ |
|
pattern: RegExp(/(^|[^:]):/.source + symbolName), |
|
lookbehind: true, |
|
greedy: true |
|
}, |
|
{ |
|
pattern: RegExp(/([\r\n{(,][ \t]*)/.source + symbolName + /(?=:(?!:))/.source), |
|
lookbehind: true, |
|
greedy: true |
|
} |
|
], |
|
'method-definition': { |
|
pattern: /(\bdef\s+)\w+(?:\s*\.\s*\w+)?/, |
|
lookbehind: true, |
|
inside: { |
|
'function': /\b\w+$/, |
|
'keyword': /^self\b/, |
|
'class-name': /^\w+/, |
|
'punctuation': /\./ |
|
} |
|
} |
|
}); |
|
Prism.languages.insertBefore('ruby', 'string', { |
|
'string-literal': [ |
|
{ |
|
pattern: RegExp(/%[qQiIwWs]?/.source + percentExpression), |
|
greedy: true, |
|
inside: { |
|
'interpolation': interpolation, |
|
'string': /[\s\S]+/ |
|
} |
|
}, |
|
{ |
|
pattern: /("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/, |
|
greedy: true, |
|
inside: { |
|
'interpolation': interpolation, |
|
'string': /[\s\S]+/ |
|
} |
|
}, |
|
{ |
|
pattern: /<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i, |
|
alias: 'heredoc-string', |
|
greedy: true, |
|
inside: { |
|
'delimiter': { |
|
pattern: /^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i, |
|
inside: { |
|
'symbol': /\b\w+/, |
|
'punctuation': /^<<[-~]?/ |
|
} |
|
}, |
|
'interpolation': interpolation, |
|
'string': /[\s\S]+/ |
|
} |
|
}, |
|
{ |
|
pattern: /<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i, |
|
alias: 'heredoc-string', |
|
greedy: true, |
|
inside: { |
|
'delimiter': { |
|
pattern: /^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i, |
|
inside: { |
|
'symbol': /\b\w+/, |
|
'punctuation': /^<<[-~]?'|'$/ |
|
} |
|
}, |
|
'string': /[\s\S]+/ |
|
} |
|
} |
|
], |
|
'command-literal': [ |
|
{ |
|
pattern: RegExp(/%x/.source + percentExpression), |
|
greedy: true, |
|
inside: { |
|
'interpolation': interpolation, |
|
'command': { |
|
pattern: /[\s\S]+/, |
|
alias: 'string' |
|
} |
|
} |
|
}, |
|
{ |
|
pattern: /`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/, |
|
greedy: true, |
|
inside: { |
|
'interpolation': interpolation, |
|
'command': { |
|
pattern: /[\s\S]+/, |
|
alias: 'string' |
|
} |
|
} |
|
} |
|
] |
|
}); |
|
delete Prism.languages.ruby.string; |
|
Prism.languages.insertBefore('ruby', 'number', { |
|
'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/, |
|
'constant': /\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/ |
|
}); |
|
Prism.languages.rb = Prism.languages.ruby; |
|
}(Prism)); |
|
window.Prism = oldprism; |
|
return Prism; |
|
}(undefined, undefined); |
|
|
|
const option = name => editor => editor.options.get(name); |
|
const register$2 = editor => { |
|
const registerOption = editor.options.register; |
|
registerOption('codesample_languages', { processor: 'object[]' }); |
|
registerOption('codesample_global_prismjs', { |
|
processor: 'boolean', |
|
default: false |
|
}); |
|
}; |
|
const getLanguages$1 = option('codesample_languages'); |
|
const useGlobalPrismJS = option('codesample_global_prismjs'); |
|
|
|
const get = editor => Global.Prism && useGlobalPrismJS(editor) ? Global.Prism : prismjs; |
|
|
|
const isCodeSample = elm => { |
|
return isNonNullable(elm) && elm.nodeName === 'PRE' && elm.className.indexOf('language-') !== -1; |
|
}; |
|
|
|
const getSelectedCodeSample = editor => { |
|
const node = editor.selection ? editor.selection.getNode() : null; |
|
return isCodeSample(node) ? Optional.some(node) : Optional.none(); |
|
}; |
|
const insertCodeSample = (editor, language, code) => { |
|
const dom = editor.dom; |
|
editor.undoManager.transact(() => { |
|
const node = getSelectedCodeSample(editor); |
|
code = global$1.DOM.encode(code); |
|
return node.fold(() => { |
|
editor.insertContent('<pre id="__new" class="language-' + language + '">' + code + '</pre>'); |
|
const newPre = dom.select('#__new')[0]; |
|
dom.setAttrib(newPre, 'id', null); |
|
editor.selection.select(newPre); |
|
}, n => { |
|
dom.setAttrib(n, 'class', 'language-' + language); |
|
n.innerHTML = code; |
|
get(editor).highlightElement(n); |
|
editor.selection.select(n); |
|
}); |
|
}); |
|
}; |
|
const getCurrentCode = editor => { |
|
const node = getSelectedCodeSample(editor); |
|
return node.bind(n => Optional.from(n.textContent)).getOr(''); |
|
}; |
|
|
|
const getLanguages = editor => { |
|
const defaultLanguages = [ |
|
{ |
|
text: 'HTML/XML', |
|
value: 'markup' |
|
}, |
|
{ |
|
text: 'JavaScript', |
|
value: 'javascript' |
|
}, |
|
{ |
|
text: 'CSS', |
|
value: 'css' |
|
}, |
|
{ |
|
text: 'PHP', |
|
value: 'php' |
|
}, |
|
{ |
|
text: 'Ruby', |
|
value: 'ruby' |
|
}, |
|
{ |
|
text: 'Python', |
|
value: 'python' |
|
}, |
|
{ |
|
text: 'Java', |
|
value: 'java' |
|
}, |
|
{ |
|
text: 'C', |
|
value: 'c' |
|
}, |
|
{ |
|
text: 'C#', |
|
value: 'csharp' |
|
}, |
|
{ |
|
text: 'C++', |
|
value: 'cpp' |
|
} |
|
]; |
|
const customLanguages = getLanguages$1(editor); |
|
return customLanguages ? customLanguages : defaultLanguages; |
|
}; |
|
const getCurrentLanguage = (editor, fallback) => { |
|
const node = getSelectedCodeSample(editor); |
|
return node.fold(() => fallback, n => { |
|
const matches = n.className.match(/language-(\w+)/); |
|
return matches ? matches[1] : fallback; |
|
}); |
|
}; |
|
|
|
const open = editor => { |
|
const languages = getLanguages(editor); |
|
const defaultLanguage = head(languages).fold(constant(''), l => l.value); |
|
const currentLanguage = getCurrentLanguage(editor, defaultLanguage); |
|
const currentCode = getCurrentCode(editor); |
|
editor.windowManager.open({ |
|
title: 'Insert/Edit Code Sample', |
|
size: 'large', |
|
body: { |
|
type: 'panel', |
|
items: [ |
|
{ |
|
type: 'selectbox', |
|
name: 'language', |
|
label: 'Language', |
|
items: languages |
|
}, |
|
{ |
|
type: 'textarea', |
|
name: 'code', |
|
label: 'Code view' |
|
} |
|
] |
|
}, |
|
buttons: [ |
|
{ |
|
type: 'cancel', |
|
name: 'cancel', |
|
text: 'Cancel' |
|
}, |
|
{ |
|
type: 'submit', |
|
name: 'save', |
|
text: 'Save', |
|
primary: true |
|
} |
|
], |
|
initialData: { |
|
language: currentLanguage, |
|
code: currentCode |
|
}, |
|
onSubmit: api => { |
|
const data = api.getData(); |
|
insertCodeSample(editor, data.language, data.code); |
|
api.close(); |
|
} |
|
}); |
|
}; |
|
|
|
const register$1 = editor => { |
|
editor.addCommand('codesample', () => { |
|
const node = editor.selection.getNode(); |
|
if (editor.selection.isCollapsed() || isCodeSample(node)) { |
|
open(editor); |
|
} else { |
|
editor.formatter.toggle('code'); |
|
} |
|
}); |
|
}; |
|
|
|
const blank = r => s => s.replace(r, ''); |
|
const trim = blank(/^\s+|\s+$/g); |
|
|
|
var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); |
|
|
|
const setup = editor => { |
|
editor.on('PreProcess', e => { |
|
const dom = editor.dom; |
|
const pres = dom.select('pre[contenteditable=false]', e.node); |
|
global.each(global.grep(pres, isCodeSample), elm => { |
|
const code = elm.textContent; |
|
dom.setAttrib(elm, 'class', trim(dom.getAttrib(elm, 'class'))); |
|
dom.setAttrib(elm, 'contentEditable', null); |
|
dom.setAttrib(elm, 'data-mce-highlighted', null); |
|
let child; |
|
while (child = elm.firstChild) { |
|
elm.removeChild(child); |
|
} |
|
const codeElm = dom.add(elm, 'code'); |
|
codeElm.textContent = code; |
|
}); |
|
}); |
|
editor.on('SetContent', () => { |
|
const dom = editor.dom; |
|
const unprocessedCodeSamples = global.grep(dom.select('pre'), elm => { |
|
return isCodeSample(elm) && dom.getAttrib(elm, 'data-mce-highlighted') !== 'true'; |
|
}); |
|
if (unprocessedCodeSamples.length) { |
|
editor.undoManager.transact(() => { |
|
global.each(unprocessedCodeSamples, elm => { |
|
var _a; |
|
global.each(dom.select('br', elm), elm => { |
|
dom.replace(editor.getDoc().createTextNode('\n'), elm); |
|
}); |
|
elm.innerHTML = dom.encode((_a = elm.textContent) !== null && _a !== void 0 ? _a : ''); |
|
get(editor).highlightElement(elm); |
|
dom.setAttrib(elm, 'data-mce-highlighted', true); |
|
elm.className = trim(elm.className); |
|
}); |
|
}); |
|
} |
|
}); |
|
editor.on('PreInit', () => { |
|
editor.parser.addNodeFilter('pre', nodes => { |
|
var _a; |
|
for (let i = 0, l = nodes.length; i < l; i++) { |
|
const node = nodes[i]; |
|
const isCodeSample = ((_a = node.attr('class')) !== null && _a !== void 0 ? _a : '').indexOf('language-') !== -1; |
|
if (isCodeSample) { |
|
node.attr('contenteditable', 'false'); |
|
node.attr('data-mce-highlighted', 'false'); |
|
} |
|
} |
|
}); |
|
}); |
|
}; |
|
|
|
const isCodeSampleSelection = editor => { |
|
const node = editor.selection.getStart(); |
|
return editor.dom.is(node, 'pre[class*="language-"]'); |
|
}; |
|
const register = editor => { |
|
const onAction = () => editor.execCommand('codesample'); |
|
editor.ui.registry.addToggleButton('codesample', { |
|
icon: 'code-sample', |
|
tooltip: 'Insert/edit code sample', |
|
onAction, |
|
onSetup: api => { |
|
const nodeChangeHandler = () => { |
|
api.setActive(isCodeSampleSelection(editor)); |
|
}; |
|
editor.on('NodeChange', nodeChangeHandler); |
|
return () => editor.off('NodeChange', nodeChangeHandler); |
|
} |
|
}); |
|
editor.ui.registry.addMenuItem('codesample', { |
|
text: 'Code sample...', |
|
icon: 'code-sample', |
|
onAction |
|
}); |
|
}; |
|
|
|
var Plugin = () => { |
|
global$2.add('codesample', editor => { |
|
register$2(editor); |
|
setup(editor); |
|
register(editor); |
|
register$1(editor); |
|
editor.on('dblclick', ev => { |
|
if (isCodeSample(ev.target)) { |
|
open(editor); |
|
} |
|
}); |
|
}); |
|
}; |
|
|
|
Plugin(); |
|
|
|
})();
|
|
|