【问题标题】:VS Code snippet with multiple transforms具有多个转换的 VS 代码片段
【发布时间】:2019-11-07 01:53:21
【问题描述】:

我正在尝试制作一个 sn-p,它将获取剪贴板内容(markdown 文档中的标题文本)并将其转换为指向该部分的链接。例如,如果我的剪贴板包含:Some Heading - 20191107,那么我希望输出以下内容:

[Some Heading - 20191107](filename.md#some-heading---20191107)

到目前为止,这是我的 sn-p VS Code for markdown

    "link to this section": {
        "prefix": "isection",
        "body": [
            "[${1:${CLIPBOARD}}](${TM_FILENAME}#${CLIPBOARD/ /-/g})"
        ],
        "description": "Insert link to section whose heading text is in the clipboard"
    }

这是第一个变换,但我不知道如何嵌套多个变换:

  • 用连字符替换所有空格。
  • 全部改为小写。
  • 删除任何匹配[^a-z0-9-]的字符

测试用例

为了澄清我对@Mark 的测试用例,在VS Codemarkdown 文档中,我做了一个部分标题,例如:

# 20191107 - @#$%^& This is a section - 20191107

然后我复制文本 20191107 - @#$%^& This is a section - 20191107 并运行您为我修复的 sn-p。它输出的是:

[20191107 - @#$%^& This is a section - 20191107](tips.tech.git.md#20191107----this-is-a-section---20191107)

哪个是标题的有效链接!

【问题讨论】:

  • 理想情况下,您希望输出在您的测试用例中看起来如何?我使用了您原始问题中的Some Heading - 20191107 来设计正则表达式,但看起来# 20191107 - @#$%^& This is a section - 20191107 真的是您开始使用的吗?
  • 这只是一个示例,以便我可以测试它对包含非字母数字字符的标题的作用。顺便说一句,它工作得很好——正是我试图自己创造的。最重要的部分是它创建链接部分的方式 - 在圆括号内。如果您不介意对正则表达式进行一些解释,那将不胜感激!

标签: visual-studio-code vscode-snippets


【解决方案1】:

这是一个我认为满足所有要求的 sn-p(我已从我之前的答案中简化了这一点)。

"link to this section": {
  "prefix": "isection",
  "body": [

    "[${1:${CLIPBOARD}}](${TM_FILENAME}#${CLIPBOARD/([\\w-]+$)|([\\w-]+)|([-\\s]+)|([^\\w]+)/${1:/downcase}${2:/downcase}${2:+-}/gm})"

  ],
  "description": "Insert link to section whose heading text is in the clipboard"
}

我会解释这部分:

${CLIPBOARD/([\\w-]+$)|([\\w-]+)|([-\\s]+)|([^\\w]+)/${1:/downcase}${2:/downcase}${2:+-}/gm}

这里的主要思想是捕获每个组以在其自己的组中进行不同的处理。正则表达式交替只会为每场比赛捕获一个组。见regex101 demo

然后您可以转换该组或忽略它而不影响任何后续匹配!

这是四个捕获组的交替:

  1. ([\\w-]+$) 注意$ 表示行尾,必须是第一个捕获组
  2. ([\\w-]+) 与第 1 组相同,但不在行尾
  3. ([-\\s]+) 捕获组中的空格和连字符
  4. ([^\\w]+) 捕获组中除A-Za-z0-9 之外的任何字符

捕获组 1 获取 最后 组字符,例如 12345asdasd

捕获组 2 获得与组 1 相同的字符组,但如果它们位于行尾则不会。这很重要,因为如果有捕获组 2,则会添加 -,但如果有捕获组 1,则不会添加(因此不会在末尾添加连字符)。

捕获组 3 捕获空格和连字符。它将在输出中被忽略。

捕获组 4 捕获那些非A-Za-z0-9 字符并将被忽略。

这是转换的输出:${1:/downcase}${2:/downcase}${2:+-} 注意没有提到第 3 组或第 4 组 - 它们被丢弃了。但它们必须匹配,否则它们将通过“未转换”并出现在结果中 - 我们没有。

所以小写组 1 和 2,由于交替,永远不会在同一个匹配项中。

${2:+-} 如果有一个组 2 在其后添加一个-。整个 CLIPBOARD 的最后一场比赛将是第 1 组,因此对于最后一场比赛,不会附加连字符。

由于 g 标志,正则表达式运行了几次,每次只捕获 4 个组中的一个。


输入:Some Heading - 20191107
输出:[Some Heading - 20191107](fileName.ext#some-heading-20191107)

输入:20191107 - @#$%^& This is a section - 20191107
输出:[20191107 - @#$%^& This is a section - 20191107](test-bed-snippets.code-snippets#20191107-this-is-a-section-20191107)


如果您需要在结果中添加更多连字符,例如:

[Some Heading - 20191107](filename.md#some-heading---20191107)

只需将连字符从第三个捕获组中取出:([\\s]+) 即可得到:

[20191107 - @#$%^& This is a section - 20191107](test-bed-snippets.code-snippets#20191107---this-is-a-section---20191107)

【讨论】:

  • 感谢@Mark 的回复。在回答您的问题时,文本可能包含任何字符。为 Markdown 标题创建锚标记的规则是:1)用连字符替换所有空格,2)全部小写,删除所有非字母数字字符(或连字符)。
  • 哇,这很有效,当我尝试阅读它时,眼睛会稍微交叉。 :D 希望得到解释。对于带有此文本的测试(来自 markdown 标题):20191107 - @#$%^& This is a section - 20191107 它生成了此 markdown:[20191107 - @#$%^& This is a section - 20191107](notes.md#20191107----this-is-a-section---20191107),它正确链接到 VS Code 中的标题。
  • 不确定我是否完全遵循您的测试用例。 20191107 - @#$%^& This is a section - 20191107 整个事情都是一个测试用例?并且转换在该测试用例上可以按您的意愿工作?
  • 更新了我的问题测试,希望能解释一下!
  • 如果可以调整这个答案以更好地解释问题的通用部分,那就太好了:“用多个转换编写 sn-p”。目前,我必须自己破译正则表达式。因此,从我的角度来看,这个答案只是一个工作示例。
猜你喜欢
  • 1970-01-01
  • 2017-07-28
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多