[Code翻译]开发者杂谈

170 阅读3分钟

本文由 简悦SimpRead 转码,原文地址 [bpruitt-goddard.github.io] (bpruitt-goddard.github.io/vs-code/201…)

在第一部分中创建了扩展并添加了对大部分语法的支持后,代码很快就......。

问题

在第一部分中创建了扩展并添加了对大部分语法的支持后,代码很快就变得臃肿起来,而且很难在json中遵循。这些问题正是微软的转换部分中所概述的。

例如,这里有一个正则表达式的片段

(\\b[-\\w]+\\b\\s*)(-?-[-\\>]\\|?|=?=[=\\>]|(?:\\.-|-\\.)-?\\>?)

为了和最终的结果做个比较,这里是等效的yaml代码。注意这些改进。

  1. 不需要转义反斜杠
  2. 能够通过行和注释将两个部分分开
begin: !regex |-
    (\b[-\w]+\b\s*) # Entity From
    (-?-[-\>]\|?|=?=[=\>]|(?:\.-|-\.)-?\>?) # Graph Link

建立设置

微软提供了转换为yaml格式的步骤。这被证明是一个很好的起点,js-yml提供了一个简单的工具,可以用来将yaml转换成json。但很快就发现,yaml的两个主要优点没有转化为正确的json的regex表达式。

  1. 多行字符串在json中会有空格隔开,除非它们是双引号字符串(需要对整个regex进行转义)。这意味着重词不会匹配,因为它要寻找那个空白。
  2. 多行语句的注释是无效的。

为了解决这些问题,我们需要创建一个自定义的yaml regex类型。它剔除了行末的注释和新的行,以使搜索结果表现正常。

var RegexYamlType = new yaml.Type('!regex', {
  kind: 'scalar',
  construct: function (data) {
    return data
      //Remove end of line comments (space then #)
      .replace(/(^|\s)#.*/g, '')
      //Remove new lines from yaml multistring
      .replace(/\n/g, '');
  }
});

回归检查

好消息是,由于json已经存在,新创建的yaml文件可以很容易地通过比较输出来测试是否一致。一旦输出与现有的json匹配,就可以断定yaml是正确编写的。

改善使用的方便性

随着新的和改进的yaml文件的准备,在检查变化之前,只需要针对该文件运行转换。这可能被证明是容易出错的,因为用正确的参数和使用自定义类型运行转换器有点冗长。为了使其更易于管理,我们将其缩短为一个单行代码,添加到package.json文件中,以允许任何人使用它。理想情况下,这个脚本将被添加到合并过程中并自动处理,但在这一点上,它很容易运行,并不是一个大的痛点。

未来的改进

随着对yaml转换的完全控制,有几件事可以改进以提高可读性。

可以在脚本中引入变量,以清理重复使用重码匹配的各种地方。

yaml也可以为每个图表类型分割成单独的文件,使其更容易阅读和开发。根据将进行的额外开发工作的数量,可能会探索和实施其中的一个或两个。


www.deepl.com 翻译