【问题标题】:Convert markdown links from inline to reference将 markdown 链接从内联转换为引用
【发布时间】:2015-09-04 05:05:43
【问题描述】:

我有一个使用Github's markdown 格式化的变更日志文件。

最初,我对需要添加的每个链接都使用了 inline 链接,即:

This is some [example](http://www.stackoverflow.com) line of text.

随着时间的推移,随着文件大小的增加,它变得有点混乱,主要是由于这种插入链接的方式。

我想将所有链接从 inline 转换为 reference(请参阅description of each),即将上述行转换为:

This is some [example][1] line of text.

[1]: http://www.stackoverflow.com

由于文件相当大并且包含许多内联链接,我想知道是否有一些自动化的方法可以做到这一点。我使用 Sublime Text 3 进行编辑,但找不到适合此任务的包。也许是一些聪明的正则表达式?

【问题讨论】:

  • 您是否希望“工具”将同一个 URL 的多次出现组合到同一个参考号?
  • @reto 好吧,这不会有什么坏处,但我愿意自己修复这些实例,如果它尽可能好的话。
  • Sublime Text 3 是否带有自己的脚本或宏语言,或者它是否具有与 Perl、Python、Javascript 或 Visual Basic for Applications 等外部语言的接口?
  • 我对图形用户界面非常执着。在 Windows 上,我使用 TextPad,在 Mac TextWrangler 上。虽然两者都没有提供(非常好的)脚本语言,但它们都可以运行控制台程序并捕获其输出,所以我会继续用 C 编写一个自定义工具,就为了这个。所需的存储/计数/检索级别超出了 GREP 可以(并且应该)做的事情。
  • @Gabriel:我可能会给 Sublime 一个试运行。仅供参考:它确实直接支持一种更强大的语言:Python.

标签: regex markdown sublimetext3 sublimetext


【解决方案1】:

这是一个很好的要求!

我刚刚在GitHub 上创建了一个新的 Node.js 程序(我知道它不是 GUI,但似乎更多人想要它的功能)来执行此操作。

这里也是代码:

// node main.js test.md result.md

var fs = require('fs')
fs.readFile(process.argv[2], 'utf8', function (err, markdown) {
    if (err) {
        return console.log(err);
    }
    var counter = 1;
    var matches = {};
    var matcher = /\[.*?\]\((.*?)\)/g;
    while (match = matcher.exec(markdown)) {
        if (!matches[match[1]]) matches[match[1]] = counter++;
    }
    console.log(matches);
    Object.keys(matches).forEach(function(url) {
        var r = new RegExp("(\\[.*?\\])\\(" + url + "\\)", "g");
        markdown = markdown.replace(r, "$1[" + matches[url] + "]");
        markdown += "\n[" + matches[url] + "]: " + url;
    });

    fs.writeFile(process.argv[3], markdown, 'utf8', function (err) {
        if (err) return console.log(err);
    });

});

【讨论】:

  • 你能添加选项来格式化数字吗(比如有3个前导零,等等......)?它会处理相同的链接以获得相同的参考号吗?实际上 StackOverflow 编辑器做得很好。
【解决方案2】:

将其保存为 mdrelink.py 在您的 Packages 文件夹中,然后您可以运行它

view.run_command('mdrelink');

在命令控制台中。

认为我得到了正确的顺序 - 反转是必要的,因为否则它会弄乱已经缓存的下一个项目的索引。它还应该自动跳过已使用的链接号。我的第一个 Python我的第一个 Sublime 插件,所以请对我温柔一点。

import sublime, sublime_plugin

class mdrelinkCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        oldlinks = []
        self.view.find_all("^\s*(\[\d+\]):", sublime.IGNORECASE, "\\1", oldlinks)
        newlinkpos = self.view.find_all("\[.+?\](\(.+?\))")
        orgtext = []
        self.view.find_all("(\[.+?\])\(.+?\)", sublime.IGNORECASE, "\\1", orgtext)
        orglink = []
        self.view.find_all("\[.+?\]\((.+?)\)", sublime.IGNORECASE, "\\1", orglink)
        orglink.reverse()
        self.view.insert(edit, self.view.size(), '\n\n')
        counter = 1
        newnumbers = []
        for r in newlinkpos:
            while '['+str(counter)+']' in oldlinks:
                 counter += 1
            oldlinks.append('['+str(counter)+']')
            line = '[' + str(counter)+']: '+ orglink.pop() + '\n'
            newnumbers.append('  ['+str(counter)+']')
            self.view.insert(edit, self.view.size(), line)
        for r in reversed(newlinkpos):
            self.view.replace(edit, r, orgtext.pop()+newnumbers.pop())

【讨论】:

  • 从不使用 Sublime 到为它编写插件只花了你几个小时 :) 你应该考虑把它上传到 packagecontrol.io 这是所有 Sublime 包都存在的地方,可以很容易地安装通过包管理器。我会尽快尝试一下。谢谢Jongware!
  • 有人成功了吗?它似乎对我不起作用。
【解决方案3】:

多亏了 Google,才发现这个问题。也许这可以帮助其他人:

我的答案不是 Sublime 特定的,但如果您已经在使用 JavaScript(Node),我会使用 MD 解析器和 CST 转换器,例如 remark

例如,要将README.md 中的所有内联链接转换为numerically-ascending reference-style links,您可以运行以下命令:

sudo npm install -g remark-reference-links remark-cli
npx remark README.md -o --use reference-links

或者,如果你想要reference-style links derived from the source uri

sudo npm install -g remark-defsplit remark-cli
npx remark README.md -o --use defsplit

remark-cli--use 选项不能很好地与npx@6 配合使用,但也许可以将其缩短为使用npx@7 的临时单行。使用基于注释的编辑器插件的某些组合也可以实现同样的效果。希望这些信息可以帮助像我这样的人不要浪费一整天的时间来破解一个不可靠的基于正则表达式的解决方案:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多