diff options
| author | Armand Philippot <git@armandphilippot.com> | 2021-12-30 19:47:21 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2021-12-30 19:47:21 +0100 |
| commit | a98b5ea6fe8e8cc98a55e0fd793e6e8660ea31c1 (patch) | |
| tree | 542810ab5aef99150db228bb54fd58303dcb31c7 /public/prism/prism-kumir.js | |
| parent | ab355897a12b7bda1089a44de326d41455a0f7a3 (diff) | |
chore: add prismjs for syntax highlighting
Diffstat (limited to 'public/prism/prism-kumir.js')
| -rw-r--r-- | public/prism/prism-kumir.js | 119 |
1 files changed, 119 insertions, 0 deletions
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(/<nonId>/g, nonId), flags); + } + + Prism.languages.kumir = { + comment: { + pattern: /\|.*/, + }, + + prolog: { + pattern: /#.*/, + greedy: true, + }, + + string: { + pattern: /"[^\n\r"]*"|'[^\n\r']*'/, + greedy: true, + }, + + boolean: { + pattern: wrapId(/(^|[<nonId>])(?:да|нет)(?=[<nonId>]|$)/.source), + lookbehind: true, + }, + + 'operator-word': { + pattern: wrapId(/(^|[<nonId>])(?:и|или|не)(?=[<nonId>]|$)/.source), + lookbehind: true, + alias: 'keyword', + }, + + 'system-variable': { + pattern: wrapId(/(^|[<nonId>])знач(?=[<nonId>]|$)/.source), + lookbehind: true, + alias: 'keyword', + }, + + type: [ + { + pattern: wrapId( + /(^|[<nonId>])(?:вещ|лит|лог|сим|цел)(?:\x20*таб)?(?=[<nonId>]|$)/ + .source + ), + lookbehind: true, + alias: 'builtin', + }, + { + pattern: wrapId( + /(^|[<nonId>])(?:компл|сканкод|файл|цвет)(?=[<nonId>]|$)/.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( + /(^|[<nonId>])(?:алг|арг(?:\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\x20+|_)исп)?|кц(?:(?:\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[<nonId>]|$)/ + .source + ), + lookbehind: true, + }, + + /** Should be performed after searching for reserved words. */ + name: { + // eslint-disable-next-line regexp/no-super-linear-backtracking + pattern: wrapId( + /(^|[<nonId>])[^\d<nonId>][^<nonId>]*(?:\x20+[^<nonId>]+)*(?=[<nonId>]|$)/ + .source + ), + lookbehind: true, + }, + + /** Should be performed after searching for names. */ + number: { + pattern: wrapId( + /(^|[<nonId>])(?:\B\$[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?=[<nonId>]|$)/ + .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); |
