Преобразувайте маркдаун връзки от вградени в препратки

Имам файл с регистър на промените, форматиран с помощта на markdown на Github.

Първоначално използвах вградени връзки за всяка връзка, която трябваше да добавя, а именно:

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

С течение на времето, когато размерът на файла нарасна, той стана малко разхвърлян главно поради този начин на вмъкване на връзки.

Бих искал да конвертирам всички връзки от вградени в референтни (вижте описание на всеки), което преобразува горния ред в това:

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

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

Тъй като файлът е доста голям и съдържа много вградени връзки, чудех се дали има някакъв автоматизиран начин да направя това. Използвам Sublime Text 3 за редактиране, но не можах да намеря подходящ пакет за тази задача. Може би някакъв умен регулярен израз?


person Gabriel    schedule 18.06.2015    source източник
comment
Очаквате ли инструментът да комбинира множество повторения на един и същ URL адрес към един и същ референтен номер?   -  person reto    schedule 18.06.2015
comment
@reto добре, няма да навреди, но бих бил готов сам да поправя тези случаи, ако това е толкова добро, колкото може.   -  person Gabriel    schedule 18.06.2015
comment
Sublime Text 3 идва ли със собствен скрипт или макро език, или има интерфейс с външен език като Perl, Python, Javascript или Visual Basic за приложения?   -  person Jongware    schedule 18.06.2015
comment
@Jongware, доколкото мога да кажа, Sublime 3 поддържа regex и това е всичко. Не мисля, че има собствен скриптов език, поне на мен не ми е известен такъв. Мисля, че вие ​​може да сте първият SO потребител, на когото съм попадал с толкова висока репутация, който не е запознат с Sublime Text. Потребител ли сте на vi/emacs?   -  person Gabriel    schedule 18.06.2015
comment
Аз съм твърдо обвързан с GUI. На Windows използвам TextPad, на Mac TextWrangler. Въпреки че нито един от тях не предоставя (много добър) скриптов език, и двамата могат да изпълняват конзолни програми и да улавят изхода им, така че бих продължил и ще напиша персонализиран инструмент на C, само за това. Изискваното ниво на съхранение/броене/извличане надхвърля това, което GREP може (и трябва) да прави.   -  person Jongware    schedule 18.06.2015
comment
@Gabriel: Може да дам пробно изпълнение на Sublime. Само за информация: той поддържа директно един от по-мощните езици: Python.   -  person Jongware    schedule 18.06.2015


Отговори (3)


Това е страхотно изискване!

Току-що създадох нова програма Node.js (знам, че не е GUI, но изглежда нещо, което повече хора биха искали възможността), за да направя това на GitHub.

Ето и кода:

// 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);
    });

});
person bjfletcher    schedule 18.06.2015
comment
Бихте ли добавили опция за форматиране на числото (като 3 водещи нули и т.н.)? Ще обработва ли едни и същи връзки, за да има същия референтен номер? Всъщност редакторът на StackOverflow го прави много добре. - person Royi; 18.05.2021

Запазете това като 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())
person Jongware    schedule 18.06.2015
comment
И ви отне само няколко часа от неизползването на Sublime до писането на плъгин за него :) Трябва да обмислите качването на това в packagecontrol. io, където живеят всички пакети на Sublime и могат лесно да бъдат инсталирани чрез мениджъра на пакети. Ще опитам този веднага щом мога. Благодаря ти Jongware! - person Gabriel; 19.06.2015
comment
Някой карал ли го е да работи? При мен май не работи. - person Royi; 18.05.2021

Попаднах на този въпрос благодарение на Google. Може би това може да помогне на други:

Моят отговор не е специфичен за Sublime, но ако вече използвате JavaScript (Node), бих използвал MD анализатор и CST трансформатор като забележка.

Например, за да преобразувате всички вградени връзки в README.md в връзки с числово възходящ стил на справка, можете да изпълните следното:

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

Или, ако искате връзки в референтен стил, извлечени от изходния uri:

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

Опцията --use на remark-cli не работи добре с npx@6, но може би това може да бъде съкратено до преходен един ред с npx@7. Същото може да се постигне с някаква комбинация от добавки за редактор, базирани на забележки. Надяваме се, че тази информация помага на хора като мен да не губят цял ​​ден в хакване на ненадеждно базирано на регулярен израз решение за това :)

person Xunnamius    schedule 01.01.2021