1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-10 11:10:31 +02:00
OpenIntegrations/ci/os/internal/Modules/МетодыСловарей.os
2024-09-16 19:14:17 +03:00

276 lines
11 KiB
Plaintext

#Использовать "./internal"
Перем МассивСимволов;
Перем ЕстьНовыеСлова;
#Область СлужебныйПрограммныйИнтерфейс
Функция СоздатьНаборСловарей(Знач ФайлыМодулей, Знач Языки, Знач КаталогСловарей) Экспорт
ЕстьНовыеСлова = Ложь;
Для Каждого Язык Из Языки Цикл
ПутьСловаря = КаталогСловарей + Язык + ".json";
ФайлСловаря = Новый Файл(ПутьСловаря);
Если ФайлСловаря.Существует() Тогда
СоздатьСловарь(ФайлыМодулей, ПутьСловаря);
КонецЕсли;
КонецЦикла;
Возврат ЕстьНовыеСлова;
КонецФункции
Процедура СоздатьСловарь(Знач ФайлыМодулей, Знач ПутьСловаря) Экспорт
МассивСимволов = Инструменты.ПолучитьМассивСимволов();
СоответствиеСловаря = Инструменты.ПрочитатьФайлJSON(ПутьСловаря);
СписокСлов = Новый СписокЗначений();
Для Каждого Модуль Из ФайлыМодулей Цикл
ПолучитьМассивСловОригинала(Модуль.ПолноеИмя, СписокСлов);
КонецЦикла;
Для Каждого Слово Из СписокСлов Цикл
СловоОригинал = Слово.Значение;
СуществующийПеревод = СоответствиеСловаря[СловоОригинал];
Если Не ЗначениеЗаполнено(СуществующийПеревод) Тогда
СоответствиеСловаря.Вставить(СловоОригинал, "");
ЕстьНовыеСлова = Истина;
КонецЕсли;
КонецЦикла;
ЗаписатьJSONСловаря(СоответствиеСловаря, ПутьСловаря);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ЗаписатьJSONСловаря(СоответствиеСловаря, ПутьСловаря)
ТЗ = Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("Ключ");
ТЗ.Колонки.Добавить("Значение");
ТЗ.Колонки.Добавить("ДлинаКлюча");
ТЗ.Колонки.Добавить("Заполнено");
Для Каждого Элемент Из СоответствиеСловаря Цикл
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Ключ = Элемент.Ключ;
НоваяСтрока.Значение = Элемент.Значение;
НоваяСтрока.ДлинаКлюча = СтрДлина(Элемент.Ключ);
НоваяСтрока.Заполнено = ЗначениеЗаполнено(Элемент.Значение);
КонецЦикла;
ТЗ.Сортировать("Заполнено УБЫВ, ДлинаКлюча");
JSON = Новый ЗаписьJSON;
JSON.ОткрытьФайл(ПутьСловаря);
JSON.ЗаписатьНачалоОбъекта();
Для Каждого СтрокаТЗ Из ТЗ Цикл
JSON.ЗаписатьИмяСвойства(СтрокаТЗ["Ключ"]);
JSON.ЗаписатьЗначение(СтрокаТЗ["Значение"]);
КонецЦикла;
JSON.ЗаписатьКонецОбъекта();
JSON.Закрыть();
КонецПроцедуры
Процедура ПолучитьМассивСловОригинала(Знач ПутьКФайлу, СписокСлов)
Документ = Новый ТекстовыйДокумент();
Документ.Прочитать(ПутьКФайлу, "UTF-8");
Для Н = 1 По Документ.КоличествоСтрок() Цикл
ТекущаяСтрока = СокрЛП(Документ.ПолучитьСтроку(Н));
РазобратьСтрокуНаСлова(ТекущаяСтрока, СписокСлов);
КонецЦикла;
КонецПроцедуры
Процедура РазобратьСтрокуНаСлова(Знач ТекущаяСтрока, СписокСлов)
Если СтрНачинаетсяС(ТекущаяСтрока, "// !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог") Тогда
Возврат;
КонецЕсли;
Если СтрНачинаетсяС(ТекущаяСтрока, "//") Тогда
РазобратьСтрокуКомментария(ТекущаяСтрока, СписокСлов);
Иначе
ЭтоВыражение = СтрНайти(ТекущаяСтрока, """") <> 0
Или СтрНайти(ТекущаяСтрока, "|") <> 0
Или СтрНайти(ТекущаяСтрока, "<") <> 0
Или СтрНайти(ТекущаяСтрока, ">") <> 0;
Если ЭтоВыражение Тогда
РазобратьВыражение(ТекущаяСтрока, СписокСлов);
Иначе
РазобратьОбычнуюСтроку(ТекущаяСтрока, СписокСлов);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура РазобратьСтрокуКомментария(ТекущаяСтрока, СписокСлов)
ТекущаяСтрока = СокрЛП(СтрЗаменить(ТекущаяСтрока, "//", ""));
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, " - ", "$");
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, ": [", "$");
МассивСтроки = СтрРазделить(ТекущаяСтрока, "$", Ложь);
Для Г = 0 По МассивСтроки.ВГраница() Цикл
ДобавитьСлово(СписокСлов, МассивСтроки[Г]);
КонецЦикла;
КонецПроцедуры
Процедура РазобратьВыражение(ТекущаяСтрока, СписокСлов)
ТекущаяСтрока = " " + ТекущаяСтрока;
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, """<", "$");
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, ">""", "$");
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, """", "$");
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "|", "$");
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "<", "$");
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, ">", "$");
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "$$", """""");
МассивСтроки = СтрРазделить(ТекущаяСтрока, "$", Истина);
Цельный = Ложь;
Для Каждого Элемент Из МассивСтроки Цикл
Если Не ЗначениеЗаполнено(СокрЛП(Элемент)) Тогда
Продолжить;
КонецЕсли;
Если Цельный Тогда
ДобавитьСлово(СписокСлов, Элемент);
Иначе
РазобратьОбычнуюСтроку(Элемент, СписокСлов);
КонецЕсли;
Цельный = Не Цельный;
КонецЦикла;
КонецПроцедуры
Процедура РазобратьОбычнуюСтроку(ТекущаяСтрока, СписокСлов)
Для Каждого Символ Из МассивСимволов Цикл
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, Символ, "$");
КонецЦикла;
Пока СтрНайти(ТекущаяСтрока, "$$") <> 0 Цикл
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "$$", "$");
КонецЦикла;
МассивЭлемента = СтрРазделить(ТекущаяСтрока, "$", Ложь);
Для Каждого Дробный Из МассивЭлемента Цикл
ДобавитьСлово(СписокСлов, Дробный);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьСлово(Список, Слово)
НормализоватьСлово(Слово);
Если Не ЗначениеЗаполнено(Слово) Или Не НайтиКириллицу(Слово) Тогда
Возврат;
КонецЕсли;
СуществующееЗначение = Список.НайтиПоЗначению(Слово);
Если СуществующееЗначение = Неопределено Тогда
Список.Добавить(Слово, СтрДлина(Слово));
КонецЕсли;
КонецПроцедуры
Процедура НормализоватьСлово(Слово)
Слово = СокрЛП(Слово);
Нормализовано = Ложь;
Пока Не Нормализовано Цикл
ПервыйСимвол = Ложь;
ПоследнийСимвол = Ложь;
Для Каждого Символ Из МассивСимволов Цикл
ПервыйСимвол = СтрНачинаетсяС(Слово, Символ);
ПоследнийСимвол = СтрЗаканчиваетсяНа(Слово, Символ);
Если ПервыйСимвол Или ПоследнийСимвол Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если ПервыйСимвол Тогда
Слово = Прав(Слово, СтрДлина(Слово) - 1);
КонецЕсли;
Если ПоследнийСимвол Тогда
Слово = Лев(Слово, СтрДлина(Слово) - 1);
КонецЕсли;
Если Не ПервыйСимвол И Не ПоследнийСимвол Тогда
Нормализовано = Истина;
КонецЕсли;
КонецЦикла;
Слово = СокрЛП(Слово);
КонецПроцедуры
Функция НайтиКириллицу(Знач Слово)
Алфавит = Инструменты.ПолучитьАлфавит();
СловоНРег = НРег(Слово);
Для Каждого Буква Из Алфавит Цикл
Если СтрНайти(СловоНРег, Буква) <> 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
#КонецОбласти