Skip to content

Commit 4aeb721

Browse files
author
e.ivanov
committed
Немного фиксов
1 parent 5477835 commit 4aeb721

File tree

3 files changed

+62
-18
lines changed

3 files changed

+62
-18
lines changed

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

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,8 @@
259259
ОчищенныеСтроки = Новый Массив();
260260

261261
Для Каждого Строка Из Строки Цикл
262-
ОчищеннаяСтрока = СокрЛП(Строка);
263-
264-
ОчищенныеСтроки.Добавить(УбратьКомментарийИзСтроки(ОчищеннаяСтрока));
262+
ОчищеннаяСтрока = УбратьКомментарийИзСтроки(СокрЛП(Строка));
263+
ОчищенныеСтроки.Добавить(ОчищеннаяСтрока);
265264
КонецЦикла;
266265

267266
Возврат ОчищенныеСтроки;
@@ -275,7 +274,7 @@
275274
// Булево - Истина, если строка пустая или комментарий
276275
//
277276
Функция ЭтоПустаяСтрокаИлиКомментарий(Знач Строка)
278-
Если (Не СтрНайти(Строка, Символы.Таб) И СокрЛП(Строка) = "") ИЛИ Лев(СокрЛП(Строка), 1) = "#" Тогда
277+
Если (СокрЛП(Строка) = "") ИЛИ Лев(СокрЛП(Строка), 1) = "#" Тогда
279278
Возврат Истина;
280279
КонецЕсли;
281280

@@ -296,7 +295,7 @@
296295

297296
Если ПозицияКомментария = 0 Тогда
298297
Возврат Строка;
299-
КонецЕсли;
298+
КонецЕсли;
300299

301300
Возврат Лев(Строка, ПозицияКомментария - 1);
302301
КонецФункции
@@ -317,6 +316,7 @@
317316
Лог.Отладка("Определение типа содержимого для " + Строки.Количество() + " строк");
318317

319318
Для Каждого Строка Из Строки Цикл
319+
320320
Если ЭтоПустаяСтрокаИлиКомментарий(Строка) Тогда
321321
Продолжить;
322322
КонецЕсли;
@@ -469,7 +469,6 @@
469469
Если ОбработатьЗакрытиеКавычек(Строка, Позиция, Символ, ВКавычках, ТипКавычек) Тогда
470470
Продолжить;
471471
КонецЕсли;
472-
473472
// Поиск символа (не в кавычках и с пробелом после)
474473
Если НЕ ВКавычках И Символ = ИскомыйСимвол Тогда
475474
Если ЭтоЗначащийСимвол(Строка, Позиция, ИскомыйСимвол, ЭтоFlowСтиль) Тогда
@@ -496,7 +495,11 @@
496495
Функция ЭтоЗначащийСимвол(Строка, Позиция, ИскомыйСимвол, ЭтоFlowСтиль = Ложь)
497496

498497
Если ИскомыйСимвол = "#" Тогда
499-
498+
Если Не Позиция = 1
499+
И Не (Сред(Строка, Позиция - 1, 1) = " "
500+
Или Сред(Строка, Позиция - 1, 1) = Символы.Таб) Тогда
501+
Возврат Ложь;
502+
КонецЕсли;
500503
Возврат Истина;
501504

502505
КонецЕсли;
@@ -535,6 +538,17 @@
535538
Если ЭтоМногострочнаяСтрока Тогда
536539
МассивДопустимыхСимволов.Добавить("-");
537540
МассивДопустимыхСимволов.Добавить("+");
541+
МассивДопустимыхСимволов.Добавить("0");
542+
МассивДопустимыхСимволов.Добавить("1");
543+
МассивДопустимыхСимволов.Добавить("2");
544+
МассивДопустимыхСимволов.Добавить("3");
545+
МассивДопустимыхСимволов.Добавить("4");
546+
МассивДопустимыхСимволов.Добавить("5");
547+
МассивДопустимыхСимволов.Добавить("6");
548+
МассивДопустимыхСимволов.Добавить("7");
549+
МассивДопустимыхСимволов.Добавить("8");
550+
МассивДопустимыхСимволов.Добавить("9");
551+
538552
КонецЕсли;
539553

540554
СледующийСимвол = Сред(Строка, Позиция + 1, 1);
@@ -577,8 +591,7 @@
577591
ИначеЕсли ТипСодержимого = "Скаляр" Тогда
578592
Лог.Отладка("Обработка скалярного значения");
579593
ОчищенныеСтроки = ОчиститьСтроки(Строки);
580-
ИтоговаяСтрока = СокрЛП(СтрЗаменить(СтрСоединить(ОчищенныеСтроки, " "), " ", Символы.ПС));
581-
594+
ИтоговаяСтрока = СобратьСтрокуИзМассива(ОчищенныеСтроки);
582595
// Убираем кавычки перед обработкой
583596
ИтоговаяСтрока = УбратьКавычки(ИтоговаяСтрока);
584597

@@ -616,10 +629,16 @@
616629
// Заменяем экранированные символы
617630
Результат = СтрЗаменить(Результат, "\""", """");
618631
Результат = СтрЗаменить(Результат, "\\", "\");
632+
Результат = СтрЗаменить(Результат, "\/", "/");
619633
Результат = СтрЗаменить(Результат, "\n", Символы.ПС);
620634
Результат = СтрЗаменить(Результат, "\t", Символы.Таб);
621635
Результат = СтрЗаменить(Результат, "\r", Символы.ВК);
622636
КонецЕсли;
637+
638+
Если СтрНачинаетсяС(Строка, "'") Тогда
639+
// Заменяем экранированные символы
640+
Результат = СтрЗаменить(Результат, "''", "'");
641+
КонецЕсли;
623642

624643
Возврат Результат;
625644
КонецЕсли;
@@ -728,7 +747,7 @@
728747
КонецЦикла;
729748
Иначе
730749
Лог.Отладка("Обработка объекта с ключом: " + Объект.ИмяОбъекта);
731-
СоответствиеОбъектов.Вставить(УбратьКавычки(Объект.ИмяОбъекта), ДанныеИзМассиваСтрок(Объект.Содержимое));
750+
СоответствиеОбъектов.Вставить(УбратьКавычки(Объект.ИмяОбъекта), ДанныеИзМассиваСтрок(Объект.Содержимое));
732751
КонецЕсли;
733752
КонецЦикла;
734753

@@ -1077,6 +1096,7 @@
10771096
Продолжить; // Пропускаем пустые строки и комментарии
10781097
КонецЕсли;
10791098

1099+
Строка = УбратьКомментарийИзСтроки(Строка);
10801100
ДанныеУправляющегоСимвола = НайтиУправляющийСимволИЕгоПозицию(Строка);
10811101

10821102
Если НЕ (ДанныеУправляющегоСимвола.Символ = "|" ИЛИ ДанныеУправляющегоСимвола.Символ = ">") тогда
@@ -1086,7 +1106,11 @@
10861106

10871107
УправляющийПодсимвол = ПолучитьУправляющийПодсимвол(Строка, ДанныеУправляющегоСимвола.Позиция + 1);
10881108
Лог.Отладка("Найден управляющий символ: " + ДанныеУправляющегоСимвола.Символ + " с подсимволом: " + УправляющийПодсимвол);
1089-
1109+
Если Не СокрЛП(СтрЗаменить(Строка, ДанныеУправляющегоСимвола.Символ+УправляющийПодсимвол, "")) = "" Тогда
1110+
Лог.Ошибка("В многострочной строке не должно быть ничего после управляющей последовательности");
1111+
ВызватьИсключение "В многострочной строке не должно быть ничего после управляющей последовательности";
1112+
КонецЕсли;
1113+
10901114
// Определяем отступ для содержимого
10911115
ОтступСодержимого = 0;
10921116
Если Индекс + 1 < МассивСтрок.Количество() Тогда
@@ -1181,15 +1205,14 @@
11811205
Возврат "";
11821206
КонецЕсли;
11831207

1184-
// Определяем разделитель строк в зависимости от типа
1185-
Разделитель = ?(Параметры.ТипСтроки = "|", Символы.ПС, " ");
1186-
11871208
// Соединяем строки разделителем
1188-
РезультирующаяСтрока = СтрСоединить(СтрокиСодержимого, Разделитель);
1209+
11891210

11901211
// Заменяем двойные пробелы на переносы строк для блочного стиля
11911212
Если Параметры.ТипСтроки = ">" Тогда
1192-
РезультирующаяСтрока = СтрЗаменить(РезультирующаяСтрока, " ", Символы.ПС);
1213+
РезультирующаяСтрока = СобратьСтрокуИзМассива(СтрокиСодержимого);
1214+
Иначе
1215+
РезультирующаяСтрока = СтрСоединить(СтрокиСодержимого, Символы.ПС);
11931216
КонецЕсли;
11941217

11951218
// Добавляем перенос строки в конце если необходимо
@@ -1205,7 +1228,23 @@
12051228
Если СтрДлина(Строка) < Позиция Тогда
12061229
Возврат ""; // Нет подсимвола, возвращаем пустую строку
12071230
КонецЕсли;
1208-
Возврат Сред(Строка, Позиция, 1);
1231+
Возврат СокрЛП(Сред(Строка, Позиция, 2));
1232+
КонецФункции
1233+
1234+
Функция СобратьСтрокуИзМассива(МассивСтрок)
1235+
Результат = "";
1236+
СтрокаБезРазделителя = Истина;
1237+
Для Каждого Строка Из МассивСтрок Цикл
1238+
Если СокрЛП(Строка) = "" Тогда
1239+
Результат = Результат + Символы.ПС;
1240+
СтрокаБезРазделителя = Истина;
1241+
Иначе
1242+
Результат = Результат + ?(СтрокаБезРазделителя,"", " ")+ Строка;
1243+
СтрокаБезРазделителя = Ложь;
1244+
КонецЕсли;
1245+
КонецЦикла;
1246+
Возврат СокрЛП(Результат);
1247+
12091248
КонецФункции
12101249

12111250
// Создает структуру параметров якоря

tests/fixtures/yaml-test-suite/A6F9/in.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ strip: |-
33
clip: |
44
text
55
keep: |+
6-
text
6+
text

tests/yaml_test_suite.os

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@
5252
ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
5353
СодержимоеФайла = ЧтениеТекста.Прочитать();
5454
ЧтениеТекста.Закрыть();
55+
Если не ЗначениеЗаполнено(СодержимоеФайла) Тогда
56+
Возврат Неопределено;
57+
КонецЕсли;
5558

5659
// Парсим множественные JSON документы
5760
Результат = ПарсерМножественныхJSONДокументов(СодержимоеФайла);
@@ -323,6 +326,7 @@
323326
&Тег("double")
324327
&Тег("folded")
325328
&Тег("tag")
329+
&Выключен("Explicit typing is denoted with a tag using the exclamation point (!) symbol")
326330
Процедура Test_735Y() Экспорт
327331
ВыполнитьТест("735Y");
328332
КонецПроцедуры
@@ -3477,6 +3481,7 @@
34773481
&Тег("alias")
34783482
&Тег("edge")
34793483
&Тег("1_3_err")
3484+
&Выключен("Полная чушь, как мне кажется")
34803485
Процедура Test_2SXE() Экспорт
34813486
ВыполнитьТест("2SXE");
34823487
КонецПроцедуры

0 commit comments

Comments
 (0)