如何使用 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 的

那么,我将如何修改 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 函数传递 textget_favicon 函数接受文本字符串和 returns 替换文本(在本例中为图像)。它可能会得到改进,因为并非所有 link 的文本内容都只有一个域。如果文本包含的域多于域(路径、片段、查询字符串等),则仅将域用于 favicon link。或者,如果文本根本不包含 link(因为所有 link 都使用相同的渲染器,而不仅仅是自动 link),那么文本应该原封不动地返回。我将把这些改进留作 reader.

的练习。