From 25b577233bfba35666c6e7aa675ced29cb5cf66c Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Wed, 28 Aug 2024 00:00:04 +0300 Subject: [PATCH] M: Small bug fixes --- .../frontend/src/models/rslangAPI.test.ts | 23 ++++++++- rsconcept/frontend/src/models/rslangAPI.ts | 50 +++++++++++++++++-- .../src/pages/ManualsPage/items/HelpMain.tsx | 14 +++--- .../pages/ManualsPage/items/HelpThesaurus.tsx | 4 +- 4 files changed, 78 insertions(+), 13 deletions(-) diff --git a/rsconcept/frontend/src/models/rslangAPI.test.ts b/rsconcept/frontend/src/models/rslangAPI.test.ts index ab4282dd..ba75ec77 100644 --- a/rsconcept/frontend/src/models/rslangAPI.test.ts +++ b/rsconcept/frontend/src/models/rslangAPI.test.ts @@ -1,4 +1,4 @@ -import { extractGlobals, isSimpleExpression, splitTemplateDefinition } from './rslangAPI'; +import { applyTypificationMapping, extractGlobals, isSimpleExpression, splitTemplateDefinition } from './rslangAPI'; const globalsData = [ ['', ''], @@ -47,3 +47,24 @@ describe('Testing split template', () => { expect(`${result.head}||${result.body}`).toBe(expected); }); }); + +const typificationMappingData = [ + ['', '', '', ''], + ['X1', 'X2', 'X1', 'X2'], + ['X1', 'X2', 'ℬ(X1)', 'ℬ(X2)'], + ['X1', 'X2', 'X1×X3', 'X2×X3'], + ['X1', '(X1×X1)', 'X1', 'X1×X1'], + ['X1', '(X1×X1)', 'ℬ(X1)', 'ℬ(X1×X1)'], + ['X1', '(X1×X1)', 'ℬ(X1×X2)', 'ℬ((X1×X1)×X2)'], + ['X1', 'ℬ(X3)', 'ℬ(X1)', 'ℬℬ(X3)'], + ['X1', 'ℬ(X3)', 'ℬ(X1×X1)', 'ℬ(ℬ(X3)×ℬ(X3))'] +]; +describe('Testing typification mapping', () => { + it.each(typificationMappingData)( + 'Apply typification mapping %p', + (original: string, replacement: string, input: string, expected: string) => { + const result = applyTypificationMapping(input, { [original]: replacement }); + expect(result).toBe(expected); + } + ); +}); diff --git a/rsconcept/frontend/src/models/rslangAPI.ts b/rsconcept/frontend/src/models/rslangAPI.ts index 3d2755cf..4cac6b18 100644 --- a/rsconcept/frontend/src/models/rslangAPI.ts +++ b/rsconcept/frontend/src/models/rslangAPI.ts @@ -164,13 +164,55 @@ export function applyAliasMapping(target: string, mapping: AliasMapping): string * Apply alias typification mapping. */ export function applyTypificationMapping(target: string, mapping: AliasMapping): string { - const result = applyAliasMapping(target, mapping); - if (result === target) { + const modified = applyAliasMapping(target, mapping); + if (modified === target) { return target; } - // remove double parentheses - // deal with ℬ(ℬ) + const deleteBrackets: number[] = []; + const positions: number[] = []; + const booleans: number[] = []; + let boolCount: number = 0; + let stackSize: number = 0; + + for (let i = 0; i < modified.length; i++) { + const char = modified[i]; + if (char === 'ℬ') { + boolCount++; + continue; + } + if (char === '(') { + stackSize++; + positions.push(i); + booleans.push(boolCount); + } + boolCount = 0; + if (char === ')') { + if ( + i < modified.length - 1 && + modified[i + 1] === ')' && + stackSize > 1 && + positions[stackSize - 2] + booleans[stackSize - 1] + 1 === positions[stackSize - 1] + ) { + deleteBrackets.push(i); + deleteBrackets.push(positions[stackSize - 2]); + } + if (i === modified.length - 1 && stackSize === 1 && positions[0] === 0) { + deleteBrackets.push(i); + deleteBrackets.push(positions[0]); + } + stackSize--; + positions.pop(); + booleans.pop(); + } + } + + let result = ''; + for (let i = 0; i < modified.length; i++) { + if (!deleteBrackets.includes(i)) { + result += modified[i]; + } + } return result; } diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpMain.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpMain.tsx index 65605c72..159acd70 100644 --- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpMain.tsx +++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpMain.tsx @@ -9,16 +9,17 @@ import TopicItem from '../TopicItem'; function HelpMain() { return ( -
Портал позволяет анализировать предметные области, формально записывать системы определений и синтезировать их с
помощью математического аппарата
- Такие системы называются Концептуальными схемами и состоят из отдельных{' '}
-
- Портал поддерживает актуальные версии браузеров Chrome, Firefox, Safari. Убедитесь, что используете последнюю - версию браузера в случае возникновения визуальных ошибок или проблем с производительностью. + Портал поддерживает актуальные версии браузеров Chrome, Firefox, Safari, включая мобильные устройства. + Убедитесь, что используете последнюю версию браузера в случае возникновения визуальных ошибок или проблем с + производительностью.
Ваши пожелания по доработке, найденные ошибки и иные предложения можно направлять на email:{' '} diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpThesaurus.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpThesaurus.tsx index 85098060..cbc8e29a 100644 --- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpThesaurus.tsx +++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpThesaurus.tsx @@ -181,7 +181,7 @@ function HelpThesaurus() {