【问题标题】:How to map elements in a YAML text to their locations in that text?如何将 YAML 文本中的元素映射到它们在该文本中的位置?
【发布时间】:2021-08-05 18:01:12
【问题描述】:

对于 YAML 编辑器项目,我需要一种方法来发现 YAML 文本中已解析结构的元素,反之亦然。

想象一个表示顶层列表的 YAML 文件。移动文本光标时(在我要创建的编辑器内),我希望光标所在的列表元素得到特殊处理(例如以特殊方式显示)。

反之,通过浏览某种可视化结构(例如列表视图),我想让编辑器的光标跳转到相应的位置。

所以我认为我需要的只是一个普通的 YAML 解析器,除了解析的数据结构之外,它还为我提供了 JSON 文本和解析的数据结构之间的树状位置映射。

由于我的目标是嵌入式项目(将 PyQt 与 pyqtdeploy 结合使用),因此最受赞赏的方法将基于纯 Python(甚至仅使用标准库)。

【问题讨论】:

    标签: python parsing yaml


    【解决方案1】:

    好的,现在找到Parsing YAML, return with line number。我对提供的答案进行了一些改进(为了不在最终产品中混合解析的数据和位置)并提出了这个:

    import yaml, sys
    
    class SafeLineLoader(yaml.loader.SafeLoader):
        def construct_mapping(self, node, deep=False):
            mapping = super().construct_mapping(node, deep=deep)
            mapping['__line__'] = node.start_mark.line + 1
            return mapping
    
    def parse_with_locations(uri):
        locations = {}
        data = yaml.load(open(uri), Loader=SafeLineLoader)
        for elem in data:
            oid, line = id(elem), elem["__line__"]
            locations[line] = oid
            locations[oid] = line
            del elem["__line__"]        
        return data, locations
        
    data, locations = parse_with_locations(sys.argv[1])
    for l in data:
        print(f"@{locations[id(l)]}: {l}")
    

    注意:此代码故意不适用于任意 YAML 数据,而仅适用于列表。 (虽然可以改进)

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2020-10-07
      • 2023-03-13
      • 2020-05-19
      相关资源
      最近更新 更多