@mapbox/jsxtreme-markdown
Version:
Transform Markdown into JSX or React component modules
115 lines (91 loc) • 2 kB
JavaScript
'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,
});
}