UNPKG

@mapbox/jsxtreme-markdown

Version:
115 lines (91 loc) 2 kB
'use strict'; var decode = require('parse-entities'); var decimal = require('is-decimal'); var alphabetical = require('is-alphabetical'); var locate = require('../locate/email'); module.exports = email; email.locator = locate; email.notInLink = true; var plusSign = 43; // '+' var dash = 45; // '-' var dot = 46; // '.' var atSign = 64; // '@' var underscore = 95; // '_' function email(eat, value, silent) { var self = this; var gfm = self.options.gfm; var tokenizers = self.inlineTokenizers; var index = 0; var length = value.length; var firstDot = -1; var code; var content; var children; var exit; if (!gfm) { return; } code = value.charCodeAt(index); while ( decimal(code) || alphabetical(code) || code === plusSign || code === dash || code === dot || code === underscore ) { code = value.charCodeAt(++index); } if (index === 0) { return; } if (code !== atSign) { return; } index++; while (index < length) { code = value.charCodeAt(index); if ( decimal(code) || alphabetical(code) || code === dash || code === dot || code === underscore ) { index++; if (firstDot === -1 && code === dot) { firstDot = index; } continue; } break; } if ( firstDot === -1 || firstDot === index || code === dash || code === underscore ) { return; } if (code === dot) { index--; } content = value.slice(0, index); /* istanbul ignore if - never used (yet) */ if (silent) { return true; } exit = self.enterLink(); // Temporarily remove all tokenizers except text in url. self.inlineTokenizers = { text: tokenizers.text }; children = self.tokenizeInline(content, eat.now()); self.inlineTokenizers = tokenizers; exit(); return eat(content)({ type: 'link', title: null, url: 'mailto:' + decode(content, { nonTerminated: false }), children: children, }); }