Gab*_*iel 9 regex markdown sublimetext sublimetext3
我有一个使用Github的markdown格式化的changelog文件.
最初我使用内联链接来添加我需要添加的每个链接,即:
This is some [example](http://www.stackoverflow.com) line of text.
Run Code Online (Sandbox Code Playgroud)
随着时间的推移,随着文件大小的增长,主要由于这种插入链接的方式而变得有点混乱.
我想将所有链接从内联转换 为引用(参见每个链接的描述),即将上面的行转换为:
This is some [example][1] line of text.
[1]: http://www.stackoverflow.com
Run Code Online (Sandbox Code Playgroud)
由于文件相当大并且包含许多内联链接,我想知道是否有一些自动化的方法来执行此操作.我使用Sublime Text 3进行编辑,但是我找不到适合此任务的包.也许一些聪明的正则表达式?
这是一个很好的要求!
我刚刚在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);
});
});
Run Code Online (Sandbox Code Playgroud)
将其保存mdrelink.py在Packages文件夹中,然后可以使用它运行它
view.run_command('mdrelink');
Run Code Online (Sandbox Code Playgroud)
从命令控制台中.
我认为我得到了正确的顺序 - 反转是必要的,否则它会搞乱下一个项目已经缓存的索引.它还应自动跳过已使用的链接号.我的第一个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())
Run Code Online (Sandbox Code Playgroud)