diff --git a/.vscode/settings.json b/.vscode/settings.json index 82642e92..911e1207 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -32,6 +32,7 @@ ], "cSpell.words": [ "ablt", + "acconcept", "accs", "actv", "ADJF", @@ -75,11 +76,13 @@ "Litr", "loct", "moprho", + "multiword", "mypy", "nomn", "nooverlap", "NPRO", "NUMR", + "Opencorpora", "perfectivity", "ponomarev", "PRCL", @@ -87,6 +90,7 @@ "PRTS", "pssv", "pyconcept", + "Pylance", "pylint", "pymorphy", "Quantor", @@ -104,10 +108,13 @@ "signup", "Slng", "SMALLPR", + "tagset", "tailwindcss", "tanstack", "toastify", "tooltipic", + "tsdoc", + "unknwn", "Upvote", "Viewset", "viewsets", diff --git a/rsconcept/frontend/src/App.tsx b/rsconcept/frontend/src/App.tsx index 94461fad..de59d2d0 100644 --- a/rsconcept/frontend/src/App.tsx +++ b/rsconcept/frontend/src/App.tsx @@ -23,7 +23,7 @@ function Root() {
{ base: ILibraryItem; diff --git a/rsconcept/frontend/src/dialogs/DlgConstituentaTemplate/DlgConstituentaTemplate.tsx b/rsconcept/frontend/src/dialogs/DlgConstituentaTemplate/DlgConstituentaTemplate.tsx index 7454f9ac..8915cb75 100644 --- a/rsconcept/frontend/src/dialogs/DlgConstituentaTemplate/DlgConstituentaTemplate.tsx +++ b/rsconcept/frontend/src/dialogs/DlgConstituentaTemplate/DlgConstituentaTemplate.tsx @@ -11,9 +11,9 @@ import HelpButton from '@/components/Help/HelpButton'; import usePartialUpdate from '@/hooks/usePartialUpdate'; import { HelpTopic } from '@/models/miscellaneous'; import { CstType, ICstCreateData, IRSForm } from '@/models/rsform'; +import { generateAlias, validateNewAlias } from '@/models/rsformAPI'; import { inferTemplatedType, substituteTemplateArgs } from '@/models/rslangAPI'; import { classnames } from '@/utils/constants'; -import { createAliasFor, validateCstAlias } from '@/utils/misc'; import ArgumentsTab, { IArgumentsState } from './ArgumentsTab'; import ConstituentaTab from './ConstituentaTab'; @@ -54,11 +54,11 @@ function DlgConstituentaTemplate({ hideWindow, schema, onCreate, insertAfter }: const handleSubmit = () => onCreate(constituenta); useLayoutEffect(() => { - updateConstituenta({ alias: createAliasFor(constituenta.cst_type, schema) }); + updateConstituenta({ alias: generateAlias(constituenta.cst_type, schema) }); }, [constituenta.cst_type, updateConstituenta, schema]); useLayoutEffect(() => { - setValidated(validateCstAlias(constituenta.alias, constituenta.cst_type, schema)); + setValidated(validateNewAlias(constituenta.alias, constituenta.cst_type, schema)); }, [constituenta.alias, constituenta.cst_type, schema]); useLayoutEffect(() => { diff --git a/rsconcept/frontend/src/dialogs/DlgCreateCst.tsx b/rsconcept/frontend/src/dialogs/DlgCreateCst.tsx index 5f53275f..a92d685b 100644 --- a/rsconcept/frontend/src/dialogs/DlgCreateCst.tsx +++ b/rsconcept/frontend/src/dialogs/DlgCreateCst.tsx @@ -10,9 +10,9 @@ import TextInput from '@/components/Common/TextInput'; import RSInput from '@/components/RSInput'; import usePartialUpdate from '@/hooks/usePartialUpdate'; import { CstType, ICstCreateData, IRSForm } from '@/models/rsform'; +import { generateAlias, validateNewAlias } from '@/models/rsformAPI'; import { classnames } from '@/utils/constants'; import { labelCstType } from '@/utils/labels'; -import { createAliasFor, validateCstAlias } from '@/utils/misc'; import { SelectorCstType } from '@/utils/selectors'; interface DlgCreateCstProps extends Pick { @@ -39,11 +39,11 @@ function DlgCreateCst({ hideWindow, initial, schema, onCreate }: DlgCreateCstPro const handleSubmit = () => onCreate(cstData); useLayoutEffect(() => { - updateCstData({ alias: createAliasFor(cstData.cst_type, schema) }); + updateCstData({ alias: generateAlias(cstData.cst_type, schema) }); }, [cstData.cst_type, updateCstData, schema]); useEffect(() => { - setValidated(validateCstAlias(cstData.alias, cstData.cst_type, schema)); + setValidated(validateNewAlias(cstData.alias, cstData.cst_type, schema)); }, [cstData.alias, cstData.cst_type, schema]); return ( diff --git a/rsconcept/frontend/src/dialogs/DlgEditReference/SyntacticTab.tsx b/rsconcept/frontend/src/dialogs/DlgEditReference/SyntacticTab.tsx index c7683b5c..f37c929a 100644 --- a/rsconcept/frontend/src/dialogs/DlgEditReference/SyntacticTab.tsx +++ b/rsconcept/frontend/src/dialogs/DlgEditReference/SyntacticTab.tsx @@ -53,7 +53,7 @@ function SyntacticTab({ initial, setIsValid, setReference }: SyntacticTabProps) onChange={event => setOffset(event.target.valueAsNumber)} /> { @@ -27,13 +27,13 @@ function DlgRenameCst({ hideWindow, initial, onRename }: DlgRenameCstProps) { useLayoutEffect(() => { if (schema && initial && cstData.cst_type !== initial.cst_type) { - updateData({ alias: createAliasFor(cstData.cst_type, schema) }); + updateData({ alias: generateAlias(cstData.cst_type, schema) }); } }, [initial, cstData.cst_type, updateData, schema]); useLayoutEffect(() => { setValidated( - !!schema && cstData.alias !== initial.alias && validateCstAlias(cstData.alias, cstData.cst_type, schema) + !!schema && cstData.alias !== initial.alias && validateNewAlias(cstData.alias, cstData.cst_type, schema) ); }, [cstData.cst_type, cstData.alias, initial, schema]); diff --git a/rsconcept/frontend/src/hooks/useCheckExpression.ts b/rsconcept/frontend/src/hooks/useCheckExpression.ts index cbefe6e2..a592ce58 100644 --- a/rsconcept/frontend/src/hooks/useCheckExpression.ts +++ b/rsconcept/frontend/src/hooks/useCheckExpression.ts @@ -4,10 +4,10 @@ import { useCallback, useState } from 'react'; import { type ErrorData } from '@/components/InfoError'; import { CstType, IConstituenta, type IRSForm } from '@/models/rsform'; +import { getDefinitionPrefix } from '@/models/rsformAPI'; import { IArgumentInfo, IExpressionParse } from '@/models/rslang'; import { RSErrorType } from '@/models/rslang'; import { DataCallback, postCheckExpression } from '@/utils/backendAPI'; -import { getCstExpressionPrefix } from '@/utils/misc'; const LOGIC_TYPIFICATION = 'LOGIC'; @@ -27,7 +27,7 @@ function useCheckExpression({ schema }: { schema?: IRSForm }) { onError: error => setError(error), onSuccess: parse => { if (activeCst) { - adjustResults(parse, expression.trim() === getCstExpressionPrefix(activeCst), activeCst.cst_type); + adjustResults(parse, expression.trim() === getDefinitionPrefix(activeCst), activeCst.cst_type); } setParseData(parse); if (onSuccess) onSuccess(parse); diff --git a/rsconcept/frontend/src/utils/Graph.test.ts b/rsconcept/frontend/src/models/Graph.test.ts similarity index 100% rename from rsconcept/frontend/src/utils/Graph.test.ts rename to rsconcept/frontend/src/models/Graph.test.ts diff --git a/rsconcept/frontend/src/utils/Graph.ts b/rsconcept/frontend/src/models/Graph.ts similarity index 100% rename from rsconcept/frontend/src/utils/Graph.ts rename to rsconcept/frontend/src/models/Graph.ts diff --git a/rsconcept/frontend/src/models/libraryAPI.ts b/rsconcept/frontend/src/models/libraryAPI.ts index 9c77ee52..b8d35cc0 100644 --- a/rsconcept/frontend/src/models/libraryAPI.ts +++ b/rsconcept/frontend/src/models/libraryAPI.ts @@ -16,3 +16,14 @@ export function matchLibraryItem(target: ILibraryItem, query: string): boolean { const matcher = new TextMatcher(query); return matcher.test(target.alias) || matcher.test(target.title); } + +/** + * Generate title for clone {@link ILibraryItem}. + */ +export function cloneTitle(target: ILibraryItem): string { + if (!target.title.includes('[клон]')) { + return target.title + ' [клон]'; + } else { + return target.title + '+'; + } +} diff --git a/rsconcept/frontend/src/models/rsform.ts b/rsconcept/frontend/src/models/rsform.ts index ea0d01c0..8247b2d1 100644 --- a/rsconcept/frontend/src/models/rsform.ts +++ b/rsconcept/frontend/src/models/rsform.ts @@ -2,7 +2,7 @@ * Module: Models for formal representation for systems of concepts. */ -import { Graph } from '@/utils/Graph'; +import { Graph } from '@/models/Graph'; import { ILibraryItemEx, ILibraryUpdateData } from './library'; import { IArgumentInfo, ParsingStatus, ValueClass } from './rslang'; diff --git a/rsconcept/frontend/src/models/rsformAPI.ts b/rsconcept/frontend/src/models/rsformAPI.ts index a07f15ab..2ebd5a80 100644 --- a/rsconcept/frontend/src/models/rsformAPI.ts +++ b/rsconcept/frontend/src/models/rsformAPI.ts @@ -2,7 +2,7 @@ * Module: API for formal representation for systems of concepts. */ -import { Graph } from '@/utils/Graph'; +import { Graph } from '@/models/Graph'; import { TextMatcher } from '@/utils/utils'; import { CstMatchMode } from './miscellaneous'; @@ -169,23 +169,16 @@ export function inferClass(type: CstType, isTemplate: boolean): CstClass { if (isTemplate) { return CstClass.TEMPLATE; } + // prettier-ignore switch (type) { - case CstType.BASE: - return CstClass.BASIC; - case CstType.CONSTANT: - return CstClass.BASIC; - case CstType.STRUCTURED: - return CstClass.BASIC; - case CstType.TERM: - return CstClass.DERIVED; - case CstType.FUNCTION: - return CstClass.DERIVED; - case CstType.AXIOM: - return CstClass.STATEMENT; - case CstType.PREDICATE: - return CstClass.DERIVED; - case CstType.THEOREM: - return CstClass.STATEMENT; + case CstType.BASE: return CstClass.BASIC; + case CstType.CONSTANT: return CstClass.BASIC; + case CstType.STRUCTURED: return CstClass.BASIC; + case CstType.TERM: return CstClass.DERIVED; + case CstType.FUNCTION: return CstClass.DERIVED; + case CstType.AXIOM: return CstClass.STATEMENT; + case CstType.PREDICATE: return CstClass.DERIVED; + case CstType.THEOREM: return CstClass.STATEMENT; } } @@ -227,9 +220,58 @@ export function isMockCst(cst: IConstituenta) { } /** - * TODO: description + * Apply filter based on start {@link IConstituenta} type. */ export function applyFilterCategory(start: IConstituenta, schema: IRSFormData): IConstituenta[] { const nextCategory = schema.items.find(cst => cst.order > start.order && cst.cst_type === CATEGORY_CST_TYPE); return schema.items.filter(cst => cst.order > start.order && (!nextCategory || cst.order <= nextCategory.order)); } + +/** + * Prefix for alias indicating {@link CstType}. + */ +export function getCstTypePrefix(type: CstType) { + // prettier-ignore + switch (type) { + case CstType.BASE: return 'X'; + case CstType.CONSTANT: return 'C'; + case CstType.STRUCTURED: return 'S'; + case CstType.AXIOM: return 'A'; + case CstType.TERM: return 'D'; + case CstType.FUNCTION: return 'F'; + case CstType.PREDICATE: return 'P'; + case CstType.THEOREM: return 'T'; + } +} + +/** + * Validate new alias against {@link CstType} and {@link IRSForm}. + */ +export function validateNewAlias(alias: string, type: CstType, schema: IRSForm): boolean { + return alias.length >= 2 && alias[0] == getCstTypePrefix(type) && !schema.items.find(cst => cst.alias === alias); +} + +/** + * Definition prefix for {@link IConstituenta}. + */ +export function getDefinitionPrefix(cst: IConstituenta): string { + return cst.alias + (cst.cst_type === CstType.STRUCTURED ? '::=' : ':=='); +} + +/** + * Generate alias for new {@link IConstituenta} of a given {@link CstType} for current {@link IRSForm}. + */ +export function generateAlias(type: CstType, schema: IRSForm): string { + const prefix = getCstTypePrefix(type); + if (!schema.items || schema.items.length <= 0) { + return `${prefix}1`; + } + const index = schema.items.reduce((prev, cst, index) => { + if (cst.cst_type !== type) { + return prev; + } + index = Number(cst.alias.slice(1 - cst.alias.length)) + 1; + return Math.max(prev, index); + }, 1); + return `${prefix}${index}`; +} diff --git a/rsconcept/frontend/src/models/rslangAPI.ts b/rsconcept/frontend/src/models/rslangAPI.ts index 40676838..972adaf1 100644 --- a/rsconcept/frontend/src/models/rslangAPI.ts +++ b/rsconcept/frontend/src/models/rslangAPI.ts @@ -5,7 +5,7 @@ import { applyPattern } from '@/utils/utils'; import { CstType } from './rsform'; -import { IArgumentValue, RSErrorClass, RSErrorType } from './rslang'; +import { IArgumentValue, IRSErrorDescription, RSErrorClass, RSErrorType } from './rslang'; const LOCALS_REGEXP = /[_a-zα-ω][a-zα-ω]*\d*/g; @@ -13,6 +13,7 @@ const LOCALS_REGEXP = /[_a-zα-ω][a-zα-ω]*\d*/g; * Extracts global variable names from a given expression. */ export function extractGlobals(expression: string): Set { + // cspell:disable-next-line return new Set(expression.match(/[XCSADFPT]\d+/g) ?? []); } @@ -119,3 +120,17 @@ export function inferErrorClass(error: RSErrorType): RSErrorClass { return RSErrorClass.UNKNOWN; } } + +/** + * Generate ErrorID label. + */ +export function getRSErrorPrefix(error: IRSErrorDescription): string { + const id = error.errorType.toString(16); + // prettier-ignore + switch(inferErrorClass(error.errorType)) { + case RSErrorClass.LEXER: return 'L' + id; + case RSErrorClass.PARSER: return 'P' + id; + case RSErrorClass.SEMANTIC: return 'S' + id; + case RSErrorClass.UNKNOWN: return 'U' + id; + } +} diff --git a/rsconcept/frontend/src/pages/CreateRSFormPage.tsx b/rsconcept/frontend/src/pages/CreateRSFormPage.tsx index 3e8c39dc..adece5d3 100644 --- a/rsconcept/frontend/src/pages/CreateRSFormPage.tsx +++ b/rsconcept/frontend/src/pages/CreateRSFormPage.tsx @@ -109,8 +109,8 @@ function CreateRSFormPage() { label='Сокращение' placeholder={file && 'Загрузить из файла'} className='w-[14rem]' - pattern={patterns.alias} - title={`не более ${limits.alias_len} символов`} + pattern={patterns.library_alias} + title={`не более ${limits.library_alias_len} символов`} value={alias} onChange={event => setAlias(event.target.value)} /> diff --git a/rsconcept/frontend/src/pages/LibraryPage/SearchPanel.tsx b/rsconcept/frontend/src/pages/LibraryPage/SearchPanel.tsx index 3409519f..acff324d 100644 --- a/rsconcept/frontend/src/pages/LibraryPage/SearchPanel.tsx +++ b/rsconcept/frontend/src/pages/LibraryPage/SearchPanel.tsx @@ -46,7 +46,7 @@ function SearchPanel({ total, filtered, query, setQuery, strategy, setFilter }: return (
{ if (parse.errors.length > 0) { @@ -103,7 +103,7 @@ function EditorRSExpression({ if (!activeCst || !rsInput.current) { return; } - const prefix = getCstExpressionPrefix(activeCst); + const prefix = getDefinitionPrefix(activeCst); let errorPosition = error.position - prefix.length; if (errorPosition < 0) errorPosition = 0; rsInput.current?.view?.dispatch({ @@ -137,7 +137,7 @@ function EditorRSExpression({ toast.error('Невозможно построить дерево разбора'); } else { setSyntaxTree(parse.ast); - setExpression(getCstExpressionPrefix(activeCst!) + value); + setExpression(getDefinitionPrefix(activeCst!) + value); setShowAST(true); } }); diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/ParsingResult.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/ParsingResult.tsx index 84d442bb..7078b3a9 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/ParsingResult.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSExpression/ParsingResult.tsx @@ -4,9 +4,9 @@ import clsx from 'clsx'; import { motion } from 'framer-motion'; import { IExpressionParse, IRSErrorDescription } from '@/models/rslang'; +import { getRSErrorPrefix } from '@/models/rslangAPI'; import { animateParseResults } from '@/utils/animations'; import { describeRSError } from '@/utils/labels'; -import { getRSErrorPrefix } from '@/utils/misc'; interface ParsingResultProps { data: IExpressionParse | undefined; diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm/FormRSForm.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm/FormRSForm.tsx index b5c5bf3d..3df82b21 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm/FormRSForm.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm/FormRSForm.tsx @@ -98,8 +98,8 @@ function FormRSForm({ id, disabled, isModified, setIsModified }: FormRSFormProps required label='Сокращение' className='w-[14rem]' - pattern={patterns.alias} - title={`не более ${limits.alias_len} символов`} + pattern={patterns.library_alias} + title={`не более ${limits.library_alias_len} символов`} disabled={disabled} value={alias} onChange={event => setAlias(event.target.value)} diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSList/RSListToolbar.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSList/RSListToolbar.tsx index 3c9b3e53..149f7ebe 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSList/RSListToolbar.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSList/RSListToolbar.tsx @@ -11,9 +11,9 @@ import HelpButton from '@/components/Help/HelpButton'; import useDropdown from '@/hooks/useDropdown'; import { HelpTopic } from '@/models/miscellaneous'; import { CstType } from '@/models/rsform'; +import { getCstTypePrefix } from '@/models/rsformAPI'; import { prefixes } from '@/utils/constants'; -import { labelCstType } from '@/utils/labels'; -import { getCstTypePrefix, getCstTypeShortcut } from '@/utils/misc'; +import { getCstTypeShortcut, labelCstType } from '@/utils/labels'; interface RSListToolbarProps { isMutable?: boolean; diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph/useGraphFilter.ts b/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph/useGraphFilter.ts index 59bf90a7..74cb5a9c 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph/useGraphFilter.ts +++ b/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph/useGraphFilter.ts @@ -2,7 +2,7 @@ import { useLayoutEffect, useMemo, useState } from 'react'; import { GraphFilterParams } from '@/models/miscellaneous'; import { CstType, IRSForm } from '@/models/rsform'; -import { Graph } from '@/utils/Graph'; +import { Graph } from '@/models/Graph'; function useGraphFilter(schema: IRSForm | undefined, params: GraphFilterParams, toggleUpdate: boolean) { const [filtered, setFiltered] = useState(new Graph()); diff --git a/rsconcept/frontend/src/pages/RSFormPage/RSTabs.tsx b/rsconcept/frontend/src/pages/RSFormPage/RSTabs.tsx index affb0e0c..c616230d 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/RSTabs.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/RSTabs.tsx @@ -28,8 +28,8 @@ import DlgUploadRSForm from '@/dialogs/DlgUploadRSForm'; import useQueryStrings from '@/hooks/useQueryStrings'; import { UserAccessMode } from '@/models/miscellaneous'; import { IConstituenta, ICstCreateData, ICstRenameData, ICstUpdateData, TermForm } from '@/models/rsform'; +import { generateAlias } from '@/models/rsformAPI'; import { EXTEOR_TRS_FILE, prefixes, TIMEOUT_UI_REFRESH } from '@/utils/constants'; -import { createAliasFor } from '@/utils/misc'; import EditorConstituenta from './EditorConstituenta'; import EditorRSForm from './EditorRSForm'; @@ -179,7 +179,7 @@ function RSTabs() { if (!schema?.items) { return; } - data.alias = data.alias || createAliasFor(data.cst_type, schema); + data.alias = data.alias || generateAlias(data.cst_type, schema); cstCreate(data, newCst => { toast.success(`Конституента добавлена: ${newCst.alias}`); navigateTab(activeTab, newCst.id); diff --git a/rsconcept/frontend/src/utils/codemirror.ts b/rsconcept/frontend/src/utils/codemirror.ts index ed556a7d..b5efea7e 100644 --- a/rsconcept/frontend/src/utils/codemirror.ts +++ b/rsconcept/frontend/src/utils/codemirror.ts @@ -193,7 +193,12 @@ export function domTooltipEntityReference(ref: IEntityReference, cst: IConstitue parseGrammemes(ref.form).forEach(gramStr => { const gram = document.createElement('div'); gram.id = `tooltip-${gramStr}`; - gram.className = clsx('min-w-[3rem]', 'px-1', 'border rounded-md', 'text-sm text-center whitespace-nowrap'); + gram.className = clsx( + 'min-w-[3rem]', // prettier: split lines + 'px-1', + 'border rounded-md', + 'text-sm text-center whitespace-nowrap' + ); gram.style.borderWidth = '1px'; gram.style.borderColor = colorFgGrammeme(gramStr, colors); gram.style.color = colorFgGrammeme(gramStr, colors); diff --git a/rsconcept/frontend/src/utils/constants.ts b/rsconcept/frontend/src/utils/constants.ts index 6a30c7ab..c922f0f1 100644 --- a/rsconcept/frontend/src/utils/constants.ts +++ b/rsconcept/frontend/src/utils/constants.ts @@ -37,7 +37,7 @@ export const resources = { * Numeric limitations. */ export const limits = { - alias_len: 12 + library_alias_len: 12 }; /** @@ -45,7 +45,7 @@ export const limits = { */ export const patterns = { login: '^[a-zA-Z][a-zA-Z0-9_\\-]{1,}[a-zA-Z0-9]$', - alias: `.{1,${limits.alias_len}}` + library_alias: `.{1,${limits.library_alias_len}}` }; /** diff --git a/rsconcept/frontend/src/utils/labels.ts b/rsconcept/frontend/src/utils/labels.ts index c2838b7e..404addd4 100644 --- a/rsconcept/frontend/src/utils/labels.ts +++ b/rsconcept/frontend/src/utils/labels.ts @@ -111,7 +111,25 @@ export function labelToken(id: TokenID): string { } /** - * Generates description for {@link TokenID}.. + * 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]'; + } +} + +/** + * Generates description for {@link TokenID}. */ export function describeToken(id: TokenID): string { // prettier-ignore diff --git a/rsconcept/frontend/src/utils/misc.ts b/rsconcept/frontend/src/utils/misc.ts deleted file mode 100644 index 794d44e9..00000000 --- a/rsconcept/frontend/src/utils/misc.ts +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Module: miscellaneous static functions to generate UI resources. - */ - -import { ILibraryItem } from '@/models/library'; -import { CstType, IConstituenta, IRSForm } from '@/models/rsform'; -import { IRSErrorDescription, RSErrorClass } from '@/models/rslang'; -import { inferErrorClass } from '@/models/rslangAPI'; - -import { labelCstType } from './labels'; - -export function getCstTypePrefix(type: CstType) { - // prettier-ignore - switch (type) { - case CstType.BASE: return 'X'; - case CstType.CONSTANT: return 'C'; - case CstType.STRUCTURED: return 'S'; - case CstType.AXIOM: return 'A'; - case CstType.TERM: return 'D'; - case CstType.FUNCTION: return 'F'; - case CstType.PREDICATE: return 'P'; - case CstType.THEOREM: return 'T'; - } -} - -export function validateCstAlias(alias: string, type: CstType, schema: IRSForm): boolean { - return alias.length >= 2 && alias[0] == getCstTypePrefix(type) && !schema.items.find(cst => cst.alias === alias); -} - -export function getCstExpressionPrefix(cst: IConstituenta): string { - return cst.alias + (cst.cst_type === CstType.STRUCTURED ? '::=' : ':=='); -} - -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]'; - } -} - -export function createAliasFor(type: CstType, schema: IRSForm): string { - const prefix = getCstTypePrefix(type); - if (!schema.items || schema.items.length <= 0) { - return `${prefix}1`; - } - const index = schema.items.reduce((prev, cst, index) => { - if (cst.cst_type !== type) { - return prev; - } - index = Number(cst.alias.slice(1 - cst.alias.length)) + 1; - return Math.max(prev, index); - }, 1); - return `${prefix}${index}`; -} - -export function cloneTitle(target: ILibraryItem): string { - if (!target.title.includes('[клон]')) { - return target.title + ' [клон]'; - } else { - return target.title + '+'; - } -} - -export function getRSErrorPrefix(error: IRSErrorDescription): string { - const id = error.errorType.toString(16); - // prettier-ignore - switch(inferErrorClass(error.errorType)) { - case RSErrorClass.LEXER: return 'L' + id; - case RSErrorClass.PARSER: return 'P' + id; - case RSErrorClass.SEMANTIC: return 'S' + id; - case RSErrorClass.UNKNOWN: return 'U' + id; - } -} diff --git a/rsconcept/frontend/src/utils/selectors.ts b/rsconcept/frontend/src/utils/selectors.ts index c1ef4ace..a4c640ae 100644 --- a/rsconcept/frontend/src/utils/selectors.ts +++ b/rsconcept/frontend/src/utils/selectors.ts @@ -1,5 +1,5 @@ /** - * Module: Mappings for selector UI elements. + * Module: Mappings for selector UI elements. Do not confuse with html selectors */ import { LayoutTypes } from 'reagraph';