diff --git a/lib/html/pipeline/emoji_filter.rb b/lib/html/pipeline/emoji_filter.rb
index f29310cc..4fc551d5 100644
--- a/lib/html/pipeline/emoji_filter.rb
+++ b/lib/html/pipeline/emoji_filter.rb
@@ -14,9 +14,6 @@ class Pipeline
# :asset_root (required) - base url to link to emoji sprite
# :asset_path (optional) - url path to link to emoji sprite. :file_name can be used as a placeholder for the sprite file name. If no asset_path is set "emoji/:file_name" is used.
class EmojiFilter < Filter
- # Build a regexp that matches all valid :emoji: names.
- EmojiPattern = /:(#{Emoji.names.map { |name| Regexp.escape(name) }.join('|')}):/
-
def call
doc.search('text()').each do |node|
content = node.to_html
@@ -43,7 +40,7 @@ def validate
def emoji_image_filter(text)
return text unless text.include?(':')
- text.gsub EmojiPattern do |match|
+ text.gsub(emoji_pattern) do |match|
name = $1
""
end
@@ -63,9 +60,9 @@ def asset_root
# Returns the context's asset_path or the default path if no context asset_path is given.
def asset_path(name)
if context[:asset_path]
- context[:asset_path].gsub(":file_name", "#{::CGI.escape(name)}.png")
+ context[:asset_path].gsub(":file_name", emoji_filename(name))
else
- File.join("emoji", "#{::CGI.escape(name)}.png")
+ File.join("emoji", emoji_filename(name))
end
end
@@ -74,6 +71,35 @@ def asset_path(name)
def emoji_url(name)
File.join(asset_root, asset_path(name))
end
+
+ # Build a regexp that matches all valid :emoji: names.
+ def self.emoji_pattern
+ @emoji_pattern ||= /:(#{emoji_names.map { |name| Regexp.escape(name) }.join('|')}):/
+ end
+
+ def emoji_pattern
+ self.class.emoji_pattern
+ end
+
+ # Detect gemoji v2 which has a new API
+ # https://github.com/jch/html-pipeline/pull/129
+ if Emoji.respond_to?(:all)
+ def self.emoji_names
+ Emoji.all.map(&:aliases).flatten.sort
+ end
+
+ def emoji_filename(name)
+ Emoji.find_by_alias(name).image_filename
+ end
+ else
+ def self.emoji_names
+ Emoji.names
+ end
+
+ def emoji_filename(name)
+ "#{::CGI.escape(name)}.png"
+ end
+ end
end
end
end