Class: Banzai::Filter::CustomEmojiFilter
- Inherits:
-
HTML::Pipeline::Filter
- Object
- HTML::Pipeline::Filter
- Banzai::Filter::CustomEmojiFilter
show all
- Includes:
- Gitlab::Utils::StrongMemoize
- Defined in:
- lib/banzai/filter/custom_emoji_filter.rb
Constant Summary
collapse
- IGNORED_ANCESTOR_TAGS =
%w(pre code tt).to_set
Instance Method Summary
collapse
#clear_memoization, #strong_memoize, #strong_memoized?
Instance Method Details
#call ⇒ Object
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# File 'lib/banzai/filter/custom_emoji_filter.rb', line 10
def call
return doc unless resource_parent
doc.xpath('descendant-or-self::text()').each do |node|
content = node.to_html
next if has_ancestor?(node, IGNORED_ANCESTOR_TAGS)
next unless content.include?(':')
next unless has_custom_emoji?
html = custom_emoji_name_element_filter(content)
node.replace(html) unless html == content
end
doc
end
|
#custom_emoji_name_element_filter(text) ⇒ Object
35
36
37
38
39
40
41
42
43
44
45
46
|
# File 'lib/banzai/filter/custom_emoji_filter.rb', line 35
def custom_emoji_name_element_filter(text)
text.gsub(custom_emoji_pattern) do |match|
name = Regexp.last_match[1]
custom_emoji = all_custom_emoji[name]
if custom_emoji
Gitlab::Emoji.custom_emoji_tag(custom_emoji.name, custom_emoji.url)
else
match
end
end
end
|
#custom_emoji_pattern ⇒ Object
28
29
30
31
32
33
|
# File 'lib/banzai/filter/custom_emoji_filter.rb', line 28
def custom_emoji_pattern
@emoji_pattern ||=
/(?<=[^[:alnum:]:]|\n|^)
:(#{CustomEmoji::NAME_REGEXP}):
(?=[^[:alnum:]:]|$)/x
end
|