#Использовать "./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 Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;

	Возврат Ложь;

КонецФункции

#КонецОбласти



