From 1992bf76941dbe69274bcd6a704e0587b45470df Mon Sep 17 00:00:00 2001 From: SugarHedgehog Date: Tue, 18 Feb 2025 13:50:55 +0300 Subject: [PATCH 1/8] sklonlxkand on python --- dev/sclon/sklonlxkand.py | 50 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 dev/sclon/sklonlxkand.py diff --git a/dev/sclon/sklonlxkand.py b/dev/sclon/sklonlxkand.py new file mode 100644 index 0000000000..d6feac8110 --- /dev/null +++ b/dev/sclon/sklonlxkand.py @@ -0,0 +1,50 @@ +import pymorphy2 + +morph = pymorphy2.MorphAnalyzer() + +def sklonlxkand(slovo): + parsed_word = morph.parse(slovo)[0] + + # Singular forms + singular = { + 'ie': parsed_word.inflect({'nomn'}).word, # именительный + 're': parsed_word.inflect({'gent'}).word, # родительный + 'de': parsed_word.inflect({'datv'}).word, # дательный + 've': parsed_word.inflect({'accs'}).word, # винительный + 'te': parsed_word.inflect({'ablt'}).word, # творительный + 'pe': parsed_word.inflect({'loct'}).word, # предложный + } + + # Plural forms + plural = { + 'im': parsed_word.inflect({'nomn', 'plur'}).word, # именительный + 'rm': parsed_word.inflect({'gent', 'plur'}).word, # родительный + 'dm': parsed_word.inflect({'datv', 'plur'}).word, # дательный + 'vm': parsed_word.inflect({'accs', 'plur'}).word, # винительный + 'tm': parsed_word.inflect({'ablt', 'plur'}).word, # творительный + 'pm': parsed_word.inflect({'loct', 'plur'}).word, # предложный + } + + # Gender (rod) + gender_map = { + 'masc': 0, # мужской + 'femn': 1, # женский + 'neut': 2, # средний + 'plur': 3, # только множественное число + } + gender_tag = parsed_word.tag.gender + if gender_tag is None and 'plur' in parsed_word.tag: gender_tag = 'plur' + rod = gender_map.get(gender_tag, 3) # Default to plural if gender is not found + + # Animacy (odu) + odu = 1 if 'anim' in parsed_word.tag else 0 # 1: одушевлённое, 0: неодушевлённое + + # Combine all results into a SimpleNamespace object + result = { + **singular, + **plural, + 'rod':rod, + 'odu':odu + } + + return result From ebb3cead19615d15663902cd28fea941c5d03528 Mon Sep 17 00:00:00 2001 From: SugarHedgehog Date: Tue, 18 Feb 2025 16:33:55 +0300 Subject: [PATCH 2/8] sklonlxkand.py --- dev/sclon/README.md | 179 +++++++++++++++++++++++++++++++++++++++ dev/sclon/lx.js | 119 ++++++++++++++++++++++++++ dev/sclon/sklonlxkand.js | 93 ++++++++++++++++++++ dev/sclon/sklonlxkand.py | 13 ++- 4 files changed, 401 insertions(+), 3 deletions(-) create mode 100644 dev/sclon/README.md create mode 100644 dev/sclon/lx.js create mode 100644 dev/sclon/sklonlxkand.js diff --git a/dev/sclon/README.md b/dev/sclon/README.md new file mode 100644 index 0000000000..1b253d4b24 --- /dev/null +++ b/dev/sclon/README.md @@ -0,0 +1,179 @@ +▎Описание + +Этот скрипт позволяет пользователю вводить слова, которые затем обрабатываются с помощью внешнего Python-скрипта `sklonlxkand.py`. Результаты обработки записываются в файл `lx.js`. Если слово уже было обработано, оно не будет добавлено в файл повторно. + +▎Требования + +• Установленный Node.js (версия 12 или выше). + +• Установленный Python (версия 3.6 или выше). + +• Доступ к файлу `sklonlxkand.py`, который должен находиться в той же директории, что и этот скрипт. + +• Файл `lx.js` будет создан автоматически, если его нет. + +▎Запуск + +Перейдите к папку, содержащую `sklonlxkand.js` + +```bash +node sklonlxkand.js +``` + + +▎Использование + +1. После запуска скрипта в терминале появится сообщение: + +```bash +Введите слово для обработки (или "exit" для выхода): +``` + +2. Введите слово, которое вы хотите обработать, и нажмите Enter. + +```bash +Введите слово для обработки (или "exit" для выхода): кись +``` + +3. Скрипт вызовет Python-скрипт `sklonlxkand.py`, который обработает введенное слово и вернет результат. + +4. Результат будет выведен в терминал и записан в файл lx.js. + +```bash +Результат: { + ie: 'мир', + re: 'мира', + de: 'миру', + ve: 'мир', + te: 'миром', + pe: 'мире', + im: 'миры', + rm: 'миров', + dm: 'мирам', + vm: 'миры', + tm: 'мирами', + pm: 'мирах', + rod: 0, + odu: 0 +} +Данные для слова "мир" записаны в файл lx.js +``` + +Если слово уже существует в файле, вы получите сообщение: +```bash +Слово "ваше_слово" уже существует в файле lx.js. +``` + +5. Чтобы завершить работу скрипта, введите exit и нажмите Enter. + +▎Пример использования +```bash +Введите слово для обработки (или "exit" для выхода): водяной +Результат: { + ie: 'водяной', + re: 'водяного', + de: 'водяному', + ve: 'водяного', + te: 'водяным', + pe: 'водяном', + im: 'водяные', + rm: 'водяных', + dm: 'водяным', + vm: 'водяных', + tm: 'водяными', + pm: 'водяных', + rod: 0, + odu: 1 +} +Данные для слова "водяной" записаны в файл lx.js +Введите слово для обработки (или "exit" для выхода): шерсть +Результат: { + ie: 'шерсть', + re: 'шерсти', + de: 'шерсти', + ve: 'шерсть', + te: 'шерстью', + pe: 'шерсти', + im: 'шерсти', + rm: 'шерстей', + dm: 'шерстям', + vm: 'шерсти', + tm: 'шерстями', + pm: 'шерстях', + rod: 1, + odu: 0 +} +Данные для слова "шерсть" записаны в файл lx.js +Введите слово для обработки (или "exit" для выхода): ковёр-самолёт +Результат: { + ie: 'ковёр-самолёт', + re: 'ковра-самолёта', + de: 'ковру-самолёту', + ve: 'ковёр-самолёт', + te: 'ковром-самолётом', + pe: 'ковре-самолёте', + im: 'ковры-самолёты', + rm: 'ковров-самолётов', + dm: 'коврам-самолётам', + vm: 'ковры-самолёты', + tm: 'коврами-самолётами', + pm: 'коврах-самолётах', + rod: 0, + odu: 0 +} +Данные для слова "ковёр-самолёт" записаны в файл lx.js +Введите слово для обработки (или "exit" для выхода): тать +Результат: { + ie: 'тать', + re: 'татя', + de: 'татю', + ve: 'татя', + te: 'татем', + pe: 'тате', + im: 'тати', + rm: 'татей', + dm: 'татям', + vm: 'татей', + tm: 'татями', + pm: 'татях', + rod: 0, + odu: 1 +} +Данные для слова "тать" записаны в файл lx.js +Введите слово для обработки (или "exit" для выхода): грация +Результат: { + ie: 'грация', + re: 'грации', + de: 'грации', + ve: 'грацию', + te: 'грацией', + pe: 'грации', + im: 'грации', + rm: 'граций', + dm: 'грациям', + vm: 'грации', + tm: 'грациями', + pm: 'грациях', + rod: 1, + odu: 0 +} +Данные для слова "грация" записаны в файл lx.js +Введите слово для обработки (или "exit" для выхода): кольцо +Результат: { + ie: 'кольцо', + re: 'кольца', + de: 'кольцу', + ve: 'кольцо', + te: 'кольцом', + pe: 'кольце', + im: 'кольца', + rm: 'колец', + dm: 'кольцам', + vm: 'кольца', + tm: 'кольцами', + pm: 'кольцах', + rod: 2, + odu: 0 +} +Данные для слова "кольцо" записаны в файл lx.js +``` diff --git a/dev/sclon/lx.js b/dev/sclon/lx.js new file mode 100644 index 0000000000..42d43a19ce --- /dev/null +++ b/dev/sclon/lx.js @@ -0,0 +1,119 @@ + +lx['водяной']={ + ie:"водяной", + re:"водяного", + de:"водяному", + ve:"водяного", + te:"водяным", + pe:"водяном", + im:"водяные", + rm:"водяных", + dm:"водяным", + vm:"водяных", + tm:"водяными", + pm:"водяных", + rod:0, + odu:1 +}; + +lx['шерсть']={ + ie:"шерсть", + re:"шерсти", + de:"шерсти", + ve:"шерсть", + te:"шерстью", + pe:"шерсти", + im:"шерсти", + rm:"шерстей", + dm:"шерстям", + vm:"шерсти", + tm:"шерстями", + pm:"шерстях", + rod:1, + odu:0 +}; + +lx['ковёр-самолёт']={ + ie:"ковёр-самолёт", + re:"ковра-самолёта", + de:"ковру-самолёту", + ve:"ковёр-самолёт", + te:"ковром-самолётом", + pe:"ковре-самолёте", + im:"ковры-самолёты", + rm:"ковров-самолётов", + dm:"коврам-самолётам", + vm:"ковры-самолёты", + tm:"коврами-самолётами", + pm:"коврах-самолётах", + rod:0, + odu:0 +}; + +lx['тать']={ + ie:"тать", + re:"татя", + de:"татю", + ve:"татя", + te:"татем", + pe:"тате", + im:"тати", + rm:"татей", + dm:"татям", + vm:"татей", + tm:"татями", + pm:"татях", + rod:0, + odu:1 +}; + +lx['грация']={ + ie:"грация", + re:"грации", + de:"грации", + ve:"грацию", + te:"грацией", + pe:"грации", + im:"грации", + rm:"граций", + dm:"грациям", + vm:"грации", + tm:"грациями", + pm:"грациях", + rod:1, + odu:0 +}; + +lx['кольцо']={ + ie:"кольцо", + re:"кольца", + de:"кольцу", + ve:"кольцо", + te:"кольцом", + pe:"кольце", + im:"кольца", + rm:"колец", + dm:"кольцам", + vm:"кольца", + tm:"кольцами", + pm:"кольцах", + rod:2, + odu:0 +}; + +lx['мир']={ + ie:"мир", + re:"мира", + de:"миру", + ve:"мир", + te:"миром", + pe:"мире", + im:"миры", + rm:"миров", + dm:"мирам", + vm:"миры", + tm:"мирами", + pm:"мирах", + rod:0, + odu:0 +}; diff --git a/dev/sclon/sklonlxkand.js b/dev/sclon/sklonlxkand.js new file mode 100644 index 0000000000..9329c60ffc --- /dev/null +++ b/dev/sclon/sklonlxkand.js @@ -0,0 +1,93 @@ +const { exec } = require('child_process'); +const readline = require('readline'); +const fs = require('fs'); + +// Создаем интерфейс для чтения ввода из консоли +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +// Функция для вызова Python скрипта +function sklonlxkand(slovo) { + return new Promise((resolve, reject) => { + exec(`python sklonlxkand.py "${slovo}"`, (error, stdout, stderr) => { + if (error) { + reject(`Ошибка: ${error.message}`); + return; + } + if (stderr) { + reject(`stderr: ${stderr}`); + return; + } + try { + const result = JSON.parse(stdout); + resolve(result); + } catch (e) { + reject('Ошибка при разборе результата: ' + e.message); + } + }); + }); +} + +// Функция для записи данных в файл lx.js +function writeToFile(slovo, data) { + const filePath = 'lx.js'; + + // Читаем текущее содержимое файла + let fileContent = ''; + if (fs.existsSync(filePath)) { + fileContent = fs.readFileSync(filePath, 'utf8'); + } + + // Проверяем, есть ли уже запись для данного слова + const regex = new RegExp(`${slovo}`, 'g'); + if (regex.test(fileContent)) { + console.log(`Слово "${slovo}" уже существует в файле lx.js.`); + return; // Выходим из функции, если слово уже есть + } + + // Формируем новую запись + const newEntry = `\nlx['${slovo}']={\n` + + Object.entries(data) + .map(([key, value]) => ` ${key}:${JSON.stringify(value)}`) + .join(',\n') + + '\n};\n'; + + // Добавляем новую запись в файл + fs.writeFileSync(filePath, fileContent + newEntry, 'utf8'); + console.log(`Данные для слова "${slovo}" записаны в файл lx.js`); +} + +// Функция для запроса слова у пользователя +function askForWord() { + rl.question('Введите слово для обработки (или "exit" для выхода): ', async (slovo) => { + if (slovo.toLowerCase() === 'exit') { + rl.close(); // Закрываем интерфейс и завершаем программу + return; + } + + try { + // Вызываем функцию sklonlxkand и получаем результат + const result = await sklonlxkand(slovo); + console.log('Результат:', result); + + // Записываем результат в файл lx.js + writeToFile(slovo, result); + } catch (error) { + console.error(error); + } + + // Повторяем запрос + askForWord(); + }); +} + +// Запускаем процесс +askForWord(); + +// Обработка закрытия интерфейса +rl.on('close', () => { + console.log('Программа завершена.'); + process.exit(0); +}); diff --git a/dev/sclon/sklonlxkand.py b/dev/sclon/sklonlxkand.py index d6feac8110..3c10f706b4 100644 --- a/dev/sclon/sklonlxkand.py +++ b/dev/sclon/sklonlxkand.py @@ -1,4 +1,6 @@ import pymorphy2 +import sys +import json morph = pymorphy2.MorphAnalyzer() @@ -39,12 +41,17 @@ def sklonlxkand(slovo): # Animacy (odu) odu = 1 if 'anim' in parsed_word.tag else 0 # 1: одушевлённое, 0: неодушевлённое - # Combine all results into a SimpleNamespace object + # Combine all results into a dictionary result = { **singular, **plural, - 'rod':rod, - 'odu':odu + 'rod': rod, + 'odu': odu } return result + +if __name__ == "__main__": + word = sys.argv[1] + result = sklonlxkand(word) + print(json.dumps(result, ensure_ascii=False)) From 1c15de91de442aa5344c44984d976590beb1fc16 Mon Sep 17 00:00:00 2001 From: SugarHedgehog Date: Tue, 18 Feb 2025 16:41:42 +0300 Subject: [PATCH 3/8] update readme --- dev/sclon/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/dev/sclon/README.md b/dev/sclon/README.md index 1b253d4b24..e76b8660a7 100644 --- a/dev/sclon/README.md +++ b/dev/sclon/README.md @@ -7,6 +7,24 @@ • Установленный Node.js (версия 12 или выше). • Установленный Python (версия 3.6 или выше). +• Установить пакет на Python `pymorphy2` + +```bash +#через pip +pip install pymorphy2 +#через yay +yay -S python-pymorphy2 +``` + +• Рекомендуется установить пакет на Python `pymorphy2-dicts-ru` и переодически обновлять + +```bash +#через pip +pip install pymorphy2-dicts-ru +pip install -U pymorphy2-dicts-ru +#через yay +yay -S python-pymorphy2-dicts-ru +``` • Доступ к файлу `sklonlxkand.py`, который должен находиться в той же директории, что и этот скрипт. From eb66c54e29a2bb45d9746b67164963e66bf3a524 Mon Sep 17 00:00:00 2001 From: Aleksandra Sumatokhina <88662554+SugarHedgehog@users.noreply.github.com> Date: Tue, 18 Feb 2025 16:48:31 +0300 Subject: [PATCH 4/8] Update README.md --- dev/sclon/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/sclon/README.md b/dev/sclon/README.md index e76b8660a7..cd0fde0e8e 100644 --- a/dev/sclon/README.md +++ b/dev/sclon/README.md @@ -6,7 +6,7 @@ • Установленный Node.js (версия 12 или выше). -• Установленный Python (версия 3.6 или выше). +• Установленный Python (версия 3.5 или выше). • Установить пакет на Python `pymorphy2` ```bash From 5252cb7fa80b96f886369598f7358c6fc326cab4 Mon Sep 17 00:00:00 2001 From: Aleksandra Sumatokhina Date: Wed, 19 Feb 2025 11:46:21 +0300 Subject: [PATCH 5/8] fix plural forms --- dev/sclon/sklonlxkand.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/dev/sclon/sklonlxkand.py b/dev/sclon/sklonlxkand.py index 3c10f706b4..e957c3b5c4 100644 --- a/dev/sclon/sklonlxkand.py +++ b/dev/sclon/sklonlxkand.py @@ -9,22 +9,22 @@ def sklonlxkand(slovo): # Singular forms singular = { - 'ie': parsed_word.inflect({'nomn'}).word, # именительный - 're': parsed_word.inflect({'gent'}).word, # родительный - 'de': parsed_word.inflect({'datv'}).word, # дательный - 've': parsed_word.inflect({'accs'}).word, # винительный - 'te': parsed_word.inflect({'ablt'}).word, # творительный - 'pe': parsed_word.inflect({'loct'}).word, # предложный + 'ie': parsed_word.inflect({'nomn'}).word if parsed_word.inflect({'nomn'}) else "", # именительный + 're': parsed_word.inflect({'gent'}).word if parsed_word.inflect({'gent'}) else "", # родительный + 'de': parsed_word.inflect({'datv'}).word if parsed_word.inflect({'datv'}) else "", # дательный + 've': parsed_word.inflect({'accs'}).word if parsed_word.inflect({'accs'}) else "", # винительный + 'te': parsed_word.inflect({'ablt'}).word if parsed_word.inflect({'ablt'}) else "", # творительный + 'pe': parsed_word.inflect({'loct'}).word if parsed_word.inflect({'loct'}) else "", # предложный } # Plural forms plural = { - 'im': parsed_word.inflect({'nomn', 'plur'}).word, # именительный - 'rm': parsed_word.inflect({'gent', 'plur'}).word, # родительный - 'dm': parsed_word.inflect({'datv', 'plur'}).word, # дательный - 'vm': parsed_word.inflect({'accs', 'plur'}).word, # винительный - 'tm': parsed_word.inflect({'ablt', 'plur'}).word, # творительный - 'pm': parsed_word.inflect({'loct', 'plur'}).word, # предложный + 'im': parsed_word.inflect({'nomn', 'plur'}).word if parsed_word.inflect({'nomn', 'plur'}) else "", # именительный + 'rm': parsed_word.inflect({'gent', 'plur'}).word if parsed_word.inflect({'gent', 'plur'}) else "", # родительный + 'dm': parsed_word.inflect({'datv', 'plur'}).word if parsed_word.inflect({'datv', 'plur'}) else "", # дательный + 'vm': parsed_word.inflect({'accs', 'plur'}).word if parsed_word.inflect({'accs', 'plur'}) else "", # винительный + 'tm': parsed_word.inflect({'ablt', 'plur'}).word if parsed_word.inflect({'ablt', 'plur'}) else "", # творительный + 'pm': parsed_word.inflect({'loct', 'plur'}).word if parsed_word.inflect({'loct', 'plur'}) else "", # предложный } # Gender (rod) From bd0d4bfcaea5ab682d908dc9ac9dc3f6befe4eb0 Mon Sep 17 00:00:00 2001 From: Aleksandra Sumatokhina Date: Thu, 20 Feb 2025 10:36:55 +0300 Subject: [PATCH 6/8] fix "" --- dev/sclon/sklonlxkand.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/sclon/sklonlxkand.js b/dev/sclon/sklonlxkand.js index 9329c60ffc..d5528fb4c3 100644 --- a/dev/sclon/sklonlxkand.js +++ b/dev/sclon/sklonlxkand.js @@ -50,7 +50,7 @@ function writeToFile(slovo, data) { // Формируем новую запись const newEntry = `\nlx['${slovo}']={\n` + Object.entries(data) - .map(([key, value]) => ` ${key}:${JSON.stringify(value)}`) + .map(([key, value]) => ` ${key}:${JSON.stringify(value).replaceAll('"', "'")}`) .join(',\n') + '\n};\n'; From f5f3386ac27528220acc67d9ffe009f1a3338bbd Mon Sep 17 00:00:00 2001 From: Aleksandra Sumatokhina Date: Thu, 20 Feb 2025 11:42:13 +0300 Subject: [PATCH 7/8] word comparison --- dev/sclon/sklonlxkand.js | 73 +++++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/dev/sclon/sklonlxkand.js b/dev/sclon/sklonlxkand.js index d5528fb4c3..7365f58566 100644 --- a/dev/sclon/sklonlxkand.js +++ b/dev/sclon/sklonlxkand.js @@ -30,24 +30,71 @@ function sklonlxkand(slovo) { }); } -// Функция для записи данных в файл lx.js +function parseLxFile(filePath) { + const content = fs.readFileSync(filePath, 'utf8'); + const regex = /lx\['([^']+)'\]\s*=\s*({[^}]+});/g; + const entries = []; + + let match; + while ((match = regex.exec(content)) !== null) { + const word = match[1]; + let objStr = match[2].replace(/'/g, '"'); + + // Add missing quotes around property names if needed + objStr = objStr.replace(/(\w+):/g, '"$1":'); + + try { + const obj = JSON.parse(objStr); + entries.push({ word, obj }); + } catch (e) { + console.error(`Ошибка при разборе объекта для слова "${word}":`, e.message); + continue; + } + } + + return entries; +} + function writeToFile(slovo, data) { const filePath = 'lx.js'; + const existingEntries = parseLxFile(filePath); + const existingEntry = existingEntries.find(entry => entry.word === slovo); - // Читаем текущее содержимое файла - let fileContent = ''; - if (fs.existsSync(filePath)) { - fileContent = fs.readFileSync(filePath, 'utf8'); - } - - // Проверяем, есть ли уже запись для данного слова - const regex = new RegExp(`${slovo}`, 'g'); - if (regex.test(fileContent)) { + if (existingEntry) { console.log(`Слово "${slovo}" уже существует в файле lx.js.`); - return; // Выходим из функции, если слово уже есть + + // Сравниваем объекты + const existingObj = existingEntry.obj; + const newEntries = Object.entries(data).sort(); + const existingEntries = Object.entries(existingObj).sort(); + + if (JSON.stringify(newEntries) === JSON.stringify(existingEntries)) { + console.log('Объекты совпадают. Нет необходимости обновлять.'); + return; + } else { + console.log('Объекты не совпадают:'); + console.log('Существующий объект:'); + console.log(JSON.stringify(existingObj, null, 2)); + console.log('Новый объект:'); + console.log(JSON.stringify(data, null, 2)); + + rl.question('Хотите заменить существующий объект? (y/n): ', (answer) => { + if (answer.toLowerCase() === 'y') { + // Обновляем объект + const fileContent = fs.readFileSync(filePath, 'utf8'); + const updatedContent = fileContent.replace( + new RegExp(`lx\\['${slovo}'\\][^;]+;`, 'g'), + `lx['${slovo}']=${JSON.stringify(data, null, 2).replace(/"/g, "'")};` + ); + fs.writeFileSync(filePath, updatedContent, 'utf8'); + console.log('Объект обновлен.'); + } + askForWord(); + }); + return; + } } - // Формируем новую запись const newEntry = `\nlx['${slovo}']={\n` + Object.entries(data) .map(([key, value]) => ` ${key}:${JSON.stringify(value).replaceAll('"', "'")}`) @@ -55,7 +102,7 @@ function writeToFile(slovo, data) { '\n};\n'; // Добавляем новую запись в файл - fs.writeFileSync(filePath, fileContent + newEntry, 'utf8'); + fs.writeFileSync(filePath, fs.readFileSync(filePath, 'utf8') + newEntry, 'utf8'); console.log(`Данные для слова "${slovo}" записаны в файл lx.js`); } From 56247565e4ec2e7377b167dfc16616860d53edc4 Mon Sep 17 00:00:00 2001 From: Aleksandra Sumatokhina Date: Thu, 20 Feb 2025 11:41:12 +0300 Subject: [PATCH 8/8] add sort to alphabet --- dev/sclon/sklonlxkand.js | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/dev/sclon/sklonlxkand.js b/dev/sclon/sklonlxkand.js index 7365f58566..f255cfee9d 100644 --- a/dev/sclon/sklonlxkand.js +++ b/dev/sclon/sklonlxkand.js @@ -40,7 +40,7 @@ function parseLxFile(filePath) { const word = match[1]; let objStr = match[2].replace(/'/g, '"'); - // Add missing quotes around property names if needed + // При необходимости добавьте пропущенные кавычки вокруг названий свойств objStr = objStr.replace(/(\w+):/g, '"$1":'); try { @@ -95,14 +95,35 @@ function writeToFile(slovo, data) { } } - const newEntry = `\nlx['${slovo}']={\n` + + // Сортируем существующие записи + const sortedEntries = [...entries].sort((a, b) => a.word.localeCompare(b.word)); + + // Находим позицию для вставки нового слова + const insertIndex = sortedEntries.findIndex(entry => + slovo.localeCompare(entry.word) < 0 + ); + + // Формируем новую запись + const newEntry = `lx['${slovo}']={\n` + Object.entries(data) .map(([key, value]) => ` ${key}:${JSON.stringify(value).replaceAll('"', "'")}`) .join(',\n') + '\n};\n'; - // Добавляем новую запись в файл - fs.writeFileSync(filePath, fs.readFileSync(filePath, 'utf8') + newEntry, 'utf8'); + // Читаем текущее содержимое файла + let fileContent = fs.readFileSync(filePath, 'utf8'); + + // Если позиция для вставки найдена, вставляем перед найденной записью + if (insertIndex > -1) { + const targetWord = sortedEntries[insertIndex].word; + const targetRegex = new RegExp(`lx\\['${targetWord}'\\][^;]+;`, 'g'); + fileContent = fileContent.replace(targetRegex, newEntry + `lx['${targetWord}']=${JSON.stringify(sortedEntries[insertIndex].obj, null, 2).replace(/"/g, "'")};`); + } else { + // Иначе добавляем в конец файла + fileContent += newEntry; + } + + fs.writeFileSync(filePath, fileContent, 'utf8'); console.log(`Данные для слова "${slovo}" записаны в файл lx.js`); }