3

我正在尝试在将添加到 pagedown 转换器img的自定义标签中复制原始标签的功能。img

例如,我正在复制原始行为:

![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

4

3 回答 3

2

弄清楚了!该解决方案非常笨拙,并且涉及编辑源代码,因为我在正则表达式方面非常糟糕,并且该_DoImage()函数仅在源代码中使用了很多内部函数。

解决方案:

将对markdown.converter文件进行所有编辑。

ctrl+f对函数做a _DoImage,你会发现它在两个地方命名,一个在the中,一个在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)

完毕。

于 2014-01-14T20:37:49.137 回答
0

感谢您对主帖的编辑。

我明白你现在的意思了。

它如何使用空捕获组来指定标签有点奇怪,但如果它有效,它就有效。

看起来您需要()在正则表达式字符串中添加一个额外变量,然后指定m8为要传递给函数的新额外变量,然后将其指定为class = m8;与函数顶部的其他变量一样。

然后在它说的地方var result =,而不是class =\"p\"你会放class + title=\"" + .......

于 2013-12-30T00:40:42.363 回答
0

整行(不仅是正则表达式)Markdown.Converter.js如下所示:

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

所以检查function writeImageTag. 在那里你可以看到正则表达式匹配的文本是如何被一个完整的img标签替换的。

您可以在返回之前更改几乎最后一行

 result += " />";

 result += ' class="lol" />';
于 2013-12-30T00:51:05.183 回答