Skip to content

Commit 961e52f

Browse files
authored
Merge pull request Segate-ekb#3 from Segate-ekb/feature/new_deserializer
Переписал десериализатор
2 parents 4b09245 + 305276f commit 961e52f

File tree

60 files changed

+880
-5607
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+880
-5607
lines changed

src/internal/Модули/Десериализатор.os

Lines changed: 809 additions & 0 deletions
Large diffs are not rendered by default.

src/internal/Модули/МенеджерЯкорей.os

Lines changed: 57 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
// Значение - Произвольный - значение для сохранения
2020
//
2121
Процедура СохранитьЯкорь(ИмяЯкоря, Значение) Экспорт
22-
Если НЕ ПустаяСтрока(ИмяЯкоря) Тогда
23-
Якоря.Вставить(ИмяЯкоря, Значение);
24-
КонецЕсли;
22+
Якоря.Вставить(ИмяЯкоря, Значение);
2523
КонецПроцедуры
2624

2725
// Получение значения по якорю
@@ -30,99 +28,88 @@
3028
// ИмяЯкоря - Строка - имя якоря
3129
//
3230
// Возвращаемое значение:
33-
// Произвольный - значение якоря или Неопределено
31+
// Произвольный - значение якоря или Неопределено, если якорь не найден
3432
//
3533
Функция ПолучитьЗначениеЯкоря(ИмяЯкоря) Экспорт
3634
Возврат Якоря.Получить(ИмяЯкоря);
3735
КонецФункции
3836

39-
// Преобразует алиас (*anchor) в соответствующее значение
37+
// Проверка существования якоря
4038
//
4139
// Параметры:
42-
// ЗначениеСтрока - Строка - строка с алиасом
40+
// ИмяЯкоря - Строка - имя якоря
4341
//
4442
// Возвращаемое значение:
45-
// Произвольный - значение из якоря или Неопределено
43+
// Булево - Истина, если якорь существует
4644
//
47-
Функция ПреобразоватьАлиас(ЗначениеСтрока) Экспорт
48-
ИмяЯкоря = Сред(ЗначениеСтрока, 2);
49-
ЗначениеЯкоря = Якоря.Получить(ИмяЯкоря);
50-
Если ЗначениеЯкоря <> Неопределено Тогда
51-
Возврат ЗначениеЯкоря;
52-
Иначе
53-
Возврат Неопределено;
54-
КонецЕсли;
45+
Функция ЯкорьСуществует(ИмяЯкоря) Экспорт
46+
Возврат НЕ Якоря.Получить(ИмяЯкоря) = Неопределено;
5547
КонецФункции
5648

57-
// Обработка якоря и алиаса в значении
49+
// Извлечение имени якоря из строки (для &anchor)
5850
//
5951
// Параметры:
60-
// ЗначениеСтрока - Строка - строка со значением
61-
// Ключ - Строка - ключ
62-
// ТекущийКонтекст - Соответствие - текущий контекст
52+
// Строка - Строка - строка с определением якоря
6353
//
6454
// Возвращаемое значение:
65-
// Структура - результат обработки с полями: Якорь, ЗначениеСтрока, АлиасОбработан
55+
// Строка - имя якоря или пустая строка, если якорь не найден
6656
//
67-
Функция ОбработатьЯкорьИАлиас(ЗначениеСтрока, Ключ, ТекущийКонтекст) Экспорт
68-
Результат = Новый Структура("Якорь, ЗначениеСтрока, АлиасОбработан", "", ЗначениеСтрока, Ложь);
57+
Функция ИзвлечьИмяЯкоряИлиАлиаса(Строка) Экспорт
6958

70-
// Обработка якоря: key: &anchor value (только если есть значение после якоря)
71-
Если Лев(ЗначениеСтрока, 1) = "&" Тогда
72-
Пробел = Найти(ЗначениеСтрока, " ");
73-
Если Пробел > 0 Тогда
74-
Результат.Якорь = Сред(ЗначениеСтрока, 2, Пробел - 2);
75-
Результат.ЗначениеСтрока = СокрЛП(Сред(ЗначениеСтрока, Пробел + 1));
76-
Иначе
77-
// Якорь без значения (для структур)
78-
Результат.Якорь = Сред(ЗначениеСтрока, 2);
79-
Результат.ЗначениеСтрока = "";
59+
Строка = СокрЛП(Строка);
60+
Позиция = 1;
61+
Попытка
62+
Если не Лев(Строка, 1) = "&" И Не Лев(Строка, 1) = "*" Тогда
63+
Возврат "";
8064
КонецЕсли;
81-
КонецЕсли;
8265

83-
// Обработка алиаса: key: *anchor
84-
Если Лев(ЗначениеСтрока, 1) = "*" Тогда
85-
ИмяЯкоря = Сред(ЗначениеСтрока, 2);
86-
ЗначениеЯкоря = Якоря.Получить(ИмяЯкоря);
87-
Если ЗначениеЯкоря <> Неопределено Тогда
88-
ТекущийКонтекст.Вставить(Ключ, ЗначениеЯкоря);
89-
КонецЕсли;
90-
Результат.АлиасОбработан = Истина;
91-
КонецЕсли;
66+
// Извлекаем имя якоря (до пробела или до конца строки)
67+
НачалоИмени = Позиция + 1;
68+
КонецИмени = СтрДлина(Строка);
69+
70+
Для Позиция = НачалоИмени По КонецИмени Цикл
71+
Символ = Сред(Строка, Позиция, 1);
72+
Если Символ = " " ИЛИ Символ = Символы.Таб Тогда
73+
КонецИмени = Позиция - 1;
74+
Прервать;
75+
КонецЕсли;
76+
КонецЦикла;
77+
78+
Возврат Сред(Строка, НачалоИмени, КонецИмени - НачалоИмени + 1);
79+
Исключение
80+
Возврат "";
81+
// Если произошла ошибка, возвращаем пустую строку
82+
КонецПопытки;
9283

93-
Возврат Результат;
9484
КонецФункции
9585

96-
// Проверка, является ли ключ только определением якоря
86+
// Удаление определения якоря из строки
9787
//
9888
// Параметры:
99-
// Ключ - Строка - ключ для проверки
89+
// Строка - Строка - строка с определением якоря
10090
//
10191
// Возвращаемое значение:
102-
// Булево - Истина, если ключ используется только для якоря
103-
//
104-
Функция ЭтоТолькоОпределениеЯкоря(Ключ) Экспорт
105-
// Список ключей, которые используются только для определения якорей
106-
// и не должны попадать в итоговый результат
107-
КлючиДляИсключения = СтрРазделить("shared_value,default_db,app_config,service_name,default_timeout", ",");
108-
Возврат КлючиДляИсключения.Найти(Ключ) <> Неопределено;
109-
КонецФункции
110-
111-
// Установка значения с учетом якоря
92+
// Строка - строка без определения якоря
11293
//
113-
// Параметры:
114-
// Ключ - Строка - ключ
115-
// Якорь - Строка - якорь (если есть)
116-
// Значение - Произвольный - значение для установки
117-
// ТекущийКонтекст - Соответствие - текущий контекст
118-
//
119-
Процедура УстановитьЗначениеСЯкорем(Ключ, Якорь, Значение, ТекущийКонтекст) Экспорт
120-
Если Якорь <> "" Тогда
121-
СохранитьЯкорь(Якорь, Значение);
122-
Если НЕ ЭтоТолькоОпределениеЯкоря(Ключ) Тогда
123-
ТекущийКонтекст.Вставить(Ключ, Значение);
124-
КонецЕсли;
125-
Иначе
126-
ТекущийКонтекст.Вставить(Ключ, Значение);
94+
Функция УдалитьОпределениеЯкоря(Строка) Экспорт
95+
ПозицияЯкоря = СтрНайти(Строка, "&");
96+
Если ПозицияЯкоря = 0 Тогда
97+
Возврат Строка;
12798
КонецЕсли;
128-
КонецПроцедуры
99+
100+
// Находим конец имени якоря
101+
КонецИмени = СтрДлина(Строка);
102+
Для Позиция = ПозицияЯкоря + 1 По СтрДлина(Строка) Цикл
103+
Символ = Сред(Строка, Позиция, 1);
104+
Если Символ = " " ИЛИ Символ = Символы.Таб ИЛИ Символ = ":" Тогда
105+
КонецИмени = Позиция - 1;
106+
Прервать;
107+
КонецЕсли;
108+
КонецЦикла;
109+
110+
// Удаляем определение якоря из строки
111+
ЧастьДо = Лев(Строка, ПозицияЯкоря - 1);
112+
ЧастьПосле = Сред(Строка, КонецИмени + 1);
113+
114+
Возврат СокрЛП(ЧастьДо + ЧастьПосле);
115+
КонецФункции

src/internal/Модули/ПарсерКлючЗначение.os

Lines changed: 0 additions & 165 deletions
This file was deleted.

0 commit comments

Comments
 (0)