如何将自定义图像标记添加到pagedown?

时间:2013-12-29 23:48:22

标签: javascript regex image 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">

查看docs执行此操作的唯一方法是使用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 个答案:

答案 0 :(得分:2)

想出来!该解决方案非常笨重,涉及编辑源代码,因为我在正则表达式上非常糟糕,_DoImage()函数仅在源代码中使用了许多内部函数。

<强>溶液

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

ctrl+f函数执行_DoImage,您会发现它在两个位置命名,一个在RunSpanGamut中,一个在定义函数。解决方案很简单,将DoImage函数及相关内容复制到新函数中,以模仿原始函数并对其进行编辑。

{p}旁边的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_urlsg_titles是如何调用的内部函数。

之后,将您的text = _DoPotatoImages(text);添加到runSpanGamut功能(请确保您在text = _DoAnchors(text);行之前添加功能,因为功能将超过图像标记)现在您应该能够写?[image desc](url)以及![image desc](url)

进行。

答案 1 :(得分:0)

感谢主帖的编辑。

我明白你的意思了。

如何使用空捕获组来指定标记有点奇怪,但如果它有效,它就可以工作。

看起来您需要在正则表达式字符串上添加额外的(),然后将m8指定为要传递给函数的新额外变量,然后将其指定为{{ 1}}就像函数顶部的其他变量一样。

然后它显示class = m8;,而不是var result =,你只需要class =\"p\"

答案 2 :(得分:0)

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

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

所以请检查function writeImageTag。在那里,您可以看到正则表达式匹配文本如何替换为完整的img标记。

您可以在从

返回之前更改几乎最后一行
 result += " />";

 result += ' class="lol" />';