Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
ae95118a
Commit
ae95118a
authored
Oct 11, 2016
by
Johan H
Committed by
henrik
Oct 13, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Convert UTF-8 Emoji to Gitlab emoji
parent
969286fc
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
43 additions
and
20 deletions
+43
-20
CHANGELOG
CHANGELOG
+1
-0
lib/banzai/filter/emoji_filter.rb
lib/banzai/filter/emoji_filter.rb
+21
-18
lib/gitlab/emoji.rb
lib/gitlab/emoji.rb
+5
-2
spec/lib/banzai/filter/emoji_filter_spec.rb
spec/lib/banzai/filter/emoji_filter_spec.rb
+16
-0
No files found.
CHANGELOG
View file @
ae95118a
...
...
@@ -34,6 +34,7 @@ v 8.13.0 (unreleased)
- Simplify Mentionable concern instance methods
- Fix permission for setting an issue's due date
- API: Multi-file commit !6096 (mahcsig)
- Unicode emoji are now converted to images
- Revert "Label list shows all issues (opened or closed) with that label"
- Expose expires_at field when sharing project on API
- Fix VueJS template tags being rendered in code comments
...
...
lib/banzai/filter/emoji_filter.rb
View file @
ae95118a
...
...
@@ -14,15 +14,16 @@ module Banzai
search_text_nodes
(
doc
).
each
do
|
node
|
content
=
node
.
to_html
next
if
has_ancestor?
(
node
,
IGNORED_ANCESTOR_TAGS
)
if
content
.
include?
(
':'
)
||
node
.
text
.
match
(
emoji_unicode_pattern
)
html
=
emoji_name_image_filter
(
content
)
html
=
emoji_unicode_image_filter
(
html
)
next
if
html
==
content
node
.
replace
(
html
)
end
end
next
unless
content
.
include?
(
':'
)
||
node
.
text
.
match
(
emoji_unicode_pattern
)
html
=
emoji_name_image_filter
(
content
)
html
=
emoji_unicode_image_filter
(
html
)
next
if
html
==
content
node
.
replace
(
html
)
end
doc
end
...
...
@@ -34,31 +35,35 @@ module Banzai
def
emoji_name_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' />"
emoji_image_tag
(
name
,
emoji_url
(
name
))
end
end
# Replace unicode emojis with corresponding images if they exist.
# Replace unicode emoji with corresponding images if they exist.
#
# text - String text to replace unicode emoji
s
in.
# text - String text to replace unicode emoji in.
#
# Returns a String with unicode emojis replaced with images.
# Returns a String with unicode emoji replaced with images.
def
emoji_unicode_image_filter
(
text
)
text
.
gsub
(
emoji_unicode_pattern
)
do
|
moji
|
"<img class='emoji' title=':
#{
Gitlab
::
Emoji
.
emojis_by_moji
[
moji
][
'name'
]
}
:' alt=':
#{
Gitlab
::
Emoji
.
emojis_by_moji
[
moji
][
'name'
]
}
:' src='
#{
emoji_unicode_url
(
moji
)
}
' height='20' width='20' align='absmiddle' />"
emoji_image_tag
(
Gitlab
::
Emoji
.
emojis_by_moji
[
moji
][
'name'
],
emoji_unicode_url
(
moji
))
end
end
def
emoji_image_tag
(
emoji_name
,
emoji_url
)
"<img class='emoji' title=':
#{
emoji_name
}
:' alt=':
#{
emoji_name
}
:' src='
#{
emoji_url
}
' height='20' width='20' align='absmiddle' />"
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
# Build a regexp that matches all valid unicode emojis names.
def
self
.
emoji_unicode_pattern
@emoji_unicode_pattern
||=
/(
#{
Gitlab
::
Emoji
.
emojis_unicodes
.
map
{
|
moji
|
Regexp
.
escape
(
moji
)
}
.join('|')})/
end
private
def
emoji_url
(
name
)
...
...
@@ -80,13 +85,10 @@ module Banzai
emoji_unicode_path
=
emoji_unicode_filename
(
moji
)
if
context
[
:asset_host
]
# Asset host is specified.
url_to_image
(
emoji_unicode_path
)
elsif
context
[
:asset_root
]
# Gitlab url is specified
File
.
join
(
context
[
:asset_root
],
url_to_image
(
emoji_unicode_path
))
else
# All other cases
url_to_image
(
emoji_unicode_path
)
end
end
...
...
@@ -102,6 +104,7 @@ module Banzai
def
emoji_filename
(
name
)
"
#{
Gitlab
::
Emoji
.
emoji_filename
(
name
)
}
.png"
end
def
emoji_unicode_pattern
self
.
class
.
emoji_unicode_pattern
end
...
...
lib/gitlab/emoji.rb
View file @
ae95118a
...
...
@@ -9,16 +9,19 @@ module Gitlab
def
emojis_by_moji
Gemojione
.
index
.
instance_variable_get
(
:@emoji_by_moji
)
end
def
emojis_unicodes
emojis_by_moji
.
keys
.
sort
emojis_by_moji
.
keys
end
def
emojis_names
emojis
.
keys
.
sort
emojis
.
keys
end
def
emoji_filename
(
name
)
emojis
[
name
][
"unicode"
]
end
def
emoji_unicode_filename
(
moji
)
emojis_by_moji
[
moji
][
"unicode"
]
end
...
...
spec/lib/banzai/filter/emoji_filter_spec.rb
View file @
ae95118a
...
...
@@ -16,10 +16,12 @@ describe Banzai::Filter::EmojiFilter, lib: true do
doc
=
filter
(
'<p>:heart:</p>'
)
expect
(
doc
.
css
(
'img'
).
first
.
attr
(
'src'
)).
to
eq
'https://foo.com/assets/2764.png'
end
it
'replaces supported unicode emoji'
do
doc
=
filter
(
'<p>❤️</p>'
)
expect
(
doc
.
css
(
'img'
).
first
.
attr
(
'src'
)).
to
eq
'https://foo.com/assets/2764.png'
end
it
'ignores unsupported emoji'
do
exp
=
act
=
'<p>:foo:</p>'
doc
=
filter
(
act
)
...
...
@@ -162,4 +164,18 @@ describe Banzai::Filter::EmojiFilter, lib: true do
doc
=
filter
(
':frowning:'
,
asset_host:
'https://this-is-ignored-i-guess?'
)
expect
(
doc
.
css
(
'img'
).
first
.
attr
(
'src'
)).
to
start_with
(
'https://cdn.example.com'
)
end
it
'uses a custom asset_root context'
do
root
=
Gitlab
.
config
.
gitlab
.
url
+
'gitlab/root'
doc
=
filter
(
"'🎱'"
,
asset_root:
root
)
expect
(
doc
.
css
(
'img'
).
first
.
attr
(
'src'
)).
to
start_with
(
root
)
end
it
'uses a custom asset_host context'
do
ActionController
::
Base
.
asset_host
=
'https://cdn.example.com'
doc
=
filter
(
"'🎱'"
,
asset_host:
'https://this-is-ignored-i-guess?'
)
expect
(
doc
.
css
(
'img'
).
first
.
attr
(
'src'
)).
to
start_with
(
'https://cdn.example.com'
)
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment