Sha256: 654d91b29a36cb7197bf3586eb1852c8f58d1782bcf9faf979bf919258758fa1

Contents?: true

Size: 1.91 KB

Versions: 23

Compression:

Stored size: 1.91 KB

Contents

'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
  })
}

Version data entries

23 entries across 23 versions & 1 rubygems

Version Path
trusty-cms-5.0.7 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-5.0.6 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-5.0.5 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-5.0.4 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-5.0.3 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-5.0.2 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-5.0.1 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.3.5 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-5.0.0 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.3.4 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.3.3 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.3.2 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.3.1 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.3 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.2.3 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.2.2 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.2.1 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.2 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.1.9 node_modules/remark-parse/lib/tokenize/email.js
trusty-cms-4.1.8 node_modules/remark-parse/lib/tokenize/email.js