sma*_*man 5 algorithm open-source yaml minify bundling-and-minification
是否存在通过引用插入实现 YAML 缩小的现有工具、库或算法?如果这个问题已经有一个通用的解决方案,我不想重新发明轮子。
我在此上下文中创建了术语引用插入,因此我想要的行为可能有不同的名称。让我解释一下引用插入的含义:
没有引用插入, 的基本 YAML 缩小算法MinifyYamlBasic
与 JSON 缩小同构,但会用最不冗长的等效 YAML 节点语法替换任何 JSON 原语。我MinifyYamlBasic
在https://onlineyamltools.com/minify-yaml找到了一个在线实施示例。
甲YAML缩小算法参照插入,MinifyYamlWithReferences
将尽一切MinifyYamlBasic
确实,但随后会产生对发生多次,并用所产生的锚的引用替换重复YAML节点,以降序YAML节点文本长度的顺序任何YAML节点锚。
这是我正在寻求的行为的基本思想,尽管显然还有其他因素需要考虑。小于别名的重复节点可能不应该被引用替换。输入文档需要规范化,以便可以通过句法比较识别语义等效的节点,这至少包括: 标量的规范形式替换;映射节点键的规范排序;取消引用和删除预先存在的锚点。
可能还有更多我还没有考虑过。在我花时间进一步考虑之前,
是否有任何可用资源提供MinifyYamlWithReferences
(或类似的东西)的现有实现?
算法(或算法类别)是否有一个常用的名称,我称之为“带引用插入的缩小”?
你想做的是一个转变。此类操作生成的 YAML 在语义上与原始 YAML 不同。以这个小 YAML 为例:
\n\n[foo, foo]\n
Run Code Online (Sandbox Code Playgroud)\n\n此 YAML 表示以下文档图:
\n\n +----------------------+\n | Sequence (root node) |\n +--|----------------|--+\n | |\n +--v--+ +--v--+\n | foo | | foo |\n +-----+ +-----+\n
Run Code Online (Sandbox Code Playgroud)\n\n使用你的MinifyYamlWithReferences
,这会变成这样:
[&a foo, *a]\n
Run Code Online (Sandbox Code Playgroud)\n\n它代表以下文档图:
\n\n +----------------------+\n | Sequence (root node) |\n +--|----------------|--+\n | |\n +--v--+ |\n | foo |<------------+\n +-----+\n
Run Code Online (Sandbox Code Playgroud)\n\n所以您创建了一个语义上不同的 YAML 文档!称这种缩小会产生误导,因为缩小通常被认为是将源转换为更小但语义上等效的源的过程。您所追求的是重复数据删除(以及缩小),这是一种语义转换。
\n\n我不知道有任何现有的实现。实施起来也很困难,因为您需要回答以下难题:
\n\n!!str a
、"a"
、\'a\'
和中哪些a
是等价的?&a [ *a ]
, [*a]
?(说明:在 1. 中,我们有两个带引号的标量,它们都计算为带有标记的标量节点!
。!
标量上的标量被解析为!!str
使用 YAML 核心架构。a
是一个与正则表达式不匹配的标量,用于比字符串更具体的内容,所以它也会!!str
根据核心模式得到。但是你确定使用了核心模式吗?在2.中,我们有一个带有直接循环的序列,以及一个仅链接到该循环的序列,但是(理论上)比较通过无限递归会说两者相等。那么它们是吗?)
我看不到这种转变的用例。如果您的目标是最大限度地减少通过网络发送的数据,我建议在初始 YAML 上使用压缩算法,而不是 \xe2\x80\x93 ,这是迄今为止更简单的(已经存在,内部也在字符流上进行重复数据删除,但是可逆)。
\n