Как добавить пользовательский тег изображения в pagedown?

Я пытаюсь скопировать оригинал img функциональность тега в обычай img тег, который будет добавлен в конвертер pagedown.

например, я копирую оригинальное поведение:

![image_url][1] [1]: http://lolink.com дает <img src="http://lolink.com">

в пользовательский:

?[image_url][1] [1]: http://lolink.com дает <img class="lol" src="http://lolink.com">

Глядя на документы, единственный способ сделать это через использование preblockgamut подключить и затем добавить еще одну "структуру уровня блока". Я попытался сделать это и получил Uncaught Error: Recursive call to converter.makeHtml

вот код моего возни с этим:

    converter.hooks.chain("preBlockGamut", function (text, dosomething) {
        return text.replace(/(\?\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, function (whole, inner) {
            return "<img src=" + dosomething(inner) + ">";
        });
    });

Я не очень опытен с крючками и всем прочим, что бы я сделал, чтобы это исправить? Благодарю.

ОБНОВЛЕНИЕ: обнаружил, что _DoImages работает после prespangamut, будет использовать это вместо preblockgamut

3 ответа

Решение

Догадаться! Решение очень неуклюжее и включает редактирование исходного кода, потому что я очень плохо разбираюсь в регулярных выражениях и _DoImage() Функция использует множество внутренних функций только в источнике.

решение:

Все изменения будут внесены в markdown.converter файл.

сделать ctrl+f для _DoImage функция, вы найдете, что она названа в двух местах, один в RunSpanGamut и один, определяющий функцию. Решение простое, скопируйте поверх DoImage функции и связанные вещи к новому, чтобы имитировать оригинальную функцию и редактировать ее по вкусу.

рядом с DoImage функция добавить:

function _DoPotatoImages(text) {
    text = text.replace(/(\?\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writePotatoImageTag);
    text = text.replace(/(\?\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writePotatoImageTag);
    return text;
}

function writePotatoImageTag(wholeMatch, m1, m2, m3, m4, m5, m6, m7) {
    var whole_match = m1;
    var alt_text = m2;
    var link_id = m3.toLowerCase();
    var url = m4;
    var title = m7;

    if (!title) title = "";

    if (url == "") {
        if (link_id == "") {
            link_id = alt_text.toLowerCase().replace(/ ?\n/g, " ");
        }
        url = "#" + link_id;

        if (g_urls.get(link_id) != undefined) {
            url = g_urls.get(link_id);
            if (g_titles.get(link_id) != undefined) {
                title = g_titles.get(link_id);
            }
        }
        else {
            return whole_match;
        }
    }

    alt_text = escapeCharacters(attributeEncode(alt_text), "*_[]()");
    url = escapeCharacters(url, "*_");
    var result = "<img src=\"" + url + "\" alt=\"" + alt_text + "\"";

    title = attributeEncode(title);
    title = escapeCharacters(title, "*_");
    result += " title=\"" + title + "\"";

    result += " class=\"p\" />";

    return result;
}   

если вы посмотрите на разницу между новым _DoPotatoImages() функция и оригинал _DoImages(), вы заметите, что я отредактировал регулярное выражение, чтобы иметь экранированный знак вопроса \? вместо нормального восклицательного знака !

Также обратите внимание, как writePotatoImageTag звонки g_urls а также g_titles которые являются некоторыми из внутренних функций, которые вызываются.

После этого добавьте свой text = _DoPotatoImages(text); в runSpanGamut (убедитесь, что вы добавили его до text = _DoAnchors(text); ЛИНИЯ, ПОТОМУ ЧТО ЭТА ФУНКЦИЯ ПЕРЕИГРЫВАЕТ ПОВТОРЫ ИЗОБРАЖЕНИЯ) ?[image desc](url) вместе с ![image desc](url)

сделанный.

Спасибо за редактирование к основному посту.

Теперь я понимаю, что вы имеете в виду.

Немного странно, как он использует пустые группы захвата для указания тегов, но если он работает, он работает.

Похоже, вам нужно будет добавить на () на строку регулярного выражения, затем укажите m8 в качестве новой дополнительной переменной для передачи в функцию, а затем укажите ее как class = m8; как и другие переменные в верхней части функции.

Тогда где это говорит var result =, вместо class =\"p\" ты бы просто положил class + title=\"" + .......

Полная строка (не только регулярное выражение) в Markdown.Converter.js выглядит так:

text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeImageTag);

так что проверьте function writeImageTag, Там вы можете увидеть, как текст, соответствующий регулярному выражению, заменяется на полный img тег.

Вы можете изменить почти последнюю строку перед ее возвратом из

 result += " />";

в

 result += ' class="lol" />';
Другие вопросы по тегам