gitlab-org--gitlab-foss/lib/banzai/filter/emoji_filter.rb

77 lines
1.9 KiB
Ruby
Raw Normal View History

module Banzai
module Filter
2015-04-16 21:38:01 +00:00
# HTML filter that replaces :emoji: with images.
#
# Based on HTML::Pipeline::EmojiFilter
#
# Context options:
# :asset_root
# :asset_host
class EmojiFilter < HTML::Pipeline::Filter
IGNORED_ANCESTOR_TAGS = %w(pre code tt).to_set
def call
search_text_nodes(doc).each do |node|
2015-04-16 21:38:01 +00:00
content = node.to_html
next unless content.include?(':')
next if has_ancestor?(node, IGNORED_ANCESTOR_TAGS)
html = emoji_image_filter(content)
next if html == content
node.replace(html)
end
doc
end
# Replace :emoji: with corresponding images.
#
# text - String text to replace :emoji: in.
#
# Returns a String with :emoji: replaced with images.
def emoji_image_filter(text)
text.gsub(emoji_pattern) do |match|
name = $1
"<img class='emoji' title=':#{name}:' alt=':#{name}:' src='#{emoji_url(name)}' height='20' width='20' align='absmiddle' />"
end
end
# Build a regexp that matches all valid :emoji: names.
def self.emoji_pattern
@emoji_pattern ||= /:(#{Gitlab::Emoji.emojis_names.map { |name| Regexp.escape(name) }.join('|')}):/
end
2015-04-16 21:38:01 +00:00
private
def emoji_url(name)
emoji_path = emoji_filename(name)
2015-04-16 21:38:01 +00:00
if context[:asset_host]
# Asset host is specified.
url_to_image(emoji_path)
elsif context[:asset_root]
# Gitlab url is specified
File.join(context[:asset_root], url_to_image(emoji_path))
else
# All other cases
url_to_image(emoji_path)
end
end
def url_to_image(image)
ActionController::Base.helpers.url_to_image(image)
end
def emoji_pattern
self.class.emoji_pattern
end
def emoji_filename(name)
"#{Gitlab::Emoji.emoji_filename(name)}.png"
2015-04-16 21:38:01 +00:00
end
end
end
end