我正在尝试在自定义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
答案 0 :(得分:2)
想出来!该解决方案非常笨重,涉及编辑源代码,因为我在正则表达式上非常糟糕,_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)
进行。
答案 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" />';