如何使用 Google S2 Converter 将 markdown() 中的 link 转换为带有图标的 link?
How to transform link in markdown() to link with favicon using Google S2 Converter?
我想要降价 links 在转换后的 link.
中有一个图标
https://www.google.com/s2/favicons?domain=http://cnn.com
- 将 return 来自任何域的图标。
已标记 (https://github.com/chjj/marked)
- 会将我代码中的所有 link 转换为 href 的
- http://cnn.com
成为
<a href="http://cnn.com">http://cnn.com</a>
那么,我将如何修改 marked.js 以便
- http://cnn.com
会变成
<a href="http://cnn.com"><img src="https://www.google.com/s2/favicons?domain=http://cnn.com">http://cnn.com</a>
我确实看到了这行 452 marked.js
autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
参考: https://github.com/chjj/marked/blob/master/lib/marked.js
我正在使用 expressjs 和 NodeJS
谢谢
罗布
您不必弄乱标记的源代码。
这个简单的正则表达式应该可以解决问题:
const markedOutput = '<a href="http://cnn.com">http://cnn.com</a>';
const withFavIcons = markedOutput.replace(/(<a[^>]+>)(https?:\/\/[^<]+)(<\/a>)/gi, (m, open, url, close) => {
const favicon = '<img src="https://www.google.com/s2/favicons?domain=' + url + '">';
const truncated = url.length > 50 ? url.slice(0, 47) + '...' : url;
return open + favicon + truncated + close;
});
你可以override a renderer method.
Marked 分两步工作:(1) 它将 Markdown 解析为一堆标记,(2) 将这些标记呈现为 HTML。由于您不想更改 Markdown 解析(它已经正确识别 links),但您确实想更改 HTML 输出,因此您想覆盖 link 的渲染器s.
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)
请注意,我只是对 default link method 进行了轻微修改,以通过 get_favicon
函数传递 text
。 get_favicon
函数接受文本字符串和 returns 替换文本(在本例中为图像)。它可能会得到改进,因为并非所有 link 的文本内容都只有一个域。如果文本包含的域多于域(路径、片段、查询字符串等),则仅将域用于 favicon link。或者,如果文本根本不包含 link(因为所有 link 都使用相同的渲染器,而不仅仅是自动 link),那么文本应该原封不动地返回。我将把这些改进留作 reader.
的练习。
我想要降价 links 在转换后的 link.
中有一个图标https://www.google.com/s2/favicons?domain=http://cnn.com - 将 return 来自任何域的图标。
已标记 (https://github.com/chjj/marked) - 会将我代码中的所有 link 转换为 href 的
- http://cnn.com
成为
<a href="http://cnn.com">http://cnn.com</a>
那么,我将如何修改 marked.js 以便 - http://cnn.com
会变成
<a href="http://cnn.com"><img src="https://www.google.com/s2/favicons?domain=http://cnn.com">http://cnn.com</a>
我确实看到了这行 452 marked.js
autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
参考: https://github.com/chjj/marked/blob/master/lib/marked.js
我正在使用 expressjs 和 NodeJS
谢谢 罗布
您不必弄乱标记的源代码。
这个简单的正则表达式应该可以解决问题:
const markedOutput = '<a href="http://cnn.com">http://cnn.com</a>';
const withFavIcons = markedOutput.replace(/(<a[^>]+>)(https?:\/\/[^<]+)(<\/a>)/gi, (m, open, url, close) => {
const favicon = '<img src="https://www.google.com/s2/favicons?domain=' + url + '">';
const truncated = url.length > 50 ? url.slice(0, 47) + '...' : url;
return open + favicon + truncated + close;
});
你可以override a renderer method.
Marked 分两步工作:(1) 它将 Markdown 解析为一堆标记,(2) 将这些标记呈现为 HTML。由于您不想更改 Markdown 解析(它已经正确识别 links),但您确实想更改 HTML 输出,因此您想覆盖 link 的渲染器s.
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)
请注意,我只是对 default link method 进行了轻微修改,以通过 get_favicon
函数传递 text
。 get_favicon
函数接受文本字符串和 returns 替换文本(在本例中为图像)。它可能会得到改进,因为并非所有 link 的文本内容都只有一个域。如果文本包含的域多于域(路径、片段、查询字符串等),则仅将域用于 favicon link。或者,如果文本根本不包含 link(因为所有 link 都使用相同的渲染器,而不仅仅是自动 link),那么文本应该原封不动地返回。我将把这些改进留作 reader.