您可以覆盖渲染器方法。
Marked 分两个步骤工作:(1) 它将 Markdown 解析为一堆标记,(2) 将这些标记呈现为 HTML。由于您不想更改 Markdown 解析(它已经正确识别链接),但您确实想更改 HTML 输出,因此您想覆盖链接的渲染器。
var renderer = new marked.Renderer();
get_favicon = function (text) {
// return replacement text here...
var out = '<img src="https://www.google.com/s2/favicons?domain='
out += text + '">' + text + '</a>'
return out
}
renderer.link = function (href, title, text) {
if (this.options.sanitize) {
try {
var prot = decodeURIComponent(unescape(href))
.replace(/[^\w:]/g, '')
.toLowerCase();
} catch (e) {
return '';
}
if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
return '';
}
}
var out = '<a href="' + href + '"';
if (title) {
out += ' title="' + title + '"';
}
out += '>' + get_favicon(text) + '</a>';
return out;
};
}
// Pass the custom renderer to marked with the input.
markdown(input, renderer=renderer)
请注意,我只是采用了默认的链接方法,并对其稍作更改以text
通过该get_favicon
函数。该get_favicon
函数接受文本字符串并返回替换文本(本例中为图像)。它可能会得到改进,因为并非所有链接都只有一个域作为其文本内容。如果文本包含的域多于域(路径、片段、查询字符串等),则仅将域用于 favicon 链接。或者,如果文本根本不包含链接(因为所有链接都使用相同的渲染器,而不仅仅是自动链接),那么文本应该原样返回。我将把这些改进留给读者作为练习。