UNPKG

showdown

Version:

A Markdown to HTML converter written in Javascript

53 lines (47 loc) 1.55 kB
/** * Input: an email address, e.g. "foo@example.com" * * Output: the email address as a mailto link, with each character * of the address encoded as either a decimal or hex entity, in * the hopes of foiling most address harvesting spam bots. E.g.: * * <a href="&#x6D;&#97;&#105;&#108;&#x74;&#111;:&#102;&#111;&#111;&#64;&#101; * x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;">&#102;&#111;&#111; * &#64;&#101;x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;</a> * * Based on a filter by Matthew Wickline, posted to the BBEdit-Talk * mailing list: <http://tinyurl.com/yu7ue> * */ showdown.subParser('encodeEmailAddress', function (addr) { 'use strict'; var encode = [ function (ch) { return '&#' + ch.charCodeAt(0) + ';'; }, function (ch) { return '&#x' + ch.charCodeAt(0).toString(16) + ';'; }, function (ch) { return ch; } ]; addr = 'mailto:' + addr; addr = addr.replace(/./g, function (ch) { if (ch === '@') { // this *must* be encoded. I insist. ch = encode[Math.floor(Math.random() * 2)](ch); } else if (ch !== ':') { // leave ':' alone (to spot mailto: later) var r = Math.random(); // roughly 10% raw, 45% hex, 45% dec ch = ( r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch) ); } return ch; }); addr = '<a href="' + addr + '">' + addr + '</a>'; addr = addr.replace(/">.+:/g, '">'); // strip the mailto: from the visible part return addr; });