Skip to content

Commit 6956d5d

Browse files
gnpricechrisbobbe
authored andcommitted
content: Use className regexp for Unicode emoji, instead of class set
And add another test for more complete coverage. This removes our last use of the `classes` class set, so it completes #497. Fixes: #497
1 parent efb25c7 commit 6956d5d

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

lib/model/content.dart

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,11 @@ class _ZulipContentParser {
639639
return RegExp("^(?:$mentionClass(?: silent)?|silent $mentionClass)\$");
640640
}();
641641

642-
static final _emojiClassRegexp = RegExp(r"^emoji(?:-[0-9a-f]+)*$");
642+
static final _emojiClassNameRegexp = () {
643+
const specificEmoji = r"emoji(?:-[0-9a-f]+)+";
644+
return RegExp("^(?:emoji $specificEmoji|$specificEmoji emoji)\$");
645+
}();
646+
static final _emojiCodeFromClassNameRegexp = RegExp(r"emoji-([^ ]+)");
643647

644648
InlineContentNode parseInlineContent(dom.Node node) {
645649
assert(_debugParserContext == _ParserContext.inline);
@@ -655,7 +659,6 @@ class _ZulipContentParser {
655659

656660
final element = node;
657661
final localName = element.localName;
658-
final classes = element.classes;
659662
final className = element.className;
660663
List<InlineContentNode> nodes() => parseInlineContentList(element.nodes);
661664

@@ -691,14 +694,9 @@ class _ZulipContentParser {
691694
}
692695

693696
if (localName == 'span'
694-
&& classes.length == 2
695-
&& classes.contains('emoji')
696-
&& classes.every(_emojiClassRegexp.hasMatch)) {
697-
final emojiCode = classes
698-
.firstWhere((className) => className.startsWith('emoji-'))
699-
.replaceFirst('emoji-', '');
700-
assert(emojiCode.isNotEmpty);
701-
697+
&& _emojiClassNameRegexp.hasMatch(className)) {
698+
final emojiCode = _emojiCodeFromClassNameRegexp.firstMatch(className)!
699+
.group(1)!;
702700
final unicode = tryParseEmojiCodeToUnicode(emojiCode);
703701
if (unicode == null) return unimplemented();
704702
return UnicodeEmojiNode(emojiUnicode: unicode, debugHtmlNode: debugHtmlNode);

test/model/content_test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ void main() {
166166
'<p><span aria-label="thumbs up" class="emoji emoji-1f44d" role="img" title="thumbs up">:thumbs_up:</span></p>',
167167
const UnicodeEmojiNode(emojiUnicode: '\u{1f44d}')); // "👍"
168168

169+
testParseInline('parse Unicode emoji, encoded in span element, class order reversed',
170+
// ":thumbs_up:" (hypothetical server variation)
171+
'<p><span aria-label="thumbs up" class="emoji-1f44d emoji" role="img" title="thumbs up">:thumbs_up:</span></p>',
172+
const UnicodeEmojiNode(emojiUnicode: '\u{1f44d}')); // "👍"
173+
169174
testParseInline('parse Unicode emoji, encoded in span element, multiple codepoints',
170175
// ":transgender_flag:"
171176
'<p><span aria-label="transgender flag" class="emoji emoji-1f3f3-fe0f-200d-26a7-fe0f" role="img" title="transgender flag">:transgender_flag:</span></p>',

0 commit comments

Comments
 (0)