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 ":#{name}:" 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