Перем СписокЯзыков;
Перем ОбщийМассивСлов;
Перем Алфавит;
Перем МассивСимволов;

Процедура ПолучитьСписокЯзыков() Экспорт

	СписокЯзыков = Новый Массив();
	СписокЯзыков.Добавить("en");

КонецПроцедуры

Процедура СоздатьСловари()

	ПолучитьСписокЯзыков();
	ПолучитьАлфавит();
	ПолучитьМассивСимволов();

	Для Каждого Язык Из СписокЯзыков Цикл
		СоздатьСловарь(Язык);
	КонецЦикла;

КонецПроцедуры

Процедура СоздатьСловарь(Знач Язык)

	ФайлыМодулей  = НайтиФайлы("./src/ru/", "*", Истина);

	СписокСлов    = Новый СписокЗначений();

	Для Каждого Модуль Из ФайлыМодулей Цикл

		Если Модуль.ЭтоКаталог() Или Не Модуль.Существует() Тогда
			Продолжить;
		КонецЕсли;

		Если СтрНайти(Модуль.ПолноеИмя, "cli\data") <> 0 Или СтрНайти(Модуль.ПолноеИмя, "cli/data") <> 0 Тогда
			Продолжить;
		КонецЕсли;
		ПолучитьМассивСловОригинала(Модуль.ПолноеИмя, СписокСлов);
	КонецЦикла;

	МассивМодулейДляПеревода = Новый Массив;
	МассивМодулейДляПеревода.Добавить(Новый Файл("./src/ru/cli/tools/Modules/Утилиты.os"));

	Для Каждого ФайлУтилит Из МассивМодулейДляПеревода Цикл
		ПолучитьМассивСловОригинала(ФайлУтилит.ПолноеИмя, СписокСлов);
	КонецЦикла;

	ПутьСловаря         = "./service/dictionaries/" + Язык + ".json";
	ФайлСловаря         = Новый Файл(ПутьСловаря);

	СоответствиеСловаря              = Новый Соответствие();
	СоответствиеСуществующегоСловаря = Новый Соответствие();

	Если ФайлСловаря.Существует() Тогда

		ЧтениеJSON = Новый ЧтениеJSON();
		ЧтениеJSON.ОткрытьФайл(ПутьСловаря);
		СоответствиеСуществующегоСловаря = ПрочитатьJSON(ЧтениеJSON, Истина);
		ЧтениеJSON.Закрыть();

	КонецЕсли;

	//СписокСлов.СортироватьПоПредставлению(НаправлениеСортировки.Убыв);

	Для Каждого Слово Из СписокСлов Цикл

		Значение = Слово.Значение;
		СоответствиеСловаря.Вставить(Значение, "");

	КонецЦикла;

	Для Каждого Существующее Из СоответствиеСуществующегоСловаря Цикл

		СоответствиеСловаря.Вставить(Существующее.Ключ, Существующее.Значение);

	КонецЦикла;

	ЗаписатьJSONСловаря(СоответствиеСловаря, ПутьСловаря);

КонецПроцедуры

Процедура ЗаписатьJSONСловаря(СоответствиеСловаря, ПутьСловаря)

	ТекстовыйДок = Новый ТекстовыйДокумент();
	ТекстовыйДок.ДобавитьСтроку("{");

	ТЗ = Новый ТаблицаЗначений();
	ТЗ.Колонки.Добавить("Ключ");
	ТЗ.Колонки.Добавить("Значение");
	ТЗ.Колонки.Добавить("ДлинаКлюча");
	ТЗ.Колонки.Добавить("Заполнено");

	Для Каждого Элемент Из СоответствиеСловаря Цикл

		НоваяСтрока = ТЗ.Добавить();
		НоваяСтрока.Ключ = Элемент.Ключ;
		НоваяСтрока.Значение = Элемент.Значение;
		НоваяСтрока.ДлинаКлюча = СтрДлина(Элемент.Ключ);
		НоваяСтрока.Заполнено = ЗначениеЗаполнено(Элемент.Значение);

	КонецЦикла;

	ТЗ.Сортировать("Заполнено УБЫВ, ДлинаКлюча");

	Для Каждого СтрокаТЗ Из ТЗ Цикл
		Значение = СтрокаТЗ.Значение;
		Значение = СтрЗаменить(Значение, "\", "\\");
		Значение = СтрЗаменить(Значение, "/", "\/");
		Значение = СтрЗаменить(Значение, """", "\""");

		Ключ = СтрокаТЗ.Ключ;
		Ключ = СтрЗаменить(Ключ, "\", "\\");
		Ключ = СтрЗаменить(Ключ, "/", "\/");
		Ключ = СтрЗаменить(Ключ, """", "\""");

		ТекстовыйДок.ДобавитьСтроку("""" + Ключ + """: """ + Значение + """,");
	КонецЦикла;

	ПоследняяСтрока = ТекстовыйДок.ПолучитьСтроку(ТекстовыйДок.КоличествоСтрок());
	ПоследняяСтрока = Лев(ПоследняяСтрока, СтрДлина(ПоследняяСтрока) - 1);
	ТекстовыйДок.ЗаменитьСтроку(ТекстовыйДок.КоличествоСтрок(), ПоследняяСтрока);

	ТекстовыйДок.ДобавитьСтроку("}");
	ТекстовыйДок.Записать(ПутьСловаря);

КонецПроцедуры

Процедура ПолучитьМассивСловОригинала(Знач ПутьКФайлу, СписокСлов)

	Документ = Новый ТекстовыйДокумент();
	Документ.Прочитать(ПутьКФайлу, "UTF-8");

	Для Н = 1 По Документ.КоличествоСтрок() Цикл

		ТекущаяСтрока = СокрЛП(Документ.ПолучитьСтроку(Н));

		Если СтрНачинаетсяС(ТекущаяСтрока, "//")
			И Не СтрНачинаетсяС(ТекущаяСтрока, "// OInt!") Тогда
			ТекущаяСтрока = СокрЛП(СтрЗаменить(ТекущаяСтрока, "//", ""));
			ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, " - ", "$");
			МассивСтроки  = СтрРазделить(ТекущаяСтрока, "$", Ложь);

			Для Г = 0 По МассивСтроки.ВГраница() Цикл
				ДобавитьСлово(СписокСлов, МассивСтроки[Г]);
			КонецЦикла;

			Продолжить;
		КонецЕсли;

		Если СтрНайти(ТекущаяСтрока, """") <> 0 
			Или СтрНайти(ТекущаяСтрока, "|") <> 0
			Или СтрНайти(ТекущаяСтрока, "<") <> 0
			Или СтрНайти(ТекущаяСтрока, ">") <> 0 Тогда

			ТекущаяСтрока = " " + ТекущаяСтрока;
			
			ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, """", "$");
			ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "|", "$");
			ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "<", "$");
			ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, ">", "$");
			ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "$$", """""");

			МассивСтроки = СтрРазделить(ТекущаяСтрока, "$", Истина);

			Цельный = Ложь;
			Для Каждого Элемент Из МассивСтроки Цикл

				Если Не ЗначениеЗаполнено(СокрЛП(Элемент)) Тогда
					Продолжить;
				КонецЕсли;

				Если Цельный Тогда
					ДобавитьСлово(СписокСлов, Элемент);
				Иначе
					РазобратьОбычнуюСтроку(Элемент, СписокСлов);
				КонецЕсли;

				Цельный = Не Цельный;
			КонецЦикла;
			
		Иначе
			РазобратьОбычнуюСтроку(ТекущаяСтрока, СписокСлов);
		КонецЕсли;
		
	КонецЦикла;

КонецПроцедуры

Процедура РазобратьОбычнуюСтроку(Элемент, СписокСлов)

	Для Каждого Символ Из МассивСимволов Цикл
		Элемент = СтрЗаменить(Элемент, Символ, "$");
	КонецЦикла;

	Пока СтрНайти(Элемент, "$$") <> 0 Цикл
		Элемент = СтрЗаменить(Элемент, "$$", "$");
	КонецЦикла;

	МассивЭлемента = СтрРазделить(Элемент, "$", Ложь);
	Для Каждого Дробный Из МассивЭлемента Цикл
		ДобавитьСлово(СписокСлов, Дробный);
	КонецЦикла;
	
КонецПроцедуры

Процедура ДобавитьСлово(Список, Слово)
	
	Слово = СокрЛП(Слово);

	Нормализовано = Ложь;
	
	Пока Не Нормализовано Цикл

		ПервыйСимвол    = Ложь;
		ПоследнийСимвол = Ложь;

		Для Каждого Символ Из МассивСимволов Цикл

			ПервыйСимвол    = СтрНачинаетсяС(Слово, Символ);
			ПоследнийСимвол = СтрЗаканчиваетсяНа(Слово, Символ);

			Если ПервыйСимвол Или ПоследнийСимвол Тогда
				Прервать;
			КонецЕсли;

		КонецЦикла;

		Если ПервыйСимвол Тогда
			Слово = Прав(Слово, СтрДлина(Слово) - 1);
		КонецЕсли;

		Если ПоследнийСимвол Тогда
			Слово = Лев(Слово, СтрДлина(Слово) - 1);
		КонецЕсли;

		Если Не ПервыйСимвол И Не ПоследнийСимвол Тогда
			Нормализовано = Истина;
		КонецЕсли;

	КонецЦикла;

	Слово = СокрЛП(Слово);

	Если Не ЗначениеЗаполнено(Слово) Или Не НайтиКириллицу(Слово) Тогда
		Возврат;
	КонецЕсли;

	СуществующееЗначение = Список.НайтиПоЗначению(Слово);

	Если СуществующееЗначение = Неопределено Тогда
		Список.Добавить(Слово, СтрДлина(Слово));
	КонецЕсли;

КонецПроцедуры

Процедура ПолучитьАлфавит()

	Алфавит = Новый Массив;
	
	Алфавит.Добавить("а");
	Алфавит.Добавить("б");
	Алфавит.Добавить("в");
	Алфавит.Добавить("г");
	Алфавит.Добавить("д");
	Алфавит.Добавить("е");
	Алфавит.Добавить("ё");
	Алфавит.Добавить("ж");
	Алфавит.Добавить("з");
	Алфавит.Добавить("и");
	Алфавит.Добавить("й");
	Алфавит.Добавить("к");
	Алфавит.Добавить("л");
	Алфавит.Добавить("м");
	Алфавит.Добавить("н");
	Алфавит.Добавить("о");
	Алфавит.Добавить("п");
	Алфавит.Добавить("р");
	Алфавит.Добавить("с");
	Алфавит.Добавить("т");
	Алфавит.Добавить("у");
	Алфавит.Добавить("ф");
	Алфавит.Добавить("х");
	Алфавит.Добавить("ц");
	Алфавит.Добавить("ч");
	Алфавит.Добавить("ш");
	Алфавит.Добавить("щ");
	Алфавит.Добавить("ъ");
	Алфавит.Добавить("ы");
	Алфавит.Добавить("ь");
	Алфавит.Добавить("э");
	Алфавит.Добавить("ю");
	Алфавит.Добавить("я");
	
КонецПроцедуры

Процедура ПолучитьМассивСимволов()

	МассивСимволов = Новый Массив();
	МассивСимволов.Добавить(";");
	МассивСимволов.Добавить(".");
	МассивСимволов.Добавить(",");
	МассивСимволов.Добавить(")");
	МассивСимволов.Добавить("(");
	МассивСимволов.Добавить("/");
	МассивСимволов.Добавить("\");
	МассивСимволов.Добавить("[");
	МассивСимволов.Добавить("]");
	МассивСимволов.Добавить("=");
	МассивСимволов.Добавить("+");
	МассивСимволов.Добавить("-");
	МассивСимволов.Добавить("*");
	МассивСимволов.Добавить("#");
	МассивСимволов.Добавить(" ");
	МассивСимволов.Добавить("""");
	
КонецПроцедуры

Функция НайтиКириллицу(Знач Слово)

	СловоНРег = НРег(Слово);

	Для Каждого Буква Из Алфавит Цикл
		Если СтрНайти(СловоНРег, Буква) <> 0 Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;

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

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

СоздатьСловари();

