将降价链接从内联转换为参考

Convert markdown links from inline to reference

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

最初我使用 inline links 用于每个 link 我需要添加,即:

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

随着时间的推移,文件越来越大,主要是因为这种插入方式 links,文件变得有点乱。

我想将所有 link 从 inline 转换为 reference(参见 description of each) ,即将上面的行转换为:

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

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

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

这个要求太好了!

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

这里还有代码:

// 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, "[" + matches[url] + "]");
        markdown += "\n[" + matches[url] + "]: " + url;
    });

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

});

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

view.run_command('mdrelink');

从命令控制台中。

认为我的顺序是正确的——反转是必要的,否则它会弄乱下一个项目的已经缓存的索引。它还应该自动跳过已经使用的 link 号码。我的第一个 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())

感谢 Google 遇到了这个问题。也许这可以帮助其他人:

我的回答不是特定于 Sublime,但如果您已经在使用 JavaScript(节点),我会使用像 remark.[=20= 这样的 MD 解析器和 CST 转换器]

例如,要将 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 中的瞬态单行。使用基于注释的编辑器插件的某种组合也可以实现同样的效果。希望这些信息可以帮助像我这样的人不要浪费一整天的时间来破解一个不可靠的基于正则表达式的解决方案:)