YAML缩小算法,包括参考插入

时间:2018-06-05 18:07:54

标签: algorithm yaml open-source minify bundling-and-minification

是否存在使用引用插入实现YAML缩小的现有工具,库或算法?如果已经存在解决此问题的常见解决方案,我不想重新发明轮子。

我在这个上下文中构成了术语引用插入,所以我想要的行为可能有不同的名称。让我通过引用插入来解释我的意思:

  • 基本的YAML缩小算法没有引用插入MinifyYamlBasic,将与JSON缩小同构,但会用最简洁的等效YAML节点语法替换任何JSON原语。我在https://onlineyamltools.com/minify-yaml找到了MinifyYamlBasic实施的在线示例。

  • 带参考插入的YAML缩小算法 MinifyYamlWithReferences将完成MinifyYamlBasic所做的所有事情,但会为多次出现的任何YAML节点生成锚点并使用对生成的锚点的引用替换重复的YAML节点,按YAML节点文本长度的降序排列。

这是我正在寻求的行为的基本理念,尽管显然还有其他因素需要考虑。小于其别名的重复节点可能不应该被引用替换。输入文档需要进行规范化,以便通过语法比较来识别语义上等效的节点,这至少包括:标量形式的标量替换;映射节点密钥的规范排序;取消引用和删除先前存在的锚。

我可能尚未考虑过更多内容。在我花时间进一步考虑之前,

  1. 是否有任何可用资源提供MinifyYamlWithReferences 的现有实施(或类似的东西)

  2. 算法(或算法类别)是否有一个常用的名称,我称之为“带参考插入的缩小”?

1 个答案:

答案 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文档!调用此缩小会产生误导,因为缩小通常被认为是将源转换为较小但在语义上等效的源的过程。你所追求的是重复数据删除(以及缩小),这是一种语义转换。

我不知道有任何现有的实现。实施它也很困难,因为您需要回答以下难题:

  1. !!str a"a"'a'a中哪一个相同?
  2. 这两个是等价的:&a [ *a ][*a]
  3. (解释:在1.中,我们有两个引用的标量,它们都评估为带有!标记的标量节点。标量上的!使用YAML核心模式解析为!!stra是一个标量,它与一个比字符串更具特异性的正则表达式不匹配,因此根据核心模式它也会得到!!str。但是你确定使用了核心模式吗? 2.,我们有一个带有直接循环的序列,以及一个只链接到该循环的序列,但通过无限递归的(理论)比较会说两者是相等的。那么它们是什么?)

    我没有看到这种转变的用例。如果您的目标是最小化通过网络发送的数据,我建议在初始YAML上使用压缩算法 - 这是更简单的(已经存在,内部也在字符流上进行重复数据删除,但是可逆)。 p>