commit
984d2d4cb6
@ -1,19 +1,24 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
module EmojiHelper |
||||
EMOJI_PATTERN = /(?<=[^[:alnum:]:]|\n|^):([\w+-]+):(?=[^[:alnum:]:]|$)/x |
||||
|
||||
def emojify(text) |
||||
return text if text.blank? |
||||
|
||||
text.gsub(EMOJI_PATTERN) do |match| |
||||
emoji = Emoji.find_by_alias($1) # rubocop:disable Rails/DynamicFindBy,Style/PerlBackrefs |
||||
text.gsub(emoji_pattern) do |match| |
||||
emoji = Emoji.instance.unicode($1) # rubocop:disable Style/PerlBackrefs |
||||
|
||||
if emoji |
||||
emoji.raw |
||||
emoji |
||||
else |
||||
match |
||||
end |
||||
end |
||||
end |
||||
|
||||
def emoji_pattern |
||||
@emoji_pattern ||= |
||||
/(?<=[^[:alnum:]:]|\n|^) |
||||
(#{Emoji.instance.names.map { |name| Regexp.escape(name) }.join('|')}) |
||||
(?=[^[:alnum:]:]|$)/x |
||||
end |
||||
end |
||||
|
@ -0,0 +1,40 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
require 'singleton' |
||||
|
||||
class Emoji |
||||
include Singleton |
||||
|
||||
def initialize |
||||
data = Oj.load(File.open(File.join(Rails.root, 'lib', 'assets', 'emoji.json'))) |
||||
|
||||
@map = {} |
||||
|
||||
data.each do |_, emoji| |
||||
keys = [emoji['shortname']] + emoji['aliases'] |
||||
unicode = codepoint_to_unicode(emoji['unicode']) |
||||
|
||||
keys.each do |key| |
||||
@map[key] = unicode |
||||
end |
||||
end |
||||
end |
||||
|
||||
def unicode(shortcode) |
||||
@map[shortcode] |
||||
end |
||||
|
||||
def names |
||||
@map.keys |
||||
end |
||||
|
||||
private |
||||
|
||||
def codepoint_to_unicode(codepoint) |
||||
if codepoint.include?('-') |
||||
codepoint.split('-').map(&:hex).pack('U') |
||||
else |
||||
[codepoint.hex].pack('U') |
||||
end |
||||
end |
||||
end |
File diff suppressed because one or more lines are too long
@ -0,0 +1,15 @@ |
||||
require 'rails_helper' |
||||
|
||||
RSpec.describe Emoji do |
||||
describe '#unicode' do |
||||
it 'returns a unicode for a shortcode' do |
||||
expect(Emoji.instance.unicode(':joy:')).to eq '😂' |
||||
end |
||||
end |
||||
|
||||
describe '#names' do |
||||
it 'returns an array' do |
||||
expect(Emoji.instance.names).to be_an Array |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue