all files / parsers/ emoji.js

95% Statements 19/20
75% Branches 3/4
100% Functions 3/3
95% Lines 19/20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78                                                                                              870×   870×       870×     2610×   2610× 870×     1740× 2610×      
'use strict';
 
var Parsimmon = require('parsimmon');
var flattenDeep = require('lodash.flattendeep');
 
var OptionalVariationSelector = Parsimmon.regex(/[\uFE0E\uFE0F]{0,1}/)
  .desc('an optional variation selector');
 
var KeycapEmoji = Parsimmon.seq(
  Parsimmon.regex(/[0-9#*]/),
  OptionalVariationSelector,
  Parsimmon.string('\u20E3')
).desc('a keycap emoji');
 
var FlagEmoji = Parsimmon.regex(/\uD83C[\uDDE6-\uDDFF]/)
  .times(2)
  .desc('a flag emoji');
 
var ZeroWidthJoiner = Parsimmon.string('\u200D')
  .desc('zero-width joiner (\\u200D)');
 
var SimpleEmoji = Parsimmon.alt(
  // Simple Unicode emoji
  Parsimmon.regex(/[\u203C-\u3299]/),
  Parsimmon.regex(/[\u2702-\u27B0]/),
  // Emoji flags
  FlagEmoji,
  // Surrogate pairs
  Parsimmon.regex(/\uD83C[\uDC04-\uDFFF]/),
  Parsimmon.regex(/\uD83D[\uDC00-\uDE4F]/),
  Parsimmon.regex(/\uD83D[\uDE80-\uDEC5]/),
  // Single characters (trademark, copyright) that become emoji with a
  // variation selector (TODO: make the variation selector required here?)
  Parsimmon.string('\u00A9'),
  Parsimmon.string('\u00AE')
);
 
var ZeroWidthJoinerEmoji = Parsimmon.seq(
  SimpleEmoji,
  OptionalVariationSelector,
  Parsimmon.seq(
    ZeroWidthJoiner,
    SimpleEmoji,
    OptionalVariationSelector
  ).times(1, 3)
);
 
var Emoji = exports.Emoji = Parsimmon.alt(
  ZeroWidthJoinerEmoji,
  Parsimmon.seq(
    SimpleEmoji,
    OptionalVariationSelector
  ),
  KeycapEmoji
);
 
exports.parseOne = function (string) {
  var result = Emoji.parse(string);
 
  Iif (!result.status) {
    return false;
  }
 
  return flattenDeep(result.value).join('');
};
 
exports.parse = function (string) {
  var result = Emoji.many().parse(string);
 
  if (!result.status) {
    return false;
  }
 
  return result.value.map(function (p) {
    return flattenDeep(p).join('');
  });
};