3

我希望降价链接在转换后的链接中有一个图标。

https://www.google.com/s2/favicons?domain=http://cnn.com - 将返回来自任何域的网站图标。

标记(https://github.com/chjj/marked) - 将我代码中的所有链接转换为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>

我确实看到了这一行 452marked.js autolink: /^<([^ >]+(@|:\/)[^ >]+)>/, 参考: https ://github.com/chjj/marked/blob/master/lib/marked.js

我正在使用 expressjs 和 NodeJS

谢谢罗伯

4

2 回答 2

0

您不必弄乱标记的源代码。

这个简单的正则表达式应该可以解决问题:

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;
});
于 2017-10-19T18:42:35.380 回答
0

您可以覆盖渲染器方法

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 链接。或者,如果文本根本不包含链接(因为所有链接都使用相同的渲染器,而不仅仅是自动链接),那么文本应该原样返回。我将把这些改进留给读者作为练习。

于 2017-10-19T20:40:34.183 回答