From a98b5ea6fe8e8cc98a55e0fd793e6e8660ea31c1 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Thu, 30 Dec 2021 19:47:21 +0100 Subject: chore: add prismjs for syntax highlighting --- public/prism/prism-kumir.js | 119 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 public/prism/prism-kumir.js (limited to 'public/prism/prism-kumir.js') diff --git a/public/prism/prism-kumir.js b/public/prism/prism-kumir.js new file mode 100644 index 0000000..6705e38 --- /dev/null +++ b/public/prism/prism-kumir.js @@ -0,0 +1,119 @@ +/* eslint-disable regexp/no-dupe-characters-character-class */ +(function (Prism) { + /** + * Regular expression for characters that are not allowed in identifiers. + * + * @type {string} + */ + var nonId = /\s\x00-\x1f\x22-\x2f\x3a-\x3f\x5b-\x5e\x60\x7b-\x7e/.source; + + /** + * Surround a regular expression for IDs with patterns for non-ID sequences. + * + * @param {string} pattern A regular expression for identifiers. + * @param {string} [flags] The regular expression flags. + * @returns {RegExp} A wrapped regular expression for identifiers. + */ + function wrapId(pattern, flags) { + return RegExp(pattern.replace(//g, nonId), flags); + } + + Prism.languages.kumir = { + comment: { + pattern: /\|.*/, + }, + + prolog: { + pattern: /#.*/, + greedy: true, + }, + + string: { + pattern: /"[^\n\r"]*"|'[^\n\r']*'/, + greedy: true, + }, + + boolean: { + pattern: wrapId(/(^|[])(?:да|нет)(?=[]|$)/.source), + lookbehind: true, + }, + + 'operator-word': { + pattern: wrapId(/(^|[])(?:и|или|не)(?=[]|$)/.source), + lookbehind: true, + alias: 'keyword', + }, + + 'system-variable': { + pattern: wrapId(/(^|[])знач(?=[]|$)/.source), + lookbehind: true, + alias: 'keyword', + }, + + type: [ + { + pattern: wrapId( + /(^|[])(?:вещ|лит|лог|сим|цел)(?:\x20*таб)?(?=[]|$)/ + .source + ), + lookbehind: true, + alias: 'builtin', + }, + { + pattern: wrapId( + /(^|[])(?:компл|сканкод|файл|цвет)(?=[]|$)/.source + ), + lookbehind: true, + alias: 'important', + }, + ], + + /** + * Should be performed after searching for type names because of "таб". + * "таб" is a reserved word, but never used without a preceding type name. + * "НАЗНАЧИТЬ", "Фввод", and "Фвывод" are not reserved words. + */ + keyword: { + pattern: wrapId( + /(^|[])(?:алг|арг(?:\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\x20+|_)исп)?|кц(?:(?:\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[]|$)/ + .source + ), + lookbehind: true, + }, + + /** Should be performed after searching for reserved words. */ + name: { + // eslint-disable-next-line regexp/no-super-linear-backtracking + pattern: wrapId( + /(^|[])[^\d][^]*(?:\x20+[^]+)*(?=[]|$)/ + .source + ), + lookbehind: true, + }, + + /** Should be performed after searching for names. */ + number: { + pattern: wrapId( + /(^|[])(?:\B\$[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?=[]|$)/ + .source, + 'i' + ), + lookbehind: true, + }, + + /** Should be performed after searching for words. */ + punctuation: /:=|[(),:;\[\]]/, + + /** + * Should be performed after searching for + * - numeric constants (because of "+" and "-"); + * - punctuation marks (because of ":=" and "="). + */ + 'operator-char': { + pattern: /\*\*?|<[=>]?|>=?|[-+/=]/, + alias: 'operator', + }, + }; + + Prism.languages.kum = Prism.languages.kumir; +})(Prism); -- cgit v1.2.3