是否存在使用引用插入实现YAML缩小的现有工具,库或算法?如果已经存在解决此问题的常见解决方案,我不想重新发明轮子。
我在这个上下文中构成了术语引用插入,所以我想要的行为可能有不同的名称。让我通过引用插入来解释我的意思:
基本的YAML缩小算法没有引用插入,MinifyYamlBasic
,将与JSON缩小同构,但会用最简洁的等效YAML节点语法替换任何JSON原语。我在https://onlineyamltools.com/minify-yaml找到了MinifyYamlBasic
实施的在线示例。
带参考插入的YAML缩小算法 ,MinifyYamlWithReferences
将完成MinifyYamlBasic
所做的所有事情,但会为多次出现的任何YAML节点生成锚点并使用对生成的锚点的引用替换重复的YAML节点,按YAML节点文本长度的降序排列。
这是我正在寻求的行为的基本理念,尽管显然还有其他因素需要考虑。小于其别名的重复节点可能不应该被引用替换。输入文档需要进行规范化,以便通过语法比较来识别语义上等效的节点,这至少包括:标量形式的标量替换;映射节点密钥的规范排序;取消引用和删除先前存在的锚。
我可能尚未考虑过更多内容。在我花时间进一步考虑之前,
是否有任何可用资源提供MinifyYamlWithReferences
的现有实施(或类似的东西)?
算法(或算法类别)是否有一个常用的名称,我称之为“带参考插入的缩小”?
答案 0 :(得分:2)
您要做的是转换。这种操作的结果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.中,我们有两个引用的标量,它们都评估为带有!
标记的标量节点。标量上的!
使用YAML核心模式解析为!!str
。a
是一个标量,它与一个比字符串更具特异性的正则表达式不匹配,因此根据核心模式它也会得到!!str
。但是你确定使用了核心模式吗? 2.,我们有一个带有直接循环的序列,以及一个只链接到该循环的序列,但通过无限递归的(理论)比较会说两者是相等的。那么它们是什么?)
我没有看到这种转变的用例。如果您的目标是最小化通过网络发送的数据,我建议在初始YAML上使用压缩算法 - 这是更简单的(已经存在,内部也在字符流上进行重复数据删除,但是可逆)。 p>