2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Module: Text descriptors for UI and model elements.
|
2023-12-28 14:04:44 +03:00
|
|
|
|
*
|
2023-11-17 20:51:13 +03:00
|
|
|
|
* Label is a short text used to represent an entity.
|
|
|
|
|
* Description is a long description used in tooltips.
|
|
|
|
|
*/
|
2024-04-07 19:22:19 +03:00
|
|
|
|
import { GraphLayout } from '@/components/ui/GraphUI';
|
2023-12-28 14:04:44 +03:00
|
|
|
|
import { GramData, Grammeme, ReferenceType } from '@/models/language';
|
2024-06-02 23:41:46 +03:00
|
|
|
|
import { AccessPolicy, LocationHead } from '@/models/library';
|
|
|
|
|
import { CstMatchMode, DependencyMode, GraphColoring, GraphSizing, HelpTopic } from '@/models/miscellaneous';
|
2024-03-08 18:39:08 +03:00
|
|
|
|
import { CstClass, CstType, ExpressionStatus, IConstituenta, IRSForm } from '@/models/rsform';
|
2023-12-27 19:34:39 +03:00
|
|
|
|
import {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
IArgumentInfo,
|
|
|
|
|
IRSErrorDescription,
|
|
|
|
|
ISyntaxTreeNode,
|
|
|
|
|
ParsingStatus,
|
|
|
|
|
RSErrorType,
|
|
|
|
|
TokenID
|
2023-12-27 19:34:39 +03:00
|
|
|
|
} from '@/models/rslang';
|
2024-05-27 20:42:34 +03:00
|
|
|
|
import { UserLevel } from '@/models/user';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
2023-12-26 14:23:51 +03:00
|
|
|
|
* Generates description for {@link IConstituenta}.
|
2023-11-17 20:51:13 +03:00
|
|
|
|
*/
|
2023-09-21 14:58:01 +03:00
|
|
|
|
export function describeConstituenta(cst: IConstituenta): string {
|
|
|
|
|
if (cst.cst_type === CstType.STRUCTURED) {
|
|
|
|
|
return (
|
2023-12-28 14:04:44 +03:00
|
|
|
|
cst.term_resolved ||
|
|
|
|
|
cst.term_raw ||
|
|
|
|
|
cst.definition_resolved ||
|
|
|
|
|
cst.definition_raw ||
|
2023-09-21 14:58:01 +03:00
|
|
|
|
cst.convention ||
|
|
|
|
|
cst.definition_formal
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
return (
|
2023-12-28 14:04:44 +03:00
|
|
|
|
cst.term_resolved ||
|
|
|
|
|
cst.term_raw ||
|
|
|
|
|
cst.definition_resolved ||
|
|
|
|
|
cst.definition_raw ||
|
2023-09-21 14:58:01 +03:00
|
|
|
|
cst.definition_formal ||
|
|
|
|
|
cst.convention
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
2023-12-26 14:23:51 +03:00
|
|
|
|
* Generates description for term of a given {@link IConstituenta}.
|
2023-11-17 20:51:13 +03:00
|
|
|
|
*/
|
|
|
|
|
export function describeConstituentaTerm(cst?: IConstituenta): string {
|
2023-09-27 23:36:51 +03:00
|
|
|
|
if (!cst) {
|
|
|
|
|
return '!Конституента отсутствует!';
|
|
|
|
|
}
|
|
|
|
|
if (!cst.term_resolved) {
|
|
|
|
|
return '!Пустой термин!';
|
|
|
|
|
} else {
|
|
|
|
|
return cst.term_resolved;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Generates label for {@link IConstituenta}.
|
|
|
|
|
*/
|
2023-09-21 14:58:01 +03:00
|
|
|
|
export function labelConstituenta(cst: IConstituenta) {
|
|
|
|
|
return `${cst.alias}: ${describeConstituenta(cst)}`;
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-20 19:49:45 +03:00
|
|
|
|
/**
|
|
|
|
|
* Generate HTML wrapper for control description including hotkey.
|
|
|
|
|
*/
|
|
|
|
|
export function prepareTooltip(text: string, hotkey?: string) {
|
|
|
|
|
return hotkey ? `<b>[${hotkey}]</b><br/>${text}` : text;
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-08 18:39:08 +03:00
|
|
|
|
/**
|
|
|
|
|
* Generates label for {@link IVersionInfo} of {@link IRSForm}.
|
|
|
|
|
*/
|
|
|
|
|
export function labelVersion(schema?: IRSForm) {
|
|
|
|
|
const version = schema?.versions.find(ver => ver.id === schema.version);
|
|
|
|
|
return version ? version.version : 'актуальная';
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for {@link TokenID}.
|
|
|
|
|
*/
|
2023-09-21 14:58:01 +03:00
|
|
|
|
export function labelToken(id: TokenID): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-09-21 14:58:01 +03:00
|
|
|
|
switch (id) {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
case TokenID.BOOLEAN: return 'ℬ()';
|
|
|
|
|
case TokenID.DECART: return '×';
|
|
|
|
|
case TokenID.PUNCTUATION_PL: return '( )';
|
|
|
|
|
case TokenID.PUNCTUATION_SL: return '[ ]';
|
|
|
|
|
case TokenID.QUANTOR_UNIVERSAL: return '∀';
|
|
|
|
|
case TokenID.QUANTOR_EXISTS: return '∃';
|
|
|
|
|
case TokenID.LOGIC_NOT: return '¬';
|
|
|
|
|
case TokenID.LOGIC_AND: return '&';
|
|
|
|
|
case TokenID.LOGIC_OR: return '∨';
|
|
|
|
|
case TokenID.LOGIC_IMPLICATION: return '⇒';
|
|
|
|
|
case TokenID.LOGIC_EQUIVALENT: return '⇔';
|
|
|
|
|
case TokenID.LIT_EMPTYSET: return '∅';
|
|
|
|
|
case TokenID.LIT_WHOLE_NUMBERS: return 'Z';
|
2024-04-01 11:13:50 +03:00
|
|
|
|
case TokenID.MULTIPLY: return '*';
|
2023-12-28 14:04:44 +03:00
|
|
|
|
case TokenID.EQUAL: return '=';
|
|
|
|
|
case TokenID.NOTEQUAL: return '≠';
|
|
|
|
|
case TokenID.GREATER_OR_EQ: return '≥';
|
|
|
|
|
case TokenID.LESSER_OR_EQ: return '≤';
|
|
|
|
|
case TokenID.SET_IN: return '∈';
|
|
|
|
|
case TokenID.SET_NOT_IN: return '∉';
|
|
|
|
|
case TokenID.SUBSET_OR_EQ: return '⊆';
|
|
|
|
|
case TokenID.SUBSET: return '⊂';
|
|
|
|
|
case TokenID.NOT_SUBSET: return '⊄';
|
|
|
|
|
case TokenID.SET_INTERSECTION: return '∩';
|
|
|
|
|
case TokenID.SET_UNION: return '∪';
|
|
|
|
|
case TokenID.SET_MINUS: return '\\';
|
|
|
|
|
case TokenID.SET_SYMMETRIC_MINUS: return '∆';
|
|
|
|
|
case TokenID.NT_DECLARATIVE_EXPR: return 'D{}';
|
|
|
|
|
case TokenID.NT_IMPERATIVE_EXPR: return 'I{}';
|
|
|
|
|
case TokenID.NT_RECURSIVE_FULL: return 'R{}';
|
|
|
|
|
case TokenID.BIGPR: return 'Pr1()';
|
|
|
|
|
case TokenID.SMALLPR: return 'pr1()';
|
|
|
|
|
case TokenID.FILTER: return 'Fi1[]()';
|
|
|
|
|
case TokenID.REDUCE: return 'red()';
|
|
|
|
|
case TokenID.CARD: return 'card()';
|
|
|
|
|
case TokenID.BOOL: return 'bool()';
|
|
|
|
|
case TokenID.DEBOOL: return 'debool()';
|
2024-05-13 12:50:08 +03:00
|
|
|
|
case TokenID.ASSIGN: return ':=';
|
|
|
|
|
case TokenID.ITERATE: return ':∈';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
}
|
|
|
|
|
return `no label: ${id}`;
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
|
/**
|
2024-01-04 14:35:46 +03:00
|
|
|
|
* Return shortcut description for {@link CstType}.
|
|
|
|
|
*/
|
|
|
|
|
export function getCstTypeShortcut(type: CstType) {
|
|
|
|
|
const prefix = labelCstType(type) + ' [Alt + ';
|
|
|
|
|
// prettier-ignore
|
|
|
|
|
switch (type) {
|
|
|
|
|
case CstType.BASE: return prefix + '1]';
|
|
|
|
|
case CstType.STRUCTURED: return prefix + '2]';
|
|
|
|
|
case CstType.TERM: return prefix + '3]';
|
|
|
|
|
case CstType.AXIOM: return prefix + '4]';
|
|
|
|
|
case CstType.FUNCTION: return prefix + 'Q]';
|
|
|
|
|
case CstType.PREDICATE: return prefix + 'W]';
|
|
|
|
|
case CstType.CONSTANT: return prefix + '5]';
|
|
|
|
|
case CstType.THEOREM: return prefix + '6]';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-09 16:40:10 +03:00
|
|
|
|
/** <b></b><br/>
|
2024-01-04 14:35:46 +03:00
|
|
|
|
* Generates description for {@link TokenID}.
|
2023-12-28 14:04:44 +03:00
|
|
|
|
*/
|
2023-09-21 14:58:01 +03:00
|
|
|
|
export function describeToken(id: TokenID): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-09-21 14:58:01 +03:00
|
|
|
|
switch (id) {
|
2024-03-09 16:40:10 +03:00
|
|
|
|
case TokenID.BOOLEAN: return prepareTooltip('Булеан', 'Alt + E / Shift + B');
|
|
|
|
|
case TokenID.DECART: return prepareTooltip('Декартово произведение', 'Alt + Shift + E / Shift + 8');
|
|
|
|
|
case TokenID.PUNCTUATION_PL: return prepareTooltip('Скобки () вокруг выражения', 'Alt + Shift + 9');
|
|
|
|
|
case TokenID.PUNCTUATION_SL: return prepareTooltip('Скобки [] вокруг выражения', 'Alt + [');
|
|
|
|
|
case TokenID.QUANTOR_UNIVERSAL: return prepareTooltip('Квантор всеобщности', '`');
|
|
|
|
|
case TokenID.QUANTOR_EXISTS: return prepareTooltip('Квантор существования', 'Shift + `');
|
|
|
|
|
case TokenID.LOGIC_NOT: return prepareTooltip('Отрицание', 'Alt + `');
|
|
|
|
|
case TokenID.LOGIC_AND: return prepareTooltip('Конъюнкция', 'Alt + 3 ~ Shift + 7');
|
|
|
|
|
case TokenID.LOGIC_OR: return prepareTooltip('Дизъюнкция', 'Alt + Shift + 3');
|
|
|
|
|
case TokenID.LOGIC_IMPLICATION: return prepareTooltip('Импликация', 'Alt + 4');
|
|
|
|
|
case TokenID.LOGIC_EQUIVALENT: return prepareTooltip('Эквивалентность', 'Alt + Shift + 4');
|
|
|
|
|
case TokenID.LIT_EMPTYSET: return prepareTooltip('Пустое множество', 'Alt + X');
|
|
|
|
|
case TokenID.LIT_WHOLE_NUMBERS: return prepareTooltip('Целые числа', 'Alt + Z');
|
|
|
|
|
case TokenID.EQUAL: return prepareTooltip('Равенство');
|
2024-04-01 11:13:50 +03:00
|
|
|
|
case TokenID.MULTIPLY: return prepareTooltip('Умножение чисел', 'Alt + 8');
|
2024-03-09 16:40:10 +03:00
|
|
|
|
case TokenID.NOTEQUAL: return prepareTooltip('Неравенство', 'Alt + Shift + `');
|
|
|
|
|
case TokenID.GREATER_OR_EQ: return prepareTooltip('Больше или равно', 'Alt + Shift + 7');
|
|
|
|
|
case TokenID.LESSER_OR_EQ: return prepareTooltip('Меньше или равно', 'Alt + Shift + 8');
|
|
|
|
|
case TokenID.SET_IN: return prepareTooltip('Быть элементом (принадлежит)', 'Alt + 1');
|
|
|
|
|
case TokenID.SET_NOT_IN: return prepareTooltip('Не принадлежит', 'Alt + Shift + 1');
|
|
|
|
|
case TokenID.SUBSET_OR_EQ: return prepareTooltip('Быть частью (нестрогое подмножество)', 'Alt + 2');
|
|
|
|
|
case TokenID.SUBSET: return prepareTooltip('Строгое подмножество', 'Alt + 7');
|
|
|
|
|
case TokenID.NOT_SUBSET: return prepareTooltip('Не подмножество', 'Alt + Shift + 2');
|
|
|
|
|
case TokenID.SET_INTERSECTION: return prepareTooltip('Пересечение', 'Alt + A');
|
|
|
|
|
case TokenID.SET_UNION: return prepareTooltip('Объединение', 'Alt + S');
|
|
|
|
|
case TokenID.SET_MINUS: return prepareTooltip('Разность множеств', 'Alt + 5');
|
|
|
|
|
case TokenID.SET_SYMMETRIC_MINUS: return prepareTooltip('Симметрическая разность', 'Alt + Shift + 5');
|
|
|
|
|
case TokenID.NT_DECLARATIVE_EXPR: return prepareTooltip('Декларативное определение', 'Alt + D');
|
|
|
|
|
case TokenID.NT_IMPERATIVE_EXPR: return prepareTooltip('Императивное определение', 'Alt + G');
|
|
|
|
|
case TokenID.NT_RECURSIVE_FULL: return prepareTooltip('Рекурсивное определение (цикл)', 'Alt + T');
|
|
|
|
|
case TokenID.BIGPR: return prepareTooltip('Большая проекция', 'Alt + Q');
|
|
|
|
|
case TokenID.SMALLPR: return prepareTooltip('Малая проекция', 'Alt + W');
|
|
|
|
|
case TokenID.FILTER: return prepareTooltip('Фильтр', 'Alt + F');
|
|
|
|
|
case TokenID.REDUCE: return prepareTooltip('Множество-сумма', 'Alt + R');
|
|
|
|
|
case TokenID.CARD: return prepareTooltip('Мощность', 'Alt + C');
|
|
|
|
|
case TokenID.BOOL: return prepareTooltip('Синглетон', 'Alt + B');
|
|
|
|
|
case TokenID.DEBOOL: return prepareTooltip('Десинглетон', 'Alt + V');
|
2024-05-13 12:50:08 +03:00
|
|
|
|
case TokenID.ASSIGN: return prepareTooltip('Присвоение', 'Alt + Shift + 6');
|
|
|
|
|
case TokenID.ITERATE: return prepareTooltip('Перебор элементов множества', 'Alt + 6');
|
2023-09-21 14:58:01 +03:00
|
|
|
|
}
|
|
|
|
|
return `no description: ${id}`;
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for {@link CstMatchMode}.
|
|
|
|
|
*/
|
2023-12-26 14:23:51 +03:00
|
|
|
|
export function labelCstMatchMode(mode: CstMatchMode): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-09-21 14:58:01 +03:00
|
|
|
|
switch (mode) {
|
2023-10-06 14:39:32 +03:00
|
|
|
|
case CstMatchMode.ALL: return 'общий';
|
|
|
|
|
case CstMatchMode.EXPR: return 'выражение';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case CstMatchMode.TERM: return 'термин';
|
|
|
|
|
case CstMatchMode.TEXT: return 'текст';
|
|
|
|
|
case CstMatchMode.NAME: return 'имя';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves description for {@link CstMatchMode}.
|
|
|
|
|
*/
|
2023-12-26 14:23:51 +03:00
|
|
|
|
export function describeCstMatchMode(mode: CstMatchMode): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-09-21 14:58:01 +03:00
|
|
|
|
switch (mode) {
|
2024-05-02 17:04:18 +03:00
|
|
|
|
case CstMatchMode.ALL: return 'все атрибуты';
|
|
|
|
|
case CstMatchMode.EXPR: return 'формальное определение';
|
|
|
|
|
case CstMatchMode.TERM: return 'термин';
|
|
|
|
|
case CstMatchMode.TEXT: return 'определение и конвенция';
|
|
|
|
|
case CstMatchMode.NAME: return 'только имена';
|
2023-10-06 14:39:32 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for {@link DependencyMode}.
|
|
|
|
|
*/
|
2023-10-06 14:39:32 +03:00
|
|
|
|
export function labelCstSource(mode: DependencyMode): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-10-06 14:39:32 +03:00
|
|
|
|
switch (mode) {
|
|
|
|
|
case DependencyMode.ALL: return 'не ограничен';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case DependencyMode.EXPRESSION: return 'выражение';
|
|
|
|
|
case DependencyMode.OUTPUTS: return 'потребители';
|
|
|
|
|
case DependencyMode.INPUTS: return 'поставщики';
|
|
|
|
|
case DependencyMode.EXPAND_OUTPUTS: return 'зависимые';
|
2023-11-05 18:41:28 +03:00
|
|
|
|
case DependencyMode.EXPAND_INPUTS: return 'влияющие';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves description for {@link DependencyMode}.
|
|
|
|
|
*/
|
2023-10-06 14:39:32 +03:00
|
|
|
|
export function describeCstSource(mode: DependencyMode): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-10-06 14:39:32 +03:00
|
|
|
|
switch (mode) {
|
|
|
|
|
case DependencyMode.ALL: return 'все конституенты';
|
2024-04-04 20:03:41 +03:00
|
|
|
|
case DependencyMode.EXPRESSION: return 'имена из выражения';
|
|
|
|
|
case DependencyMode.OUTPUTS: return 'прямые исходящие';
|
|
|
|
|
case DependencyMode.INPUTS: return 'прямые входящие';
|
|
|
|
|
case DependencyMode.EXPAND_OUTPUTS: return 'цепочка исходящих';
|
|
|
|
|
case DependencyMode.EXPAND_INPUTS: return 'цепочка входящих';
|
2023-10-06 14:39:32 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
2024-06-02 23:41:46 +03:00
|
|
|
|
* Retrieves label for {@link LocationHead}.
|
2023-11-17 20:51:13 +03:00
|
|
|
|
*/
|
2024-06-02 23:41:46 +03:00
|
|
|
|
export function labelLocationHead(head: LocationHead): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2024-06-02 23:41:46 +03:00
|
|
|
|
switch (head) {
|
|
|
|
|
case LocationHead.USER: return 'личные (/U)';
|
|
|
|
|
case LocationHead.COMMON: return 'общие (/S)';
|
|
|
|
|
case LocationHead.LIBRARY: return 'неизменные (/L)';
|
|
|
|
|
case LocationHead.PROJECTS: return 'проекты (/P)';
|
2023-10-06 14:39:32 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
2024-06-02 23:41:46 +03:00
|
|
|
|
* Retrieves description for {@link LocationHead}.
|
2023-11-17 20:51:13 +03:00
|
|
|
|
*/
|
2024-06-02 23:41:46 +03:00
|
|
|
|
export function describeLocationHead(head: LocationHead): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2024-06-02 23:41:46 +03:00
|
|
|
|
switch (head) {
|
|
|
|
|
case LocationHead.USER: return 'Личные схемы пользователя';
|
|
|
|
|
case LocationHead.COMMON: return 'Рабочий каталог публичных схем';
|
|
|
|
|
case LocationHead.LIBRARY: return 'Каталог неизменных схем';
|
|
|
|
|
case LocationHead.PROJECTS: return 'Рабочий каталог проектных схем';
|
2023-10-06 14:39:32 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for graph layout mode.
|
|
|
|
|
*/
|
2024-04-07 19:22:19 +03:00
|
|
|
|
export const mapLabelLayout: Map<GraphLayout, string> = new Map([
|
|
|
|
|
['treeTd2d', 'Граф: ДеревоВ 2D'],
|
|
|
|
|
['treeTd3d', 'Граф: ДеревоВ 3D'],
|
2023-09-21 14:58:01 +03:00
|
|
|
|
['forceatlas2', 'Граф: Атлас 2D'],
|
|
|
|
|
['forceDirected2d', 'Граф: Силы 2D'],
|
|
|
|
|
['forceDirected3d', 'Граф: Силы 3D'],
|
2024-04-07 19:22:19 +03:00
|
|
|
|
['treeLr2d', 'Граф: ДеревоГ 2D'],
|
|
|
|
|
['treeLr3d', 'Граф: ДеревоГ 3D'],
|
2024-04-07 15:38:24 +03:00
|
|
|
|
['radialOut2d', 'Граф: Радиус 2D'],
|
|
|
|
|
['radialOut3d', 'Граф: Радиус 3D'],
|
2024-04-07 19:22:19 +03:00
|
|
|
|
['circular2d', 'Граф: Круговая']
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for {@link GraphColoring}.
|
|
|
|
|
*/
|
|
|
|
|
export const mapLabelColoring: Map<GraphColoring, string> = new Map([
|
|
|
|
|
['none', 'Цвет: Моно'],
|
|
|
|
|
['status', 'Цвет: Статус'],
|
|
|
|
|
['type', 'Цвет: Класс']
|
2023-09-21 14:58:01 +03:00
|
|
|
|
]);
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
2024-04-07 19:22:19 +03:00
|
|
|
|
* Retrieves label for {@link GraphSizing}.
|
2023-11-17 20:51:13 +03:00
|
|
|
|
*/
|
2024-04-07 19:22:19 +03:00
|
|
|
|
export const mapLabelSizing: Map<GraphSizing, string> = new Map([
|
|
|
|
|
['none', 'Узлы: Моно'],
|
|
|
|
|
['derived', 'Узлы: Порожденные'],
|
|
|
|
|
['complex', 'Узлы: Простые']
|
2023-09-21 14:58:01 +03:00
|
|
|
|
]);
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for {@link ExpressionStatus}.
|
|
|
|
|
*/
|
2023-09-21 14:58:01 +03:00
|
|
|
|
export function labelExpressionStatus(status: ExpressionStatus): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-09-21 14:58:01 +03:00
|
|
|
|
switch (status) {
|
2023-10-02 23:43:29 +03:00
|
|
|
|
case ExpressionStatus.VERIFIED: return 'корректно';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case ExpressionStatus.INCORRECT: return 'ошибка';
|
2023-10-02 23:43:29 +03:00
|
|
|
|
case ExpressionStatus.INCALCULABLE: return 'невычислимо';
|
|
|
|
|
case ExpressionStatus.PROPERTY: return 'неразмерное';
|
2023-12-26 14:23:51 +03:00
|
|
|
|
case ExpressionStatus.UNKNOWN: return 'не проверено';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case ExpressionStatus.UNDEFINED: return 'N/A';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves description for {@link ExpressionStatus}.
|
|
|
|
|
*/
|
2023-09-21 14:58:01 +03:00
|
|
|
|
export function describeExpressionStatus(status: ExpressionStatus): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-09-21 14:58:01 +03:00
|
|
|
|
switch (status) {
|
|
|
|
|
case ExpressionStatus.VERIFIED: return 'выражение корректно и вычислимо';
|
|
|
|
|
case ExpressionStatus.INCORRECT: return 'ошибка в выражении';
|
2024-02-22 11:35:27 +03:00
|
|
|
|
case ExpressionStatus.INCALCULABLE: return 'интерпретация не вычисляется';
|
|
|
|
|
case ExpressionStatus.PROPERTY: return 'только проверка принадлежности';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case ExpressionStatus.UNKNOWN: return 'требует проверки выражения';
|
2024-02-22 11:35:27 +03:00
|
|
|
|
case ExpressionStatus.UNDEFINED: return 'произошла ошибка при проверке';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for {@link HelpTopic}.
|
|
|
|
|
*/
|
2023-09-21 14:58:01 +03:00
|
|
|
|
export function labelHelpTopic(topic: HelpTopic): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-09-21 14:58:01 +03:00
|
|
|
|
switch (topic) {
|
2024-04-01 19:07:20 +03:00
|
|
|
|
case HelpTopic.MAIN: return 'Портал';
|
2024-05-09 12:37:13 +03:00
|
|
|
|
|
2024-05-13 20:55:48 +03:00
|
|
|
|
case HelpTopic.INTERFACE: return 'Интерфейс';
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.UI_LIBRARY: return 'Библиотека';
|
2024-05-16 22:39:28 +03:00
|
|
|
|
case HelpTopic.UI_RS_MENU: return 'Меню схемы';
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.UI_RS_CARD: return 'Карточка схемы';
|
|
|
|
|
case HelpTopic.UI_RS_LIST: return 'Список конституент';
|
|
|
|
|
case HelpTopic.UI_RS_EDITOR: return 'Редактор конституенты';
|
|
|
|
|
case HelpTopic.UI_GRAPH_TERM: return 'Граф термов';
|
2024-05-16 22:39:28 +03:00
|
|
|
|
case HelpTopic.UI_FORMULA_TREE: return 'Дерево разбора';
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.UI_CST_STATUS: return 'Статус конституенты';
|
|
|
|
|
case HelpTopic.UI_CST_CLASS: return 'Класс конституенты';
|
2024-05-13 20:55:48 +03:00
|
|
|
|
|
|
|
|
|
case HelpTopic.CONCEPTUAL: return 'Концептуализация';
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.CC_SYSTEM: return 'Система определений';
|
|
|
|
|
case HelpTopic.CC_CONSTITUENTA: return 'Конституента';
|
|
|
|
|
case HelpTopic.CC_RELATIONS: return 'Связи понятий';
|
2024-05-16 22:39:28 +03:00
|
|
|
|
case HelpTopic.CC_SYNTHESIS: return 'Синтез схем';
|
2024-05-09 12:37:13 +03:00
|
|
|
|
|
2024-04-01 19:07:20 +03:00
|
|
|
|
case HelpTopic.RSLANG: return 'Экспликация';
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.RSL_TYPES: return 'Типизация';
|
|
|
|
|
case HelpTopic.RSL_CORRECT: return 'Переносимость';
|
|
|
|
|
case HelpTopic.RSL_INTERPRET: return 'Интерпретируемость';
|
|
|
|
|
case HelpTopic.RSL_OPERATIONS: return 'Операции';
|
2024-05-16 16:05:39 +03:00
|
|
|
|
case HelpTopic.RSL_TEMPLATES: return 'Шаблоны выражений';
|
2024-05-09 12:37:13 +03:00
|
|
|
|
|
2024-04-01 19:07:20 +03:00
|
|
|
|
case HelpTopic.TERM_CONTROL: return 'Терминологизация';
|
|
|
|
|
case HelpTopic.VERSIONS: return 'Версионирование';
|
|
|
|
|
case HelpTopic.EXTEOR: return 'Экстеор';
|
|
|
|
|
case HelpTopic.API: return 'REST API';
|
|
|
|
|
case HelpTopic.PRIVACY: return 'Конфиденциальность';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves description for {@link HelpTopic}.
|
|
|
|
|
*/
|
2023-09-21 14:58:01 +03:00
|
|
|
|
export function describeHelpTopic(topic: HelpTopic): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-09-21 14:58:01 +03:00
|
|
|
|
switch (topic) {
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.MAIN: return 'общая справка по порталу';
|
2024-05-09 12:37:13 +03:00
|
|
|
|
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.INTERFACE: return 'описание интерфейса пользователя';
|
|
|
|
|
case HelpTopic.UI_LIBRARY: return 'интерфейс Библиотеки схем';
|
2024-05-16 22:39:28 +03:00
|
|
|
|
case HelpTopic.UI_RS_MENU: return 'меню редактирования схемы';
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.UI_RS_CARD: return 'интерфейс Карточки схемы';
|
|
|
|
|
case HelpTopic.UI_RS_LIST: return 'интерфейс Списка конституент';
|
|
|
|
|
case HelpTopic.UI_RS_EDITOR: return 'интерфейс редактирования конституенты';
|
|
|
|
|
case HelpTopic.UI_GRAPH_TERM: return 'интерфейс графа термов';
|
2024-05-16 22:39:28 +03:00
|
|
|
|
case HelpTopic.UI_FORMULA_TREE: return 'интерфейс дерева разбора родоструктурного выражения';
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.UI_CST_STATUS: return 'нотация отображения статуса конституенты';
|
|
|
|
|
case HelpTopic.UI_CST_CLASS: return 'нотация отображения класса конституенты';
|
2024-05-09 12:37:13 +03:00
|
|
|
|
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.CONCEPTUAL: return 'основы концептуализации и концептуального мышления';
|
|
|
|
|
case HelpTopic.CC_SYSTEM: return 'концептуальная схема как система понятий';
|
|
|
|
|
case HelpTopic.CC_CONSTITUENTA: return 'понятия конституенты и ее атрибутов';
|
|
|
|
|
case HelpTopic.CC_RELATIONS: return 'отношения между конституентами';
|
2024-05-16 22:39:28 +03:00
|
|
|
|
case HelpTopic.CC_SYNTHESIS: return 'операция синтеза концептуальных схем';
|
2024-05-13 20:55:48 +03:00
|
|
|
|
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.RSLANG: return 'справка по языку родов структур и экспликации';
|
|
|
|
|
case HelpTopic.RSL_TYPES: return 'система типов в родоструктурной экспликации';
|
|
|
|
|
case HelpTopic.RSL_CORRECT: return 'корректность и переносимость определений';
|
|
|
|
|
case HelpTopic.RSL_INTERPRET: return 'интерпретация формальных определений';
|
|
|
|
|
case HelpTopic.RSL_OPERATIONS: return 'операции над концептуальными схемами';
|
2024-05-16 16:05:39 +03:00
|
|
|
|
case HelpTopic.RSL_TEMPLATES: return 'работа с шаблонными выражениями';
|
2024-05-09 12:37:13 +03:00
|
|
|
|
|
2024-05-16 14:01:06 +03:00
|
|
|
|
case HelpTopic.TERM_CONTROL: return 'справка по контролю терминов и текстовым отсылкам';
|
|
|
|
|
case HelpTopic.VERSIONS: return 'справка по управлению версиями схем';
|
|
|
|
|
case HelpTopic.EXTEOR: return 'справка по программе для экспликации "Экстеор" для Windows';
|
|
|
|
|
case HelpTopic.API: return 'интерфейс для разработчиков';
|
|
|
|
|
case HelpTopic.PRIVACY: return 'политика обработки персональных данных';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for {@link CstType}.
|
|
|
|
|
*/
|
2023-12-26 14:23:51 +03:00
|
|
|
|
export function labelCstType(target: CstType): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-12-26 14:23:51 +03:00
|
|
|
|
switch (target) {
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case CstType.BASE: return 'Базисное множество';
|
|
|
|
|
case CstType.CONSTANT: return 'Константное множество';
|
|
|
|
|
case CstType.STRUCTURED: return 'Родовая структура';
|
|
|
|
|
case CstType.AXIOM: return 'Аксиома';
|
|
|
|
|
case CstType.TERM: return 'Терм';
|
|
|
|
|
case CstType.FUNCTION: return 'Терм-функция';
|
|
|
|
|
case CstType.PREDICATE: return 'Предикат-функция';
|
|
|
|
|
case CstType.THEOREM: return 'Теорема';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for {@link ReferenceType}.
|
|
|
|
|
*/
|
2023-12-26 14:23:51 +03:00
|
|
|
|
export function labelReferenceType(target: ReferenceType): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-12-26 14:23:51 +03:00
|
|
|
|
switch(target) {
|
2023-09-29 15:33:32 +03:00
|
|
|
|
case ReferenceType.ENTITY: return 'Использование термина';
|
2023-09-30 12:47:27 +03:00
|
|
|
|
case ReferenceType.SYNTACTIC: return 'Связывание слов';
|
2023-09-29 15:33:32 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for {@link CstClass}.
|
|
|
|
|
*/
|
2023-12-26 14:23:51 +03:00
|
|
|
|
export function labelCstClass(target: CstClass): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-12-26 14:23:51 +03:00
|
|
|
|
switch (target) {
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case CstClass.BASIC: return 'базовый';
|
|
|
|
|
case CstClass.DERIVED: return 'производный';
|
|
|
|
|
case CstClass.STATEMENT: return 'утверждение';
|
|
|
|
|
case CstClass.TEMPLATE: return 'шаблон';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves description for {@link CstClass}.
|
|
|
|
|
*/
|
2023-12-26 14:23:51 +03:00
|
|
|
|
export function describeCstClass(target: CstClass): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-12-26 14:23:51 +03:00
|
|
|
|
switch (target) {
|
2024-02-22 11:35:27 +03:00
|
|
|
|
case CstClass.BASIC: return 'неопределяемое понятие';
|
|
|
|
|
case CstClass.DERIVED: return 'определяемое понятие';
|
|
|
|
|
case CstClass.STATEMENT: return 'логическое утверждение';
|
|
|
|
|
case CstClass.TEMPLATE: return 'шаблон определения';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Generates label for typification.
|
|
|
|
|
*/
|
2023-12-28 14:04:44 +03:00
|
|
|
|
export function labelTypification({
|
|
|
|
|
isValid,
|
|
|
|
|
resultType,
|
|
|
|
|
args
|
|
|
|
|
}: {
|
2023-09-21 14:58:01 +03:00
|
|
|
|
isValid: boolean;
|
|
|
|
|
resultType: string;
|
2023-11-06 02:20:16 +03:00
|
|
|
|
args: IArgumentInfo[];
|
2023-09-21 14:58:01 +03:00
|
|
|
|
}): string {
|
|
|
|
|
if (!isValid) {
|
|
|
|
|
return 'N/A';
|
|
|
|
|
}
|
|
|
|
|
if (resultType === '' || resultType === 'LOGIC') {
|
|
|
|
|
resultType = 'Logical';
|
|
|
|
|
}
|
|
|
|
|
if (args.length === 0) {
|
|
|
|
|
return resultType;
|
|
|
|
|
}
|
|
|
|
|
const argsText = args.map(arg => arg.typification).join(', ');
|
|
|
|
|
return `${resultType} 🠔 [${argsText}]`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function labelCstTypification(cst: IConstituenta): string {
|
|
|
|
|
return labelTypification({
|
|
|
|
|
isValid: cst.parse.status === ParsingStatus.VERIFIED,
|
|
|
|
|
resultType: cst.parse.typification,
|
|
|
|
|
args: cst.parse.args
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Generates label for {@link ISyntaxTreeNode}.
|
|
|
|
|
*/
|
2023-09-21 14:58:01 +03:00
|
|
|
|
export function labelSyntaxTree(node: ISyntaxTreeNode): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-09-21 14:58:01 +03:00
|
|
|
|
switch (node.typeID) {
|
|
|
|
|
case TokenID.ID_LOCAL:
|
|
|
|
|
case TokenID.ID_GLOBAL:
|
|
|
|
|
case TokenID.ID_FUNCTION:
|
|
|
|
|
case TokenID.ID_PREDICATE:
|
|
|
|
|
case TokenID.ID_RADICAL:
|
|
|
|
|
return node.data.value as string;
|
|
|
|
|
|
|
|
|
|
case TokenID.LIT_INTEGER: return String(node.data.value as number);
|
|
|
|
|
|
|
|
|
|
case TokenID.BIGPR: return 'Pr' + (node.data.value as string[]).toString();
|
|
|
|
|
case TokenID.SMALLPR: return 'pr' + (node.data.value as string[]).toString();
|
|
|
|
|
case TokenID.FILTER: return 'Fi' + (node.data.value as string[]).toString();
|
|
|
|
|
|
|
|
|
|
case TokenID.PLUS: return '+';
|
|
|
|
|
case TokenID.MINUS: return '-';
|
|
|
|
|
case TokenID.MULTIPLY: return '*';
|
|
|
|
|
case TokenID.GREATER: return '>';
|
|
|
|
|
case TokenID.LESSER: return '<';
|
|
|
|
|
|
|
|
|
|
case TokenID.NT_TUPLE: return 'TUPLE';
|
|
|
|
|
case TokenID.NT_ENUMERATION: return 'ENUM';
|
|
|
|
|
|
|
|
|
|
case TokenID.NT_ENUM_DECL: return 'ENUM_DECLARATION';
|
|
|
|
|
case TokenID.NT_TUPLE_DECL: return 'TUPLE_DECLARATION';
|
2023-12-27 19:34:39 +03:00
|
|
|
|
case TokenID.PUNCTUATION_DEFINE: return 'DEFINITION';
|
|
|
|
|
case TokenID.PUNCTUATION_STRUCT: return 'STRUCTURE_DEFINITION';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
|
|
|
|
|
case TokenID.NT_ARG_DECL: return 'ARG';
|
|
|
|
|
case TokenID.NT_FUNC_CALL: return 'CALL';
|
|
|
|
|
case TokenID.NT_ARGUMENTS: return 'ARGS';
|
|
|
|
|
|
|
|
|
|
case TokenID.NT_FUNC_DEFINITION: return 'FUNCTION_DEFINITION';
|
|
|
|
|
|
|
|
|
|
case TokenID.NT_RECURSIVE_SHORT: return labelToken(TokenID.NT_RECURSIVE_FULL);
|
|
|
|
|
|
|
|
|
|
case TokenID.BOOLEAN:
|
|
|
|
|
case TokenID.DECART:
|
2023-12-27 19:34:39 +03:00
|
|
|
|
case TokenID.QUANTOR_UNIVERSAL:
|
|
|
|
|
case TokenID.QUANTOR_EXISTS:
|
|
|
|
|
case TokenID.LOGIC_NOT:
|
|
|
|
|
case TokenID.LOGIC_AND:
|
|
|
|
|
case TokenID.LOGIC_OR:
|
|
|
|
|
case TokenID.LOGIC_IMPLICATION:
|
|
|
|
|
case TokenID.LOGIC_EQUIVALENT:
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case TokenID.LIT_EMPTYSET:
|
2023-12-27 19:34:39 +03:00
|
|
|
|
case TokenID.LIT_WHOLE_NUMBERS:
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case TokenID.EQUAL:
|
|
|
|
|
case TokenID.NOTEQUAL:
|
|
|
|
|
case TokenID.GREATER_OR_EQ:
|
|
|
|
|
case TokenID.LESSER_OR_EQ:
|
2023-12-27 19:34:39 +03:00
|
|
|
|
case TokenID.SET_IN:
|
|
|
|
|
case TokenID.SET_NOT_IN:
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case TokenID.SUBSET_OR_EQ:
|
|
|
|
|
case TokenID.SUBSET:
|
2023-12-27 19:34:39 +03:00
|
|
|
|
case TokenID.NOT_SUBSET:
|
|
|
|
|
case TokenID.SET_INTERSECTION:
|
|
|
|
|
case TokenID.SET_UNION:
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case TokenID.SET_MINUS:
|
2023-12-27 19:34:39 +03:00
|
|
|
|
case TokenID.SET_SYMMETRIC_MINUS:
|
2023-09-21 14:58:01 +03:00
|
|
|
|
case TokenID.NT_DECLARATIVE_EXPR:
|
|
|
|
|
case TokenID.NT_IMPERATIVE_EXPR:
|
|
|
|
|
case TokenID.NT_RECURSIVE_FULL:
|
|
|
|
|
case TokenID.REDUCE:
|
|
|
|
|
case TokenID.CARD:
|
|
|
|
|
case TokenID.BOOL:
|
|
|
|
|
case TokenID.DEBOOL:
|
2024-05-13 12:50:08 +03:00
|
|
|
|
case TokenID.ASSIGN:
|
|
|
|
|
case TokenID.ITERATE:
|
2023-09-21 14:58:01 +03:00
|
|
|
|
return labelToken(node.typeID);
|
|
|
|
|
}
|
|
|
|
|
// node
|
|
|
|
|
return 'UNKNOWN ' + String(node.typeID);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-27 23:36:51 +03:00
|
|
|
|
export function labelGrammeme(gram: GramData): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-12-05 01:22:44 +03:00
|
|
|
|
switch (gram as Grammeme) {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
default: return `Неизв: ${gram}`;
|
|
|
|
|
|
|
|
|
|
case Grammeme.NOUN: return 'ЧР: сущ';
|
|
|
|
|
case Grammeme.VERB: return 'ЧР: глагол';
|
|
|
|
|
case Grammeme.INFN: return 'ЧР: глагол инф';
|
|
|
|
|
case Grammeme.ADJF: return 'ЧР: прил';
|
|
|
|
|
case Grammeme.PRTF: return 'ЧР: прич';
|
|
|
|
|
case Grammeme.ADJS: return 'ЧР: кр прил';
|
|
|
|
|
case Grammeme.PRTS: return 'ЧР: кр прич';
|
|
|
|
|
case Grammeme.COMP: return 'ЧР: компаратив';
|
|
|
|
|
case Grammeme.GRND: return 'ЧР: деепричастие';
|
|
|
|
|
case Grammeme.NUMR: return 'ЧР: число';
|
|
|
|
|
case Grammeme.ADVB: return 'ЧР: наречие';
|
|
|
|
|
case Grammeme.NPRO: return 'ЧР: местоимение';
|
|
|
|
|
case Grammeme.PRED: return 'ЧР: предикатив';
|
|
|
|
|
case Grammeme.PREP: return 'ЧР: предлог';
|
|
|
|
|
case Grammeme.CONJ: return 'ЧР: союз';
|
|
|
|
|
case Grammeme.PRCL: return 'ЧР: частица';
|
|
|
|
|
case Grammeme.INTJ: return 'ЧР: междометие';
|
|
|
|
|
case Grammeme.Abbr: return 'ЧР: аббревиатура';
|
|
|
|
|
|
|
|
|
|
case Grammeme.sing: return 'Число: един';
|
|
|
|
|
case Grammeme.plur: return 'Число: множ';
|
|
|
|
|
|
|
|
|
|
case Grammeme.nomn: return 'Падеж: имен';
|
|
|
|
|
case Grammeme.gent: return 'Падеж: род';
|
|
|
|
|
case Grammeme.datv: return 'Падеж: дат';
|
|
|
|
|
case Grammeme.accs: return 'Падеж: вин';
|
|
|
|
|
case Grammeme.ablt: return 'Падеж: твор';
|
|
|
|
|
case Grammeme.loct: return 'Падеж: пред';
|
|
|
|
|
|
|
|
|
|
case Grammeme.masc: return 'Род: муж';
|
|
|
|
|
case Grammeme.femn: return 'Род: жен';
|
|
|
|
|
case Grammeme.neut: return 'Род: ср';
|
|
|
|
|
|
|
|
|
|
case Grammeme.perf: return 'Совершенный: да';
|
|
|
|
|
case Grammeme.impf: return 'Совершенный: нет';
|
|
|
|
|
|
|
|
|
|
case Grammeme.tran: return 'Переходный: да';
|
|
|
|
|
case Grammeme.intr: return 'Переходный: нет';
|
|
|
|
|
|
|
|
|
|
case Grammeme.pres: return 'Время: настоящее';
|
|
|
|
|
case Grammeme.past: return 'Время: прошедшее';
|
|
|
|
|
case Grammeme.futr: return 'Время: будущее';
|
|
|
|
|
|
|
|
|
|
case Grammeme.per1: return 'Лицо: 1';
|
|
|
|
|
case Grammeme.per2: return 'Лицо: 2';
|
|
|
|
|
case Grammeme.per3: return 'Лицо: 3';
|
|
|
|
|
|
|
|
|
|
case Grammeme.impr: return 'Повелительный: да';
|
|
|
|
|
case Grammeme.indc: return 'Повелительный: нет';
|
|
|
|
|
|
|
|
|
|
case Grammeme.incl: return 'Включающий: да';
|
|
|
|
|
case Grammeme.excl: return 'Включающий: нет';
|
|
|
|
|
|
|
|
|
|
case Grammeme.pssv: return 'Страдательный: да';
|
|
|
|
|
case Grammeme.actv: return 'Страдательный: нет';
|
|
|
|
|
|
|
|
|
|
case Grammeme.anim: return 'Одушевленный: да';
|
|
|
|
|
case Grammeme.inan: return 'Одушевленный: нет';
|
|
|
|
|
|
|
|
|
|
case Grammeme.Infr: return 'Стиль: неформальный';
|
|
|
|
|
case Grammeme.Slng: return 'Стиль: жаргон';
|
|
|
|
|
case Grammeme.Arch: return 'Стиль: устаревший';
|
|
|
|
|
case Grammeme.Litr: return 'Стиль: литературный';
|
2023-09-21 14:58:01 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-17 20:51:13 +03:00
|
|
|
|
/**
|
|
|
|
|
* Generates error description for {@link IRSErrorDescription}.
|
|
|
|
|
*/
|
2023-09-21 14:58:01 +03:00
|
|
|
|
export function describeRSError(error: IRSErrorDescription): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-09-21 14:58:01 +03:00
|
|
|
|
switch (error.errorType) {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
case RSErrorType.unknownSymbol:
|
|
|
|
|
return `Неизвестный символ: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.syntax:
|
|
|
|
|
return 'Неопределенная синтаксическая ошибка';
|
|
|
|
|
case RSErrorType.missingParenthesis:
|
|
|
|
|
return 'Некорректная конструкция языка родов структур, проверьте структуру выражения';
|
|
|
|
|
case RSErrorType.missingCurlyBrace:
|
|
|
|
|
return "Пропущен символ '}'";
|
|
|
|
|
case RSErrorType.invalidQuantifier:
|
|
|
|
|
return 'Некорректная кванторная декларация';
|
2024-05-12 13:58:28 +03:00
|
|
|
|
case RSErrorType.invalidImperative:
|
|
|
|
|
return 'Использование императивного синтаксиса вне императивного блока';
|
2023-12-28 14:04:44 +03:00
|
|
|
|
case RSErrorType.expectedArgDeclaration:
|
|
|
|
|
return 'Ожидалось объявление аргументов терм-функции';
|
|
|
|
|
case RSErrorType.expectedLocal:
|
|
|
|
|
return 'Ожидалось имя локальной переменной';
|
|
|
|
|
|
|
|
|
|
case RSErrorType.localDoubleDeclare:
|
|
|
|
|
return `Предупреждение! Повторное объявление локальной переменной ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.localNotUsed:
|
|
|
|
|
return `Предупреждение! Переменная объявлена, но не использована: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.localUndeclared:
|
|
|
|
|
return `Использование необъявленной переменной: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.localShadowing:
|
|
|
|
|
return `Повторное объявление переменной: ${error.params[0]}`;
|
|
|
|
|
|
|
|
|
|
case RSErrorType.typesNotEqual:
|
|
|
|
|
return `Типизация операндов не совпадает! ${error.params[0]} != ${error.params[1]}`;
|
|
|
|
|
case RSErrorType.globalNotTyped:
|
|
|
|
|
return `Типизация конституенты не определена: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.invalidDecart:
|
2024-03-12 19:56:57 +03:00
|
|
|
|
return `τ(α×b) = B(Dτ(α)×Dτ(b)). Некорректная типизация аргумента: ${error.params[0]}`;
|
2023-12-28 14:04:44 +03:00
|
|
|
|
case RSErrorType.invalidBoolean:
|
2024-03-12 19:56:57 +03:00
|
|
|
|
return `τ(B(a)) = BBDτ(a). Некорректная типизация аргумента: ${error.params[0]}`;
|
2023-12-28 14:04:44 +03:00
|
|
|
|
case RSErrorType.invalidTypeOperation:
|
|
|
|
|
return `Типизация операнда теоретико-множественной операции не корректна: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.invalidCard:
|
|
|
|
|
return `Некорректная типизация аргумента операции мощности: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.invalidDebool:
|
2024-03-12 19:56:57 +03:00
|
|
|
|
return `τ(debool(a)) = Dτ(a). Некорректная типизация аргумента: ${error.params[0]}`;
|
2023-12-28 14:04:44 +03:00
|
|
|
|
case RSErrorType.globalFuncMissing:
|
|
|
|
|
return `Неизвестное имя функции: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.globalFuncWithoutArgs:
|
|
|
|
|
return `Некорректное использование имени функции без аргументов: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.invalidReduce:
|
2024-03-12 19:56:57 +03:00
|
|
|
|
return `τ(red(a)) = BDDτ(a). Некорректная типизация аргумента: ${error.params[0]}`;
|
2023-12-28 14:04:44 +03:00
|
|
|
|
case RSErrorType.invalidProjectionTuple:
|
|
|
|
|
return `Проекция не определена: ${error.params[0]} -> ${error.params[1]}`;
|
|
|
|
|
case RSErrorType.invalidProjectionSet:
|
2024-03-12 19:56:57 +03:00
|
|
|
|
return `τ(Pri(a)) = BCiDτ(a). Некорректная типизация аргумента: ${error.params[0]}`;
|
2023-12-28 14:04:44 +03:00
|
|
|
|
case RSErrorType.invalidEnumeration:
|
|
|
|
|
return `Типизация аргументов перечисления не совпадает: ${error.params[0]} != ${error.params[1]}`;
|
|
|
|
|
case RSErrorType.invalidBinding:
|
|
|
|
|
return `Количество переменных в кортеже не соответствует размерности декартова произведения`;
|
|
|
|
|
case RSErrorType.localOutOfScope:
|
|
|
|
|
return `Использование имени переменной вне области действия: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.invalidElementPredicate:
|
|
|
|
|
return `Несоответствие типизаций операндов для оператора: ${error.params[0]}${error.params[1]}${error.params[2]}`;
|
|
|
|
|
case RSErrorType.invalidArgsArity:
|
|
|
|
|
return `Неверное число аргументов терм-функции: ${error.params[0]} != ${error.params[1]}`;
|
|
|
|
|
case RSErrorType.invalidArgumentType:
|
|
|
|
|
return `Типизация аргумента терм-функции не соответствует объявленной: ${error.params[0]} != ${error.params[1]}`;
|
|
|
|
|
case RSErrorType.globalStructure:
|
|
|
|
|
return `Выражение родовой структуры должно быть ступенью`;
|
|
|
|
|
case RSErrorType.globalExpectedFunction:
|
|
|
|
|
return `Ожидалось выражение объявления функции`;
|
|
|
|
|
case RSErrorType.radicalUsage:
|
|
|
|
|
return `Радикалы запрещены вне деклараций терм-функции: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.invalidFilterArgumentType:
|
|
|
|
|
return `Типизация аргумента фильтра не корректна: ${error.params[0]}(${error.params[1]})`;
|
|
|
|
|
case RSErrorType.invalidFilterArity:
|
|
|
|
|
return `Количество параметров фильтра не соответствует количеству индексов`;
|
|
|
|
|
case RSErrorType.arithmeticNotSupported:
|
|
|
|
|
return `Тип не поддерживает арифметические операторы: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.typesNotCompatible:
|
|
|
|
|
return `Типы не совместимы для выбранной операции: ${error.params[0]} и ${error.params[1]}`;
|
|
|
|
|
case RSErrorType.orderingNotSupported:
|
|
|
|
|
return `Тип не поддерживает предикаты порядка: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.globalNoValue:
|
|
|
|
|
return `Используется неинтерпретируемый глобальный идентификатор: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.invalidPropertyUsage:
|
|
|
|
|
return `Использование неитерируемого множества в качестве значения`;
|
|
|
|
|
case RSErrorType.globalMissingAST:
|
|
|
|
|
return `Не удалось получить дерево разбора для глобального идентификатора: ${error.params[0]}`;
|
|
|
|
|
case RSErrorType.globalFuncNoInterpretation:
|
|
|
|
|
return `Функция не интерпретируется для данных аргументов`;
|
|
|
|
|
case RSErrorType.globalNonemptyBase:
|
|
|
|
|
return `Непустое выражение базисного/константного множества`;
|
|
|
|
|
case RSErrorType.globalUnexpectedType:
|
|
|
|
|
return `Типизация выражения не соответствует типу конституенты`;
|
|
|
|
|
case RSErrorType.globalEmptyDerived:
|
|
|
|
|
return `Пустое выражение для выводимого понятия или утверждения`;
|
2023-09-21 14:58:01 +03:00
|
|
|
|
}
|
|
|
|
|
return 'UNKNOWN ERROR';
|
2023-12-16 19:20:26 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2024-05-27 20:42:34 +03:00
|
|
|
|
* Retrieves label for {@link UserLevel}.
|
2023-12-16 19:20:26 +03:00
|
|
|
|
*/
|
2024-05-27 20:42:34 +03:00
|
|
|
|
export function labelAccessMode(mode: UserLevel): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-12-16 19:20:26 +03:00
|
|
|
|
switch (mode) {
|
2024-05-27 20:42:34 +03:00
|
|
|
|
case UserLevel.READER: return 'Читатель';
|
|
|
|
|
case UserLevel.EDITOR: return 'Редактор';
|
|
|
|
|
case UserLevel.OWNER: return 'Владелец';
|
|
|
|
|
case UserLevel.ADMIN: return 'Администратор';
|
2023-12-16 19:20:26 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2024-05-27 20:42:34 +03:00
|
|
|
|
* Retrieves description for {@link UserLevel}.
|
2023-12-16 19:20:26 +03:00
|
|
|
|
*/
|
2024-05-27 20:42:34 +03:00
|
|
|
|
export function describeAccessMode(mode: UserLevel): string {
|
2023-12-28 14:04:44 +03:00
|
|
|
|
// prettier-ignore
|
2023-12-16 19:20:26 +03:00
|
|
|
|
switch (mode) {
|
2024-05-27 20:42:34 +03:00
|
|
|
|
case UserLevel.READER:
|
2023-12-16 19:20:26 +03:00
|
|
|
|
return 'Режим запрещает редактирование';
|
2024-05-27 20:42:34 +03:00
|
|
|
|
case UserLevel.EDITOR:
|
|
|
|
|
return 'Режим редактирования';
|
|
|
|
|
case UserLevel.OWNER:
|
|
|
|
|
return 'Режим владельца';
|
|
|
|
|
case UserLevel.ADMIN:
|
|
|
|
|
return 'Режим администратора';
|
2023-12-16 19:20:26 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-09 16:40:10 +03:00
|
|
|
|
|
2024-06-02 23:41:46 +03:00
|
|
|
|
/**
|
|
|
|
|
* Retrieves label for {@link AccessPolicy}.
|
|
|
|
|
*/
|
|
|
|
|
export function labelAccessPolicy(policy: AccessPolicy): string {
|
|
|
|
|
// prettier-ignore
|
|
|
|
|
switch (policy) {
|
|
|
|
|
case AccessPolicy.PRIVATE: return 'Личный';
|
|
|
|
|
case AccessPolicy.PROTECTED: return 'Защищенный';
|
|
|
|
|
case AccessPolicy.PUBLIC: return 'Открытый';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Retrieves description for {@link AccessPolicy}.
|
|
|
|
|
*/
|
|
|
|
|
export function describeAccessPolicy(policy: AccessPolicy): string {
|
|
|
|
|
// prettier-ignore
|
|
|
|
|
switch (policy) {
|
|
|
|
|
case AccessPolicy.PRIVATE:
|
|
|
|
|
return 'Доступ только для владельца';
|
|
|
|
|
case AccessPolicy.PROTECTED:
|
|
|
|
|
return 'Доступ для владельца и редакторов';
|
|
|
|
|
case AccessPolicy.PUBLIC:
|
|
|
|
|
return 'Открытый доступ';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-09 16:40:10 +03:00
|
|
|
|
/**
|
2024-03-20 19:49:45 +03:00
|
|
|
|
* UI shared messages.
|
2024-03-09 16:40:10 +03:00
|
|
|
|
*/
|
2024-03-20 19:49:45 +03:00
|
|
|
|
export const messages = {
|
2024-06-02 23:41:46 +03:00
|
|
|
|
unsaved: 'Сохраните или отмените изменения',
|
|
|
|
|
promptUnsaved: 'Присутствуют несохраненные изменения. Продолжить без их учета?'
|
2024-03-20 19:49:45 +03:00
|
|
|
|
};
|