Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add KuMir #2760

Merged
merged 4 commits into from Feb 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion components.js

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions components.json
Expand Up @@ -661,6 +661,11 @@
"require": "clike",
"owner": "Golmote"
},
"kumir": {
"title": "KuMir (КуМир)",
"alias": "kum",
"owner": "edukisto"
},
"latex": {
"title": "LaTeX",
"alias": ["tex", "context"],
Expand Down
102 changes: 102 additions & 0 deletions components/prism-kumir.js
@@ -0,0 +1,102 @@
(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': {
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));
1 change: 1 addition & 0 deletions components/prism-kumir.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

61 changes: 61 additions & 0 deletions examples/prism-kumir.html
@@ -0,0 +1,61 @@
<h2>Example</h2>

<pre><code>алг
нач
| Решение квадратного уравнения.
вещ a, b, c
вещ таб корни[1:2]
цел индекс, число корней
вывод "Укажите первый коэффициент: "
ввод a
вывод нс, "Укажите второй коэффициент: "
ввод b
вывод нс, "Укажите свободный член: "
ввод c
решить квур(a, b, c, число корней, корни)
если число корней = -1
то
вывод нс, "Первый коэффициент не может быть равен нулю.", нс
иначе
если число корней = 0
то
вывод нс, "Уравнение не имеет корней.", нс
иначе
если число корней = 1
то
вывод нс, "Уравнение имеет один корень.", нс
вывод "x = ", корни[1], нс
иначе
вывод нс, "Уравнение имеет два корня.", нс
нц для индекс от 1 до число корней шаг 1
вывод "x", индекс, " = ", корни[индекс], нс
кц
все
все
все
кон

алг решить квур(арг вещ a, b, c, арг рез цел число корней, арг рез вещ таб корни[1:2])
нач
вещ дискриминант
если a = 0
то
число корней := -1
иначе
дискриминант := b**2 - 4 * a * c
если дискриминант > 0
то
корни[1] := (-b - sqrt(дискриминант)) / (2 * a)
корни[2] := (-b + sqrt(дискриминант)) / (2 * a)
число корней := 2
иначе
если дискриминант = 0
то
корни[1] := -b / (2 * a)
число корней := 1
иначе
число корней := 0
все
все
все
кон</code></pre>
1 change: 1 addition & 0 deletions plugins/autoloader/prism-autoloader.js
Expand Up @@ -190,6 +190,7 @@
"webmanifest": "json",
"kt": "kotlin",
"kts": "kotlin",
"kum": "kumir",
"tex": "latex",
"context": "latex",
"ly": "lilypond",
Expand Down
2 changes: 1 addition & 1 deletion plugins/autoloader/prism-autoloader.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions plugins/show-language/prism-show-language.js
Expand Up @@ -106,6 +106,8 @@
"js-templates": "JS Templates",
"kts": "Kotlin Script",
"kt": "Kotlin",
"kumir": "KuMir (КуМир)",
"kum": "KuMir (КуМир)",
"latex": "LaTeX",
"tex": "TeX",
"context": "ConTeXt",
Expand Down