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
0
Merge Requests
0
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
Boxiang Sun
gitlab-ce
Commits
ee993014
Commit
ee993014
authored
Mar 07, 2017
by
Eric Eastwood
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update emojis to use harmony modules (import/export)
parent
935574ed
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
375 additions
and
366 deletions
+375
-366
app/assets/javascripts/awards_handler.js
app/assets/javascripts/awards_handler.js
+4
-6
app/assets/javascripts/behaviors/gl_emoji.js
app/assets/javascripts/behaviors/gl_emoji.js
+47
-159
app/assets/javascripts/behaviors/gl_emoji/is_emoji_unicode_supported.js
...ascripts/behaviors/gl_emoji/is_emoji_unicode_supported.js
+121
-0
app/assets/javascripts/behaviors/gl_emoji/spread_string.js
app/assets/javascripts/behaviors/gl_emoji/spread_string.js
+1
-1
app/assets/javascripts/behaviors/gl_emoji/unicode_support_map.js
...ets/javascripts/behaviors/gl_emoji/unicode_support_map.js
+20
-13
app/assets/javascripts/extensions/string.js
app/assets/javascripts/extensions/string.js
+2
-2
app/assets/javascripts/gfm_auto_complete.js
app/assets/javascripts/gfm_auto_complete.js
+3
-5
app/assets/javascripts/main.js
app/assets/javascripts/main.js
+162
-164
config/webpack.config.js
config/webpack.config.js
+1
-2
spec/javascripts/awards_handler_spec.js
spec/javascripts/awards_handler_spec.js
+3
-2
spec/javascripts/gl_emoji_spec.js
spec/javascripts/gl_emoji_spec.js
+11
-12
No files found.
app/assets/javascripts/awards_handler.js
View file @
ee993014
/* global Cookies */
/* global Cookies */
const
emojiMap
=
require
(
'
emoji-map
'
);
import
emojiMap
from
'
emojis/digests.json
'
;
const
emojiAliases
=
require
(
'
emoji-aliases
'
);
import
emojiAliases
from
'
emojis/aliases.json
'
;
const
glEmoji
=
require
(
'
./behaviors/gl_emoji
'
);
import
{
glEmojiTag
}
from
'
./behaviors/gl_emoji
'
;
const
glEmojiTag
=
glEmoji
.
glEmojiTag
;
const
animationEndEventString
=
'
animationend webkitAnimationEnd MSAnimationEnd oAnimationEnd
'
;
const
animationEndEventString
=
'
animationend webkitAnimationEnd MSAnimationEnd oAnimationEnd
'
;
const
requestAnimationFrame
=
window
.
requestAnimationFrame
||
const
requestAnimationFrame
=
window
.
requestAnimationFrame
||
...
@@ -515,4 +513,4 @@ AwardsHandler.prototype.destroy = function destroy() {
...
@@ -515,4 +513,4 @@ AwardsHandler.prototype.destroy = function destroy() {
$
(
'
.emoji-menu
'
).
remove
();
$
(
'
.emoji-menu
'
).
remove
();
};
};
module
.
exports
=
AwardsHandler
;
export
default
AwardsHandler
;
app/assets/javascripts/behaviors/gl_emoji.js
View file @
ee993014
const
installCustomElements
=
require
(
'
document-register-element
'
)
;
import
installCustomElements
from
'
document-register-element
'
;
const
emojiMap
=
require
(
'
emoji-map
'
)
;
import
emojiMap
from
'
emojis/digests.json
'
;
const
emojiAliases
=
require
(
'
emoji-aliases
'
)
;
import
emojiAliases
from
'
emojis/aliases.json
'
;
const
generatedUnicodeSupportMap
=
require
(
'
./gl_emoji/unicode_support_map
'
)
;
import
{
getUnicodeSupportMap
}
from
'
./gl_emoji/unicode_support_map
'
;
const
spreadString
=
require
(
'
./gl_emoji/spread_string
'
)
;
import
{
isEmojiUnicodeSupported
}
from
'
./gl_emoji/is_emoji_unicode_supported
'
;
installCustomElements
(
window
);
installCustomElements
(
window
);
const
generatedUnicodeSupportMap
=
getUnicodeSupportMap
();
function
emojiImageTag
(
name
,
src
)
{
function
emojiImageTag
(
name
,
src
)
{
return
`<img class="emoji" title=":
${
name
}
:" alt=":
${
name
}
:" src="
${
src
}
" width="20" height="20" align="absmiddle" />`
;
return
`<img class="emoji" title=":
${
name
}
:" alt=":
${
name
}
:" src="
${
src
}
" width="20" height="20" align="absmiddle" />`
;
}
}
...
@@ -55,163 +57,49 @@ function glEmojiTag(inputName, options) {
...
@@ -55,163 +57,49 @@ function glEmojiTag(inputName, options) {
`
;
`
;
}
}
// On Windows, flags render as two-letter country codes, see http://emojipedia.org/flags/
function
installGlEmojiElement
()
{
const
flagACodePoint
=
127462
;
// parseInt('1F1E6', 16)
const
GlEmojiElementProto
=
Object
.
create
(
HTMLElement
.
prototype
);
const
flagZCodePoint
=
127487
;
// parseInt('1F1FF', 16)
GlEmojiElementProto
.
createdCallback
=
function
createdCallback
()
{
function
isFlagEmoji
(
emojiUnicode
)
{
const
emojiUnicode
=
this
.
textContent
.
trim
();
const
cp
=
emojiUnicode
.
codePointAt
(
0
);
const
{
// Length 4 because flags are made of 2 characters which are surrogate pairs
name
,
return
emojiUnicode
.
length
===
4
&&
cp
>=
flagACodePoint
&&
cp
<=
flagZCodePoint
;
unicodeVersion
,
}
fallbackSrc
,
fallbackSpriteClass
,
// Chrome <57 renders keycaps oddly
}
=
this
.
dataset
;
// See https://bugs.chromium.org/p/chromium/issues/detail?id=632294
// Same issue on Windows also fixed in Chrome 57, http://i.imgur.com/rQF7woO.png
const
isEmojiUnicode
=
this
.
childNodes
&&
Array
.
prototype
.
every
.
call
(
function
isKeycapEmoji
(
emojiUnicode
)
{
this
.
childNodes
,
return
emojiUnicode
.
length
===
3
&&
emojiUnicode
[
2
]
===
'
\
u20E3
'
;
childNode
=>
childNode
.
nodeType
===
3
,
}
);
const
hasImageFallback
=
fallbackSrc
&&
fallbackSrc
.
length
>
0
;
// Check for a skin tone variation emoji which aren't always supported
const
hasCssSpriteFalback
=
fallbackSpriteClass
&&
fallbackSpriteClass
.
length
>
0
;
const
tone1
=
127995
;
// parseInt('1F3FB', 16)
const
tone5
=
127999
;
// parseInt('1F3FF', 16)
if
(
function
isSkinToneComboEmoji
(
emojiUnicode
)
{
isEmojiUnicode
&&
return
emojiUnicode
.
length
>
2
&&
spreadString
(
emojiUnicode
).
some
((
char
)
=>
{
!
isEmojiUnicodeSupported
(
generatedUnicodeSupportMap
,
emojiUnicode
,
unicodeVersion
)
const
cp
=
char
.
codePointAt
(
0
);
)
{
return
cp
>=
tone1
&&
cp
<=
tone5
;
// CSS sprite fallback takes precedence over image fallback
});
if
(
hasCssSpriteFalback
)
{
}
// IE 11 doesn't like adding multiple at once :(
this
.
classList
.
add
(
'
emoji-icon
'
);
// macOS supports most skin tone emoji's but
this
.
classList
.
add
(
fallbackSpriteClass
);
// doesn't support the skin tone versions of horse racing
}
else
if
(
hasImageFallback
)
{
const
horseRacingCodePoint
=
127943
;
// parseInt('1F3C7', 16)
this
.
innerHTML
=
emojiImageTag
(
name
,
fallbackSrc
);
function
isHorceRacingSkinToneComboEmoji
(
emojiUnicode
)
{
}
else
{
return
spreadString
(
emojiUnicode
)[
0
].
codePointAt
(
0
)
===
horseRacingCodePoint
&&
const
src
=
assembleFallbackImageSrc
(
name
);
isSkinToneComboEmoji
(
emojiUnicode
);
this
.
innerHTML
=
emojiImageTag
(
name
,
src
);
}
}
// Check for `family_*`, `kiss_*`, `couple_*`
// For ex. Windows 8.1 Firefox 51.0.1, doesn't support these
const
zwj
=
8205
;
// parseInt('200D', 16)
const
personStartCodePoint
=
128102
;
// parseInt('1F466', 16)
const
personEndCodePoint
=
128105
;
// parseInt('1F469', 16)
function
isPersonZwjEmoji
(
emojiUnicode
)
{
let
hasPersonEmoji
=
false
;
let
hasZwj
=
false
;
spreadString
(
emojiUnicode
).
forEach
((
character
)
=>
{
const
cp
=
character
.
codePointAt
(
0
);
if
(
cp
===
zwj
)
{
hasZwj
=
true
;
}
else
if
(
cp
>=
personStartCodePoint
&&
cp
<=
personEndCodePoint
)
{
hasPersonEmoji
=
true
;
}
}
});
};
return
hasPersonEmoji
&&
hasZwj
;
}
// Helper so we don't have to run `isFlagEmoji` twice
// in `isEmojiUnicodeSupported` logic
function
checkFlagEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
)
{
const
isFlagResult
=
isFlagEmoji
(
emojiUnicode
);
return
(
(
unicodeSupportMap
.
flag
&&
isFlagResult
)
||
!
isFlagResult
);
}
// Helper so we don't have to run `isSkinToneComboEmoji` twice
// in `isEmojiUnicodeSupported` logic
function
checkSkinToneModifierSupport
(
unicodeSupportMap
,
emojiUnicode
)
{
const
isSkinToneResult
=
isSkinToneComboEmoji
(
emojiUnicode
);
return
(
(
unicodeSupportMap
.
skinToneModifier
&&
isSkinToneResult
)
||
!
isSkinToneResult
);
}
// Helper func so we don't have to run `isHorceRacingSkinToneComboEmoji` twice
// in `isEmojiUnicodeSupported` logic
function
checkHorseRacingSkinToneComboEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
)
{
const
isHorseRacingSkinToneResult
=
isHorceRacingSkinToneComboEmoji
(
emojiUnicode
);
return
(
(
unicodeSupportMap
.
horseRacing
&&
isHorseRacingSkinToneResult
)
||
!
isHorseRacingSkinToneResult
);
}
// Helper so we don't have to run `isPersonZwjEmoji` twice
// in `isEmojiUnicodeSupported` logic
function
checkPersonEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
)
{
const
isPersonZwjResult
=
isPersonZwjEmoji
(
emojiUnicode
);
return
(
(
unicodeSupportMap
.
personZwj
&&
isPersonZwjResult
)
||
!
isPersonZwjResult
);
}
// Takes in a support map and determines whether
// the given unicode emoji is supported on the platform.
//
// Combines all the edge case tests into a one-stop shop method
function
isEmojiUnicodeSupported
(
unicodeSupportMap
=
{},
emojiUnicode
,
unicodeVersion
)
{
const
isOlderThanChrome57
=
unicodeSupportMap
.
meta
&&
unicodeSupportMap
.
meta
.
isChrome
&&
unicodeSupportMap
.
meta
.
chromeVersion
<
57
;
// For comments about each scenario, see the comments above each individual respective function
document
.
registerElement
(
'
gl-emoji
'
,
{
return
unicodeSupportMap
[
unicodeVersion
]
&&
prototype
:
GlEmojiElementProto
,
!
(
isOlderThanChrome57
&&
isKeycapEmoji
(
emojiUnicode
))
&&
});
checkFlagEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
)
&&
checkSkinToneModifierSupport
(
unicodeSupportMap
,
emojiUnicode
)
&&
checkHorseRacingSkinToneComboEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
)
&&
checkPersonEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
);
}
}
const
GlEmojiElementProto
=
Object
.
create
(
HTMLElement
.
prototype
);
export
{
GlEmojiElementProto
.
createdCallback
=
function
createdCallback
()
{
installGlEmojiElement
,
const
emojiUnicode
=
this
.
textContent
.
trim
();
const
{
name
,
unicodeVersion
,
fallbackSrc
,
fallbackSpriteClass
,
}
=
this
.
dataset
;
const
isEmojiUnicode
=
this
.
childNodes
&&
Array
.
prototype
.
every
.
call
(
this
.
childNodes
,
childNode
=>
childNode
.
nodeType
===
3
,
);
const
hasImageFallback
=
fallbackSrc
&&
fallbackSrc
.
length
>
0
;
const
hasCssSpriteFalback
=
fallbackSpriteClass
&&
fallbackSpriteClass
.
length
>
0
;
if
(
isEmojiUnicode
&&
!
isEmojiUnicodeSupported
(
generatedUnicodeSupportMap
,
emojiUnicode
,
unicodeVersion
)
)
{
// CSS sprite fallback takes precedence over image fallback
if
(
hasCssSpriteFalback
)
{
// IE 11 doesn't like adding multiple at once :(
this
.
classList
.
add
(
'
emoji-icon
'
);
this
.
classList
.
add
(
fallbackSpriteClass
);
}
else
if
(
hasImageFallback
)
{
this
.
innerHTML
=
emojiImageTag
(
name
,
fallbackSrc
);
}
else
{
const
src
=
assembleFallbackImageSrc
(
name
);
this
.
innerHTML
=
emojiImageTag
(
name
,
src
);
}
}
};
document
.
registerElement
(
'
gl-emoji
'
,
{
prototype
:
GlEmojiElementProto
,
});
module
.
exports
=
{
emojiImageTag
,
glEmojiTag
,
glEmojiTag
,
isEmojiUnicodeSupported
,
emojiImageTag
,
isFlagEmoji
,
isKeycapEmoji
,
isSkinToneComboEmoji
,
isHorceRacingSkinToneComboEmoji
,
isPersonZwjEmoji
,
};
};
app/assets/javascripts/behaviors/gl_emoji/is_emoji_unicode_supported.js
0 → 100644
View file @
ee993014
import
spreadString
from
'
./spread_string
'
;
// On Windows, flags render as two-letter country codes, see http://emojipedia.org/flags/
const
flagACodePoint
=
127462
;
// parseInt('1F1E6', 16)
const
flagZCodePoint
=
127487
;
// parseInt('1F1FF', 16)
function
isFlagEmoji
(
emojiUnicode
)
{
const
cp
=
emojiUnicode
.
codePointAt
(
0
);
// Length 4 because flags are made of 2 characters which are surrogate pairs
return
emojiUnicode
.
length
===
4
&&
cp
>=
flagACodePoint
&&
cp
<=
flagZCodePoint
;
}
// Chrome <57 renders keycaps oddly
// See https://bugs.chromium.org/p/chromium/issues/detail?id=632294
// Same issue on Windows also fixed in Chrome 57, http://i.imgur.com/rQF7woO.png
function
isKeycapEmoji
(
emojiUnicode
)
{
return
emojiUnicode
.
length
===
3
&&
emojiUnicode
[
2
]
===
'
\
u20E3
'
;
}
// Check for a skin tone variation emoji which aren't always supported
const
tone1
=
127995
;
// parseInt('1F3FB', 16)
const
tone5
=
127999
;
// parseInt('1F3FF', 16)
function
isSkinToneComboEmoji
(
emojiUnicode
)
{
return
emojiUnicode
.
length
>
2
&&
spreadString
(
emojiUnicode
).
some
((
char
)
=>
{
const
cp
=
char
.
codePointAt
(
0
);
return
cp
>=
tone1
&&
cp
<=
tone5
;
});
}
// macOS supports most skin tone emoji's but
// doesn't support the skin tone versions of horse racing
const
horseRacingCodePoint
=
127943
;
// parseInt('1F3C7', 16)
function
isHorceRacingSkinToneComboEmoji
(
emojiUnicode
)
{
return
spreadString
(
emojiUnicode
)[
0
].
codePointAt
(
0
)
===
horseRacingCodePoint
&&
isSkinToneComboEmoji
(
emojiUnicode
);
}
// Check for `family_*`, `kiss_*`, `couple_*`
// For ex. Windows 8.1 Firefox 51.0.1, doesn't support these
const
zwj
=
8205
;
// parseInt('200D', 16)
const
personStartCodePoint
=
128102
;
// parseInt('1F466', 16)
const
personEndCodePoint
=
128105
;
// parseInt('1F469', 16)
function
isPersonZwjEmoji
(
emojiUnicode
)
{
let
hasPersonEmoji
=
false
;
let
hasZwj
=
false
;
spreadString
(
emojiUnicode
).
forEach
((
character
)
=>
{
const
cp
=
character
.
codePointAt
(
0
);
if
(
cp
===
zwj
)
{
hasZwj
=
true
;
}
else
if
(
cp
>=
personStartCodePoint
&&
cp
<=
personEndCodePoint
)
{
hasPersonEmoji
=
true
;
}
});
return
hasPersonEmoji
&&
hasZwj
;
}
// Helper so we don't have to run `isFlagEmoji` twice
// in `isEmojiUnicodeSupported` logic
function
checkFlagEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
)
{
const
isFlagResult
=
isFlagEmoji
(
emojiUnicode
);
return
(
(
unicodeSupportMap
.
flag
&&
isFlagResult
)
||
!
isFlagResult
);
}
// Helper so we don't have to run `isSkinToneComboEmoji` twice
// in `isEmojiUnicodeSupported` logic
function
checkSkinToneModifierSupport
(
unicodeSupportMap
,
emojiUnicode
)
{
const
isSkinToneResult
=
isSkinToneComboEmoji
(
emojiUnicode
);
return
(
(
unicodeSupportMap
.
skinToneModifier
&&
isSkinToneResult
)
||
!
isSkinToneResult
);
}
// Helper func so we don't have to run `isHorceRacingSkinToneComboEmoji` twice
// in `isEmojiUnicodeSupported` logic
function
checkHorseRacingSkinToneComboEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
)
{
const
isHorseRacingSkinToneResult
=
isHorceRacingSkinToneComboEmoji
(
emojiUnicode
);
return
(
(
unicodeSupportMap
.
horseRacing
&&
isHorseRacingSkinToneResult
)
||
!
isHorseRacingSkinToneResult
);
}
// Helper so we don't have to run `isPersonZwjEmoji` twice
// in `isEmojiUnicodeSupported` logic
function
checkPersonEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
)
{
const
isPersonZwjResult
=
isPersonZwjEmoji
(
emojiUnicode
);
return
(
(
unicodeSupportMap
.
personZwj
&&
isPersonZwjResult
)
||
!
isPersonZwjResult
);
}
// Takes in a support map and determines whether
// the given unicode emoji is supported on the platform.
//
// Combines all the edge case tests into a one-stop shop method
function
isEmojiUnicodeSupported
(
unicodeSupportMap
=
{},
emojiUnicode
,
unicodeVersion
)
{
const
isOlderThanChrome57
=
unicodeSupportMap
.
meta
&&
unicodeSupportMap
.
meta
.
isChrome
&&
unicodeSupportMap
.
meta
.
chromeVersion
<
57
;
// For comments about each scenario, see the comments above each individual respective function
return
unicodeSupportMap
[
unicodeVersion
]
&&
!
(
isOlderThanChrome57
&&
isKeycapEmoji
(
emojiUnicode
))
&&
checkFlagEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
)
&&
checkSkinToneModifierSupport
(
unicodeSupportMap
,
emojiUnicode
)
&&
checkHorseRacingSkinToneComboEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
)
&&
checkPersonEmojiSupport
(
unicodeSupportMap
,
emojiUnicode
);
}
export
{
isEmojiUnicodeSupported
,
isFlagEmoji
,
isKeycapEmoji
,
isSkinToneComboEmoji
,
isHorceRacingSkinToneComboEmoji
,
isPersonZwjEmoji
,
};
app/assets/javascripts/behaviors/gl_emoji/spread_string.js
View file @
ee993014
...
@@ -47,4 +47,4 @@ function spreadString(str) {
...
@@ -47,4 +47,4 @@ function spreadString(str) {
return
arr
;
return
arr
;
}
}
module
.
exports
=
spreadString
;
export
default
spreadString
;
app/assets/javascripts/behaviors/gl_emoji/unicode_support_map.js
View file @
ee993014
...
@@ -68,7 +68,7 @@ const chromeVersion = chromeMatches && chromeMatches[1] && parseInt(chromeMatche
...
@@ -68,7 +68,7 @@ const chromeVersion = chromeMatches && chromeMatches[1] && parseInt(chromeMatche
// See 32px, https://i.imgur.com/htY6Zym.png
// See 32px, https://i.imgur.com/htY6Zym.png
// See 16px, https://i.imgur.com/FPPsIF8.png
// See 16px, https://i.imgur.com/FPPsIF8.png
const
fontSize
=
16
;
const
fontSize
=
16
;
function
test
UnicodeSupportMap
(
testMap
)
{
function
generate
UnicodeSupportMap
(
testMap
)
{
const
testMapKeys
=
Object
.
keys
(
testMap
);
const
testMapKeys
=
Object
.
keys
(
testMap
);
const
numTestEntries
=
testMapKeys
const
numTestEntries
=
testMapKeys
.
reduce
((
list
,
testKey
)
=>
list
.
concat
(
testMap
[
testKey
]),
[]).
length
;
.
reduce
((
list
,
testKey
)
=>
list
.
concat
(
testMap
[
testKey
]),
[]).
length
;
...
@@ -138,17 +138,24 @@ function testUnicodeSupportMap(testMap) {
...
@@ -138,17 +138,24 @@ function testUnicodeSupportMap(testMap) {
return
resultMap
;
return
resultMap
;
}
}
let
unicodeSupportMap
;
function
getUnicodeSupportMap
()
{
const
userAgentFromCache
=
window
.
localStorage
.
getItem
(
'
gl-emoji-user-agent
'
);
let
unicodeSupportMap
;
try
{
const
userAgentFromCache
=
window
.
localStorage
.
getItem
(
'
gl-emoji-user-agent
'
);
unicodeSupportMap
=
JSON
.
parse
(
window
.
localStorage
.
getItem
(
'
gl-emoji-unicode-support-map
'
));
try
{
}
catch
(
err
)
{
unicodeSupportMap
=
JSON
.
parse
(
window
.
localStorage
.
getItem
(
'
gl-emoji-unicode-support-map
'
));
// swallow
}
catch
(
err
)
{
}
// swallow
if
(
!
unicodeSupportMap
||
userAgentFromCache
!==
navigator
.
userAgent
)
{
}
unicodeSupportMap
=
testUnicodeSupportMap
(
unicodeSupportTestMap
);
if
(
!
unicodeSupportMap
||
userAgentFromCache
!==
navigator
.
userAgent
)
{
window
.
localStorage
.
setItem
(
'
gl-emoji-user-agent
'
,
navigator
.
userAgent
);
unicodeSupportMap
=
generateUnicodeSupportMap
(
unicodeSupportTestMap
);
window
.
localStorage
.
setItem
(
'
gl-emoji-unicode-support-map
'
,
JSON
.
stringify
(
unicodeSupportMap
));
window
.
localStorage
.
setItem
(
'
gl-emoji-user-agent
'
,
navigator
.
userAgent
);
window
.
localStorage
.
setItem
(
'
gl-emoji-unicode-support-map
'
,
JSON
.
stringify
(
unicodeSupportMap
));
}
return
unicodeSupportMap
;
}
}
module
.
exports
=
unicodeSupportMap
;
export
{
getUnicodeSupportMap
,
generateUnicodeSupportMap
,
};
app/assets/javascripts/extensions/string.js
View file @
ee993014
require
(
'
string.prototype.codepointat
'
)
;
import
'
string.prototype.codepointat
'
;
require
(
'
string.fromcodepoint
'
)
;
import
'
string.fromcodepoint
'
;
app/assets/javascripts/gfm_auto_complete.js
View file @
ee993014
/* eslint-disable func-names, space-before-function-paren, no-template-curly-in-string, comma-dangle, object-shorthand, quotes, dot-notation, no-else-return, one-var, no-var, no-underscore-dangle, one-var-declaration-per-line, no-param-reassign, no-useless-escape, prefer-template, consistent-return, wrap-iife, prefer-arrow-callback, camelcase, no-unused-vars, no-useless-return, vars-on-top, max-len */
/* eslint-disable func-names, space-before-function-paren, no-template-curly-in-string, comma-dangle, object-shorthand, quotes, dot-notation, no-else-return, one-var, no-var, no-underscore-dangle, one-var-declaration-per-line, no-param-reassign, no-useless-escape, prefer-template, consistent-return, wrap-iife, prefer-arrow-callback, camelcase, no-unused-vars, no-useless-return, vars-on-top, max-len */
const
emojiMap
=
require
(
'
emoji-map
'
);
import
emojiMap
from
'
emojis/digests.json
'
;
const
emojiAliases
=
require
(
'
emoji-aliases
'
);
import
emojiAliases
from
'
emojis/aliases.json
'
;
const
glEmoji
=
require
(
'
./behaviors/gl_emoji
'
);
import
{
glEmojiTag
}
from
'
~/behaviors/gl_emoji
'
;
const
glEmojiTag
=
glEmoji
.
glEmojiTag
;
// Creates the variables for setting up GFM auto-completion
// Creates the variables for setting up GFM auto-completion
(
function
()
{
(
function
()
{
...
...
app/assets/javascripts/main.js
View file @
ee993014
/* eslint-disable func-names, space-before-function-paren, no-var, quotes, consistent-return, prefer-arrow-callback, comma-dangle, object-shorthand, no-new, max-len, no-multi-spaces, import/newline-after-import */
/* eslint-disable func-names, space-before-function-paren, no-var, quotes, consistent-return, prefer-arrow-callback, comma-dangle, object-shorthand, no-new, max-len, no-multi-spaces, import/newline-after-import
, import/first
*/
/* global bp */
/* global bp */
/* global Cookies */
/* global Cookies */
/* global Flash */
/* global Flash */
...
@@ -13,19 +13,20 @@ import Dropzone from 'dropzone';
...
@@ -13,19 +13,20 @@ import Dropzone from 'dropzone';
import
Sortable
from
'
vendor/Sortable
'
;
import
Sortable
from
'
vendor/Sortable
'
;
// libraries with import side-effects
// libraries with import side-effects
require
(
'
mousetrap
'
)
;
import
'
mousetrap
'
;
require
(
'
mousetrap/plugins/pause/mousetrap-pause
'
)
;
import
'
mousetrap/plugins/pause/mousetrap-pause
'
;
require
(
'
vendor/fuzzaldrin-plus
'
)
;
import
'
vendor/fuzzaldrin-plus
'
;
require
(
'
es6-promise
'
).
polyfill
()
;
import
promisePolyfill
from
'
es6-promise
'
;
// extensions
// extensions
require
(
'
./extensions/string
'
);
import
'
./extensions/string
'
;
require
(
'
./extensions/array
'
);
import
'
./extensions/array
'
;
require
(
'
./extensions/custom_event
'
);
import
'
./extensions/custom_event
'
;
require
(
'
./extensions/element
'
);
import
'
./extensions/element
'
;
require
(
'
./extensions/jquery
'
);
import
'
./extensions/jquery
'
;
require
(
'
./extensions/object
'
);
import
'
./extensions/object
'
;
require
(
'
es6-promise
'
).
polyfill
();
promisePolyfill
.
polyfill
();
// expose common libraries as globals (TODO: remove these)
// expose common libraries as globals (TODO: remove these)
window
.
jQuery
=
jQuery
;
window
.
jQuery
=
jQuery
;
...
@@ -37,174 +38,171 @@ window.Dropzone = Dropzone;
...
@@ -37,174 +38,171 @@ window.Dropzone = Dropzone;
window
.
Sortable
=
Sortable
;
window
.
Sortable
=
Sortable
;
// shortcuts
// shortcuts
require
(
'
./shortcuts
'
);
import
'
./shortcuts
'
;
require
(
'
./shortcuts_navigation
'
);
import
'
./shortcuts_blob
'
;
require
(
'
./shortcuts_dashboard_navigation
'
);
import
'
./shortcuts_dashboard_navigation
'
;
require
(
'
./shortcuts_issuable
'
);
import
'
./shortcuts_navigation
'
;
require
(
'
./shortcuts_network
'
);
import
'
./shortcuts_find_file
'
;
import
'
./shortcuts_issuable
'
;
import
'
./shortcuts_network
'
;
// behaviors
// behaviors
require
(
'
./behaviors/autosize
'
);
import
'
./behaviors/autosize
'
;
require
(
'
./behaviors/details_behavior
'
);
import
'
./behaviors/details_behavior
'
;
require
(
'
./behaviors/quick_submit
'
);
import
'
./behaviors/quick_submit
'
;
require
(
'
./behaviors/requires_input
'
);
import
'
./behaviors/requires_input
'
;
require
(
'
./behaviors/toggler_behavior
'
);
import
'
./behaviors/toggler_behavior
'
;
require
(
'
./behaviors/bind_in_out
'
);
import
'
./behaviors/bind_in_out
'
;
import
{
installGlEmojiElement
}
from
'
./behaviors/gl_emoji
'
;
installGlEmojiElement
();
// blob
// blob
require
(
'
./blob/blob_ci_yaml
'
)
;
import
'
./blob/blob_ci_yaml
'
;
require
(
'
./blob/blob_dockerfile_selector
'
)
;
import
'
./blob/blob_dockerfile_selector
'
;
require
(
'
./blob/blob_dockerfile_selectors
'
)
;
import
'
./blob/blob_dockerfile_selectors
'
;
require
(
'
./blob/blob_file_dropzone
'
)
;
import
'
./blob/blob_file_dropzone
'
;
require
(
'
./blob/blob_gitignore_selector
'
)
;
import
'
./blob/blob_gitignore_selector
'
;
require
(
'
./blob/blob_gitignore_selectors
'
)
;
import
'
./blob/blob_gitignore_selectors
'
;
require
(
'
./blob/blob_license_selector
'
)
;
import
'
./blob/blob_license_selector
'
;
require
(
'
./blob/blob_license_selectors
'
)
;
import
'
./blob/blob_license_selectors
'
;
require
(
'
./blob/template_selector
'
)
;
import
'
./blob/template_selector
'
;
// templates
// templates
require
(
'
./templates/issuable_template_selector
'
)
;
import
'
./templates/issuable_template_selector
'
;
require
(
'
./templates/issuable_template_selectors
'
)
;
import
'
./templates/issuable_template_selectors
'
;
// commit
// commit
require
(
'
./commit/file.js
'
)
;
import
'
./commit/file
'
;
require
(
'
./commit/image_file.js
'
)
;
import
'
./commit/image_file
'
;
// lib/utils
// lib/utils
require
(
'
./lib/utils/animate
'
)
;
import
'
./lib/utils/animate
'
;
require
(
'
./lib/utils/bootstrap_linked_tabs
'
)
;
import
'
./lib/utils/bootstrap_linked_tabs
'
;
require
(
'
./lib/utils/common_utils
'
)
;
import
'
./lib/utils/common_utils
'
;
require
(
'
./lib/utils/datetime_utility
'
)
;
import
'
./lib/utils/datetime_utility
'
;
require
(
'
./lib/utils/notify
'
)
;
import
'
./lib/utils/notify
'
;
require
(
'
./lib/utils/pretty_time
'
)
;
import
'
./lib/utils/pretty_time
'
;
require
(
'
./lib/utils/text_utility
'
)
;
import
'
./lib/utils/text_utility
'
;
require
(
'
./lib/utils/type_utility
'
)
;
import
'
./lib/utils/type_utility
'
;
require
(
'
./lib/utils/url_utility
'
)
;
import
'
./lib/utils/url_utility
'
;
// u2f
// u2f
require
(
'
./u2f/authenticate
'
)
;
import
'
./u2f/authenticate
'
;
require
(
'
./u2f/error
'
)
;
import
'
./u2f/error
'
;
require
(
'
./u2f/register
'
)
;
import
'
./u2f/register
'
;
require
(
'
./u2f/util
'
)
;
import
'
./u2f/util
'
;
// droplab
// droplab
require
(
'
./droplab/droplab
'
)
;
import
'
./droplab/droplab
'
;
require
(
'
./droplab/droplab_ajax
'
)
;
import
'
./droplab/droplab_ajax
'
;
require
(
'
./droplab/droplab_ajax_filter
'
)
;
import
'
./droplab/droplab_ajax_filter
'
;
require
(
'
./droplab/droplab_filter
'
)
;
import
'
./droplab/droplab_filter
'
;
// everything else
// everything else
require
(
'
./abuse_reports
'
);
import
'
./abuse_reports
'
;
require
(
'
./activities
'
);
import
'
./activities
'
;
require
(
'
./admin
'
);
import
'
./admin
'
;
require
(
'
./ajax_loading_spinner
'
);
import
'
./ajax_loading_spinner
'
;
require
(
'
./api
'
);
import
'
./api
'
;
require
(
'
./aside
'
);
import
'
./aside
'
;
require
(
'
./autosave
'
);
import
'
./autosave
'
;
const
AwardsHandler
=
require
(
'
./awards_handler
'
);
import
AwardsHandler
from
'
./awards_handler
'
;
require
(
'
./breakpoints
'
);
import
'
./breakpoints
'
;
require
(
'
./broadcast_message
'
);
import
'
./broadcast_message
'
;
require
(
'
./build
'
);
import
'
./build
'
;
require
(
'
./build_artifacts
'
);
import
'
./build_artifacts
'
;
require
(
'
./build_variables
'
);
import
'
./build_variables
'
;
require
(
'
./ci_lint_editor
'
);
import
'
./ci_lint_editor
'
;
require
(
'
./commit
'
);
import
'
./commit
'
;
require
(
'
./commits
'
);
import
'
./commits
'
;
require
(
'
./compare
'
);
import
'
./compare
'
;
require
(
'
./compare_autocomplete
'
);
import
'
./compare_autocomplete
'
;
require
(
'
./confirm_danger_modal
'
);
import
'
./confirm_danger_modal
'
;
require
(
'
./copy_as_gfm
'
);
import
'
./copy_as_gfm
'
;
require
(
'
./copy_to_clipboard
'
);
import
'
./copy_to_clipboard
'
;
require
(
'
./create_label
'
);
import
'
./create_label
'
;
require
(
'
./diff
'
);
import
'
./diff
'
;
require
(
'
./dispatcher
'
);
import
'
./dispatcher
'
;
require
(
'
./dropzone_input
'
);
import
'
./dropzone_input
'
;
require
(
'
./due_date_select
'
);
import
'
./due_date_select
'
;
require
(
'
./files_comment_button
'
);
import
'
./files_comment_button
'
;
require
(
'
./flash
'
);
import
'
./flash
'
;
require
(
'
./gfm_auto_complete
'
);
import
'
./gfm_auto_complete
'
;
require
(
'
./gl_dropdown
'
);
import
'
./gl_dropdown
'
;
require
(
'
./gl_field_error
'
);
import
'
./gl_field_error
'
;
require
(
'
./gl_field_errors
'
);
import
'
./gl_field_errors
'
;
require
(
'
./gl_form
'
);
import
'
./gl_form
'
;
require
(
'
./group_avatar
'
);
import
'
./group_avatar
'
;
require
(
'
./group_label_subscription
'
);
import
'
./group_label_subscription
'
;
require
(
'
./groups_select
'
);
import
'
./groups_select
'
;
require
(
'
./header
'
);
import
'
./header
'
;
require
(
'
./importer_status
'
);
import
'
./importer_status
'
;
require
(
'
./issuable
'
);
import
'
./issuable
'
;
require
(
'
./issuable_context
'
);
import
'
./issuable_context
'
;
require
(
'
./issuable_form
'
);
import
'
./issuable_form
'
;
require
(
'
./issue
'
);
import
'
./issue
'
;
require
(
'
./issue_status_select
'
);
import
'
./issue_status_select
'
;
require
(
'
./issues_bulk_assignment
'
);
import
'
./issues_bulk_assignment
'
;
require
(
'
./label_manager
'
);
import
'
./label_manager
'
;
require
(
'
./labels
'
);
import
'
./labels
'
;
require
(
'
./labels_select
'
);
import
'
./labels_select
'
;
require
(
'
./layout_nav
'
);
import
'
./layout_nav
'
;
require
(
'
./line_highlighter
'
);
import
'
./line_highlighter
'
;
require
(
'
./logo
'
);
import
'
./logo
'
;
require
(
'
./member_expiration_date
'
);
import
'
./member_expiration_date
'
;
require
(
'
./members
'
);
import
'
./members
'
;
require
(
'
./merge_request
'
);
import
'
./merge_request
'
;
require
(
'
./merge_request_tabs
'
);
import
'
./merge_request_tabs
'
;
require
(
'
./merge_request_widget
'
);
import
'
./merge_request_widget
'
;
require
(
'
./merged_buttons
'
);
import
'
./merged_buttons
'
;
require
(
'
./milestone
'
);
import
'
./milestone
'
;
require
(
'
./milestone_select
'
);
import
'
./milestone_select
'
;
require
(
'
./mini_pipeline_graph_dropdown
'
);
import
'
./mini_pipeline_graph_dropdown
'
;
require
(
'
./namespace_select
'
);
import
'
./namespace_select
'
;
require
(
'
./new_branch_form
'
);
import
'
./new_branch_form
'
;
require
(
'
./new_commit_form
'
);
import
'
./new_commit_form
'
;
require
(
'
./notes
'
);
import
'
./notes
'
;
require
(
'
./notifications_dropdown
'
);
import
'
./notifications_dropdown
'
;
require
(
'
./notifications_form
'
);
import
'
./notifications_form
'
;
require
(
'
./pager
'
);
import
'
./pager
'
;
require
(
'
./pipelines
'
);
import
'
./pipelines
'
;
require
(
'
./preview_markdown
'
);
import
'
./preview_markdown
'
;
require
(
'
./project
'
);
import
'
./project
'
;
require
(
'
./project_avatar
'
);
import
'
./project_avatar
'
;
require
(
'
./project_find_file
'
);
import
'
./project_find_file
'
;
require
(
'
./project_fork
'
);
import
'
./project_fork
'
;
require
(
'
./project_import
'
);
import
'
./project_import
'
;
require
(
'
./project_label_subscription
'
);
import
'
./project_label_subscription
'
;
require
(
'
./project_new
'
);
import
'
./project_new
'
;
require
(
'
./project_select
'
);
import
'
./project_select
'
;
require
(
'
./project_show
'
);
import
'
./project_show
'
;
require
(
'
./project_variables
'
);
import
'
./project_variables
'
;
require
(
'
./projects_list
'
);
import
'
./projects_list
'
;
require
(
'
./render_gfm
'
);
import
'
./render_gfm
'
;
require
(
'
./render_math
'
);
import
'
./render_math
'
;
require
(
'
./right_sidebar
'
);
import
'
./right_sidebar
'
;
require
(
'
./search
'
);
import
'
./search
'
;
require
(
'
./search_autocomplete
'
);
import
'
./search_autocomplete
'
;
require
(
'
./shortcuts
'
);
import
'
./signin_tabs_memoizer
'
;
require
(
'
./shortcuts_blob
'
);
import
'
./single_file_diff
'
;
require
(
'
./shortcuts_dashboard_navigation
'
);
import
'
./smart_interval
'
;
require
(
'
./shortcuts_find_file
'
);
import
'
./snippets_list
'
;
require
(
'
./shortcuts_issuable
'
);
import
'
./star
'
;
require
(
'
./shortcuts_navigation
'
);
import
'
./subbable_resource
'
;
require
(
'
./shortcuts_network
'
);
import
'
./subscription
'
;
require
(
'
./signin_tabs_memoizer
'
);
import
'
./subscription_select
'
;
require
(
'
./single_file_diff
'
);
import
'
./syntax_highlight
'
;
require
(
'
./smart_interval
'
);
import
'
./task_list
'
;
require
(
'
./snippets_list
'
);
import
'
./todos
'
;
require
(
'
./star
'
);
import
'
./tree
'
;
require
(
'
./subbable_resource
'
);
import
'
./user
'
;
require
(
'
./subscription
'
);
import
'
./user_tabs
'
;
require
(
'
./subscription_select
'
);
import
'
./username_validator
'
;
require
(
'
./syntax_highlight
'
);
import
'
./users_select
'
;
require
(
'
./task_list
'
);
import
'
./version_check_image
'
;
require
(
'
./todos
'
);
import
'
./visibility_select
'
;
require
(
'
./tree
'
);
import
'
./wikis
'
;
require
(
'
./user
'
);
import
'
./zen_mode
'
;
require
(
'
./user_tabs
'
);
require
(
'
./username_validator
'
);
require
(
'
./users_select
'
);
require
(
'
./version_check_image
'
);
require
(
'
./visibility_select
'
);
require
(
'
./wikis
'
);
require
(
'
./zen_mode
'
);
(
function
()
{
(
function
()
{
document
.
addEventListener
(
'
beforeunload
'
,
function
()
{
document
.
addEventListener
(
'
beforeunload
'
,
function
()
{
...
...
config/webpack.config.js
View file @
ee993014
...
@@ -132,8 +132,7 @@ var config = {
...
@@ -132,8 +132,7 @@ var config = {
extensions
:
[
'
.js
'
,
'
.es6
'
,
'
.js.es6
'
],
extensions
:
[
'
.js
'
,
'
.es6
'
,
'
.js.es6
'
],
alias
:
{
alias
:
{
'
~
'
:
path
.
join
(
ROOT_PATH
,
'
app/assets/javascripts
'
),
'
~
'
:
path
.
join
(
ROOT_PATH
,
'
app/assets/javascripts
'
),
'
emoji-map$
'
:
path
.
join
(
ROOT_PATH
,
'
fixtures/emojis/digests.json
'
),
'
emojis
'
:
path
.
join
(
ROOT_PATH
,
'
fixtures/emojis
'
),
'
emoji-aliases$
'
:
path
.
join
(
ROOT_PATH
,
'
fixtures/emojis/aliases.json
'
),
'
empty_states
'
:
path
.
join
(
ROOT_PATH
,
'
app/views/shared/empty_states
'
),
'
empty_states
'
:
path
.
join
(
ROOT_PATH
,
'
app/views/shared/empty_states
'
),
'
icons
'
:
path
.
join
(
ROOT_PATH
,
'
app/views/shared/icons
'
),
'
icons
'
:
path
.
join
(
ROOT_PATH
,
'
app/views/shared/icons
'
),
'
vendor
'
:
path
.
join
(
ROOT_PATH
,
'
vendor/assets/javascripts
'
),
'
vendor
'
:
path
.
join
(
ROOT_PATH
,
'
vendor/assets/javascripts
'
),
...
...
spec/javascripts/awards_handler_spec.js
View file @
ee993014
/* eslint-disable space-before-function-paren, no-var, one-var, one-var-declaration-per-line, no-unused-expressions, comma-dangle, new-parens, no-unused-vars, quotes, jasmine/no-spec-dupes, prefer-template, max-len */
/* eslint-disable space-before-function-paren, no-var, one-var, one-var-declaration-per-line, no-unused-expressions, comma-dangle, new-parens, no-unused-vars, quotes, jasmine/no-spec-dupes, prefer-template, max-len */
require
(
'
es6-promise
'
).
polyfill
();
import
promisePolyfill
from
'
es6-promise
'
;
import
AwardsHandler
from
'
~/awards_handler
'
;
const
AwardsHandler
=
require
(
'
~/awards_handler
'
);
promisePolyfill
.
polyfill
(
);
(
function
()
{
(
function
()
{
var
awardsHandler
,
lazyAssert
,
urlRoot
,
openAndWaitForEmojiMenu
;
var
awardsHandler
,
lazyAssert
,
urlRoot
,
openAndWaitForEmojiMenu
;
...
...
spec/javascripts/gl_emoji_spec.js
View file @
ee993014
import
'
~/extensions/string
'
;
import
'
~/extensions/array
'
;
require
(
'
~/extensions/string
'
);
import
{
glEmojiTag
}
from
'
~/behaviors/gl_emoji
'
;
require
(
'
~/extensions/array
'
);
import
{
isEmojiUnicodeSupported
,
const
glEmoji
=
require
(
'
~/behaviors/gl_emoji
'
);
isFlagEmoji
,
isKeycapEmoji
,
const
glEmojiTag
=
glEmoji
.
glEmojiTag
;
isSkinToneComboEmoji
,
const
isEmojiUnicodeSupported
=
glEmoji
.
isEmojiUnicodeSupported
;
isHorceRacingSkinToneComboEmoji
,
const
isFlagEmoji
=
glEmoji
.
isFlagEmoji
;
isPersonZwjEmoji
,
const
isKeycapEmoji
=
glEmoji
.
isKeycapEmoji
;
}
from
'
~/behaviors/gl_emoji/is_emoji_unicode_supported
'
;
const
isSkinToneComboEmoji
=
glEmoji
.
isSkinToneComboEmoji
;
const
isHorceRacingSkinToneComboEmoji
=
glEmoji
.
isHorceRacingSkinToneComboEmoji
;
const
isPersonZwjEmoji
=
glEmoji
.
isPersonZwjEmoji
;
const
emptySupportMap
=
{
const
emptySupportMap
=
{
personZwj
:
false
,
personZwj
:
false
,
...
...
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