Markdown parser, done right. 100% CommonMark support, extensions, syntax plugins & high speed
https://markdown-it.github.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
2.4 KiB
57 lines
2.4 KiB
// Process autolinks '<protocol:...>'
|
|
|
|
|
|
var escape = require('../helpers').escapeHtml;
|
|
|
|
/*eslint max-len:0*/
|
|
var EMAIL_RE = /^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;
|
|
var AUTOLINK_RE = /^<([a-zA-Z.\-]{1,15}):([^<>\x00-\x20]*)>/;
|
|
var linkPrefix = 'coap|doi|javascript|aaa|aaas|about|acap|cap|cid|crid|data|dav|dict|dns|file|ftp|geo|go|gopher|h323|http|https|iax|icap|im|imap|info|ipp|iris|iris.beep|iris.xpc|iris.xpcs|iris.lwz|ldap|mailto|mid|msrp|msrps|mtqp|mupdate|news|nfs|ni|nih|nntp|opaquelocktoken|pop|pres|rtsp|service|session|shttp|sieve|sip|sips|sms|snmp|soap.beep|soap.beeps|tag|tel|telnet|tftp|thismessage|tn3270|tip|tv|urn|vemmi|ws|wss|xcon|xcon-userid|xmlrpc.beep|xmlrpc.beeps|xmpp|z39.50r|z39.50s|adiumxtra|afp|afs|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|chrome|chrome-extension|com-eventbrite-attendee|content|cvs|dlna-playsingle|dlna-playcontainer|dtn|dvb|ed2k|facetime|feed|finger|fish|gg|git|gizmoproject|gtalk|hcp|icon|ipn|irc|irc6|ircs|itms|jar|jms|keyparc|lastfm|ldaps|magnet|maps|market|message|mms|ms-help|msnim|mumble|mvn|notes|oid|palm|paparazzi|platform|proxy|psyc|query|res|resource|rmi|rsync|rtmp|secondlife|sftp|sgn|skype|smb|soldat|spotify|ssh|steam|svn|teamspeak|things|udp|unreal|ut2004|ventrilo|view-source|webcal|wtai|wyciwyg|xfire|xri|ymsgr'.split('|');
|
|
|
|
module.exports = function autolink(state) {
|
|
var tail, linkMatch, emailMatch, pos = state.pos;
|
|
|
|
if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }
|
|
|
|
tail = state.src.slice(pos);
|
|
|
|
if (tail.indexOf('>') < 0) { return false; }
|
|
|
|
linkMatch = tail.match(AUTOLINK_RE);
|
|
|
|
if (linkMatch) {
|
|
if (linkPrefix.indexOf(linkMatch[1]) < 0) { return false; }
|
|
|
|
state.push({
|
|
type: 'link_open',
|
|
href: escape(linkMatch[0].slice(1, -1))
|
|
});
|
|
state.push({
|
|
type: 'text',
|
|
content: escape(linkMatch[0].slice(1, -1))
|
|
});
|
|
state.push({ type: 'link_close' });
|
|
|
|
state.pos += linkMatch[0].length;
|
|
return true;
|
|
}
|
|
|
|
emailMatch = tail.match(EMAIL_RE);
|
|
|
|
if (emailMatch) {
|
|
state.tokens.push({
|
|
type: 'link_open',
|
|
href: 'mailto:' + escape(emailMatch[0].slice(1, -1))
|
|
});
|
|
state.tokens.push({
|
|
type: 'text',
|
|
content: escape(emailMatch[0].slice(1, -1))
|
|
});
|
|
state.tokens.push({ type: 'link_close' });
|
|
|
|
state.pos += emailMatch[0].length;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|