То, что вы хотите сделать, это преобразование .Результирующий YAML такой операции семантически не будет эквивалентен исходному YAML.Возьмем, к примеру, этот небольшой YAML:
[foo, foo]
Этот YAML представляет следующий график документа:
+----------------------+
| Sequence (root node) |
+--|----------------|--+
| |
+--v--+ +--v--+
| foo | | foo |
+-----+ +-----+
При использовании MinifyYamlWithReferences
это будет выглядеть примерно так:
[&a foo, *a]
Который представляет следующий график документа:
+----------------------+
| Sequence (root node) |
+--|----------------|--+
| |
+--v--+ |
| foo |<------------+
+-----+
Итак, вы создали семантически другой документ YAML!Называть это минификация было бы неверным, поскольку минификация обычно рассматривается как процесс преобразования источника в меньший, но семантически эквивалентный источник.Что вам нужно, так это дедупликация (вместе с минификацией), которая является семантической трансформацией.
Я не знаю ни о каких существующих реализациях для этого.Реализация этого также будет непростой задачей, так как вам нужно ответить на сложные вопросы, такие как:
- Какие из
!!str a
, "a"
, 'a'
и a
эквивалентны? - Являются ли эти два эквивалента:
&a [ *a ]
, [*a]
?
(Пояснение: В 1. у нас есть два цитируемых скаляра, которые оба оценивают скалярный узел с тегом !
. !
для скаляров разрешается до !!str
с использованием базовой схемы YAML. a
- это скаляр, который не соответствует регулярному выражению для чего-то более конкретного, чем строка, поэтому он также получит !!str
в соответствии с базовой схемой.Вы уверены, что используется базовая схема? В 2. у нас есть последовательность с прямым циклом, и последовательность, которая просто связывается с этим циклом, но (теоретическое) сравнение с помощью бесконечной рекурсии скажет, что эти два значения равны.они?)
Я не вижу варианта использования для такого преобразования.Если ваша цель состоит в том, чтобы минимизировать данные, передаваемые по сети, я бы предложил вместо этого использовать алгоритм сжатия на исходном YAML - который намного проще (уже существует, внутренне также выполняет дедупликацию в потоке символов, но обратим).