115 lines
1.9 KiB
JavaScript
115 lines
1.9 KiB
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
|
|
})
|
|
}
|