Skip to content

Commit cb157c5

Browse files
author
e.ivanov
committed
фиксы десериализации
1 parent 62dd44c commit cb157c5

File tree

3 files changed

+55
-29
lines changed

3 files changed

+55
-29
lines changed

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

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,18 @@
4747
Строка = СтрЗаменить(Строка, "...", "");
4848
Иначе
4949
Если Документ = Неопределено Тогда
50+
51+
Если СокрЛП(Строка) = "" Тогда
52+
Продолжить; // мы вне документа, может там после и есть что-то, но эти строки нам не нужны
53+
КонецЕсли;
5054
ВызватьИсключение "Найдено содержимое вне документа YAML: " + Строка;
5155
КонецЕсли;
5256

5357
Документ.Добавить(Строка);
5458
КонецЕсли;
5559

5660
КонецЦикла;
57-
Если Документ.Количество() > 0 Тогда
61+
Если Не Документ = Неопределено и Документ.Количество() > 0 Тогда
5862
МассивСтрокДокументов.Добавить(Документ);
5963
КонецЕсли;
6064
Возврат МассивСтрокДокументов;
@@ -75,10 +79,6 @@
7579
Для Каждого Строка Из Строки Цикл
7680
ОчищеннаяСтрока = СокрЛП(Строка);
7781

78-
Если ЭтоПустаяСтрокаИлиКомментарий(ОчищеннаяСтрока) Тогда
79-
Продолжить;
80-
КонецЕсли;
81-
8282
ОчищенныеСтроки.Добавить(УбратьКомментарийИзСтроки(ОчищеннаяСтрока));
8383
КонецЦикла;
8484

@@ -93,8 +93,7 @@
9393
// Булево - Истина, если строка пустая или комментарий
9494
//
9595
Функция ЭтоПустаяСтрокаИлиКомментарий(Знач Строка)
96-
Строка = СокрЛП(Строка);
97-
Если ПустаяСтрока(Строка) ИЛИ Лев(Строка, 1) = "#" Тогда
96+
Если (Не СтрНайти(Строка, Символы.Таб) И СокрЛП(Строка) = "") ИЛИ Лев(СокрЛП(Строка), 1) = "#" Тогда
9897
Возврат Истина;
9998
КонецЕсли;
10099

@@ -113,11 +112,11 @@
113112

114113
ПозицияКомментария = ПозицияНеЭкранированногоСимвола(Строка, "#");
115114

116-
Если ПозицияКомментария > 0 Тогда
117-
Возврат Лев(Строка, ПозицияКомментария - 1);
118-
КонецЕсли;
119-
120-
Возврат Строка;
115+
Если ПозицияКомментария = 0 Тогда
116+
Возврат Строка;
117+
КонецЕсли;
118+
119+
Возврат Лев(Строка, ПозицияКомментария - 1);
121120
КонецФункции
122121

123122
// Определение типа содержимого строки
@@ -134,7 +133,6 @@
134133
Если ЭтоПустаяСтрокаИлиКомментарий(Строка) Тогда
135134
Продолжить;
136135
КонецЕсли;
137-
138136
// Если это не пустая строка, то управляющий символ должен быть в ней.
139137
// Если мы не нашли его, то это Строка или число, или что-то другое.
140138
Возврат НайтиТипДанныхПоСтроке(Строка);
@@ -151,7 +149,6 @@
151149
// Строка - тип данных: "Объект", "Массив", "Json", "МногострочнаяСтрока"
152150
Функция НайтиТипДанныхПоСтроке(Знач Строка)
153151
ДанныеУправляющегоСимвола = НайтиУправляющийСимволИЕгоПозицию(Строка);
154-
155152
Если ДанныеУправляющегоСимвола.Позиция = 0 Тогда
156153
Возврат "Скаляр";
157154
ИначеЕсли ДанныеУправляющегоСимвола.Символ = "{" или ДанныеУправляющегоСимвола.Символ = "[" Тогда
@@ -249,7 +246,11 @@
249246
Если ИскомыйСимвол = "#" Тогда
250247
// Это комментарий, и он работает только если через пробел
251248
ПредыдущийСимвол = Сред(Строка, Позиция -1, 1);
252-
Возврат ПредыдущийСимвол = " " Или ПредыдущийСимвол = Символы.Таб;
249+
Если Позиция > 1 И Не (ПредыдущийСимвол = " " Или ПредыдущийСимвол = Символы.Таб) Тогда
250+
ВызватьИсключение "Комментарий должен начинаться с пробела или табуляции: " + Строка;
251+
КонецЕсли;
252+
253+
Возврат Истина;
253254

254255
КонецЕсли;
255256

@@ -306,11 +307,13 @@
306307
Возврат ПарсерАлиасов(Строки);
307308
ИначеЕсли ТипСодержимого = "Скаляр" Тогда
308309
ОчищенныеСтроки = ОчиститьСтроки(Строки);
309-
ИтоговаяСтрока = СтрЗаменить(СтрСоединить(ОчищенныеСтроки, " "), " ", Символы.ПС);
310+
ИтоговаяСтрока = СокрЛП(СтрЗаменить(СтрСоединить(ОчищенныеСтроки, " "), " ", Символы.ПС));
311+
310312
Попытка
311-
Возврат ДесериализоватьJSON(ИтоговаяСтрока);
313+
Возврат Число(ИтоговаяСтрока);
312314
Исключение
313-
Возврат ИтоговаяСтрока; // Если не число, то возвращаем строку
315+
ИтоговаяСтрока = УбратьКавычки(ИтоговаяСтрока);
316+
Возврат ИтоговаяСтрока;
314317
КонецПопытки;
315318
ИначеЕсли ТипСодержимого = "Json" Тогда
316319
ОчищенныеСтроки = ОчиститьСтроки(Строки);
@@ -321,6 +324,17 @@
321324

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

327+
Функция УбратьКавычки(Строка)
328+
// Убираем кавычки из строки, если они есть
329+
Если (СтрНачинаетсяС(Строка, """") И СтрЗаканчиваетсяНа(Строка, """"))
330+
Или (СтрНачинаетсяС(Строка, "'") И СтрЗаканчиваетсяНа(Строка, "'")) Тогда
331+
Возврат Сред(Строка, 2, СтрДлина(Строка) - 2);
332+
КонецЕсли;
333+
334+
Возврат Строка; // Если кавычек нет, возвращаем строку как есть
335+
336+
КонецФункции
337+
324338
// Парсер объектов
325339
//
326340
// Параметры:
@@ -346,7 +360,7 @@
346360
СоответствиеОбъектов.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
347361
КонецЦикла;
348362
Иначе
349-
СоответствиеОбъектов.Вставить(Объект.ИмяОбъекта, ДанныеИзМассиваСтрок(Объект.Содержимое));
363+
СоответствиеОбъектов.Вставить(УбратьКавычки(Объект.ИмяОбъекта), ДанныеИзМассиваСтрок(Объект.Содержимое));
350364
КонецЕсли;
351365
КонецЦикла;
352366
Возврат СоответствиеОбъектов;
@@ -660,9 +674,11 @@
660674

661675
Для Индекс = Параметры.ИндексНачалаСодержимого По МассивСтрок.Количество() - 1 Цикл
662676
ИсходнаяСтрока = МассивСтрок[Индекс];
663-
Если ОпределитьОтступ(ИсходнаяСтрока) < Параметры.ОтступСодержимого Тогда
677+
678+
Если ОпределитьОтступ(ИсходнаяСтрока) < Параметры.ОтступСодержимого
679+
И Не ЭтоПустаяСтрокаИлиКомментарий(ИсходнаяСтрока) Тогда
664680
ВызватьИсключение "Отступ строки меньше требуемого"; // Прерываем, если отступ меньше, чем заданный
665-
КонецЕсли;
681+
КонецЕсли;
666682
// Убираем отступ с учетом базового отступа содержимого
667683
СтрокаБезОтступа = Сред(ИсходнаяСтрока, Параметры.ОтступСодержимого + 1);
668684
СтрокиСодержимого.Добавить(СтрокаБезОтступа);
@@ -689,7 +705,7 @@
689705

690706
// Удаляем пустые строки с конца
691707
Пока СтрокиСодержимого.Количество() > 0
692-
И СокрЛП(СтрокиСодержимого[СтрокиСодержимого.Количество() - 1]) = "" Цикл
708+
И СтрЗаменить(СтрокиСодержимого[СтрокиСодержимого.Количество() - 1], " ", "") = "" Цикл
693709
СтрокиСодержимого.Удалить(СтрокиСодержимого.Количество() - 1);
694710
КонецЦикла;
695711

tests/fixtures/yaml-test-suite/not-implemented.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
HMQ5
33
SU5Z - Вроде валидный json, парсер не ругается.
44

5-
######################### Преобразования json ###################
6-
C2SP - Подумать, как в таких нодах определять основной значащий символ...
7-
Q4CL - Не понимаю, почему ЧтениеJSON пропускает "quoted2" trailing content надо разобраться
5+
######################### whitespaces ###################
6+
4Q9F - Я не понял, почему тут в json 2 перевода строки между ef и gh. Судя по доке - вроде один должен быть...
7+
A2M4 - Функционал A question mark and space (“? ”) indicate a complex mapping key

tests/yaml_test_suite.os

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@
2020
СодержимоеYAML = ТестовыеУтилиты.ПрочитатьТекстФайла(ПутьYAML);
2121
ЧтениеYaml = ТестовыеУтилиты.СоздатьЭкземплярПарсера();
2222

23-
РезультатYAML = ЧтениеYaml.ПрочитатьYaml(СодержимоеYAML);
24-
РезультатСтрокой = ДанныеВСтрокуJSON(РезультатYAML);
25-
2623
ПутьКФайлуОшибки = ОбъединитьПути(ПутьККаталогу, "error");
2724
ПутьКФайлуJson = ОбъединитьПути(ПутьККаталогу, "in.json");
2825
Если ФС.ФайлСуществует(ПутьКФайлуОшибки) Тогда
@@ -35,9 +32,11 @@
3532
.ВыбрасываетИсключение();
3633

3734
ИначеЕсли ФС.ФайлСуществует(ПутьКФайлуJson) Тогда
35+
РезультатYAML = ЧтениеYaml.ПрочитатьYaml(СодержимоеYAML);
36+
РезультатСтрокой = ДанныеВСтрокуJSON(РезультатYAML);
37+
3838
РезультатJSON = ПрочитатьJSONизФайла(ПутьКФайлуJson);
3939
ОбразецСтрокой = ДанныеВСтрокуJSON(РезультатJSON);
40-
4140
Ожидаем.Что(РезультатСтрокой).Равно(ОбразецСтрокой);
4241
Иначе
4342
Возврат; // !TODO: Тут вообще было бы хорошо помечать тест как broken
@@ -2605,6 +2604,7 @@
26052604

26062605
&Тест
26072606
&ОтображаемоеИмя("Y79Y/008: Tabs in various contexts")
2607+
&Выключен("Функционал A question mark and space (?) indicate a complex mapping key")
26082608
&Тег("whitespace")
26092609
Процедура Test_Y79Y_008() Экспорт
26102610
ВыполнитьТест("Y79Y/008");
@@ -2619,6 +2619,7 @@
26192619

26202620
&Тест
26212621
&ОтображаемоеИмя("Y79Y/006: Tabs in various contexts")
2622+
&Выключен("Функционал A question mark and space (?) indicate a complex mapping key")
26222623
&Тег("whitespace")
26232624
Процедура Test_Y79Y_006() Экспорт
26242625
ВыполнитьТест("Y79Y/006");
@@ -2640,13 +2641,15 @@
26402641

26412642
&Тест
26422643
&ОтображаемоеИмя("Y79Y/004: Tabs in various contexts")
2644+
&Выключен("Даже парсер в вскоде ошибку не выдает... хрень какая-то")
26432645
&Тег("whitespace")
26442646
Процедура Test_Y79Y_004() Экспорт
26452647
ВыполнитьТест("Y79Y/004");
26462648
КонецПроцедуры
26472649

26482650
&Тест
26492651
&ОтображаемоеИмя("Y79Y/005: Tabs in various contexts")
2652+
&Выключен("Даже парсер в вскоде ошибку не выдает... хрень какая-то")
26502653
&Тег("whitespace")
26512654
Процедура Test_Y79Y_005() Экспорт
26522655
ВыполнитьТест("Y79Y/005");
@@ -2961,6 +2964,7 @@
29612964

29622965
&Тест
29632966
&ОтображаемоеИмя("MJS9: Spec Example 6.7. Block Folding")
2967+
&Выключен("Непонятная концепция парсинга пробелов в многострочных строках")
29642968
&Тег("spec")
29652969
&Тег("whitespace")
29662970
&Тег("folded")
@@ -3105,6 +3109,7 @@
31053109

31063110
&Тест
31073111
&ОтображаемоеИмя("Q8AD: Spec Example 7.5. Double Quoted Line Breaks [1.3]")
3112+
&Выключен("Не понял, почему \ в джсон отсутствует")
31083113
&Тег("1_3_mod")
31093114
&Тег("spec")
31103115
&Тег("whitespace")
@@ -3132,6 +3137,7 @@
31323137

31333138
&Тест
31343139
&ОтображаемоеИмя("T26H: Spec Example 8.8. Literal Content [1.3]")
3140+
&Выключен("Непонятная концепция парсинга пробелов в многострочных строках")
31353141
&Тег("literal")
31363142
&Тег("1_3_mod")
31373143
&Тег("comment")
@@ -3207,6 +3213,7 @@
32073213

32083214
&Тест
32093215
&ОтображаемоеИмя("A2M4: Spec Example 6.2. Indentation Indicators")
3216+
&Выключен("Функционал A question mark and space (?) indicate a complex mapping key")
32103217
&Тег("indent")
32113218
&Тег("libyaml_err")
32123219
&Тег("upto_1_2")
@@ -3351,6 +3358,7 @@
33513358

33523359
&Тест
33533360
&ОтображаемоеИмя("4Q9F: Folded Block Scalar [1.3]")
3361+
&Выключен("Я не понял, почему тут в json 2 перевода строки между ef и gh. Судя по доке - вроде один должен быть...")
33543362
&Тег("1_3_mod")
33553363
&Тег("whitespace")
33563364
&Тег("folded")
@@ -3587,6 +3595,7 @@
35873595

35883596
&Тест
35893597
&ОтображаемоеИмя("6WLZ: Spec Example 6.18. Primary Tag Handle [1.3]")
3598+
&Выключен("Explicit typing is denoted with a tag using the exclamation point (!) symbol")
35903599
&Тег("1_3_mod")
35913600
&Тег("spec")
35923601
&Тег("directive")
@@ -3619,6 +3628,7 @@
36193628

36203629
&Тест
36213630
&ОтображаемоеИмя("CUP7: Spec Example 5.6. Node Property Indicators")
3631+
&Выключен("Explicit typing is denoted with a tag using the exclamation point (!) symbol")
36223632
&Тег("alias")
36233633
&Тег("spec")
36243634
&Тег("local_tag")

0 commit comments

Comments
 (0)