Skip to content

Commit 4c94547

Browse files
committed
content: Save some work by avoiding classes.contains in many cases
It turns out that `classes.contains` instantiates a Set every time it's called. That's unfortunate. So, remove some of this work by just checking the class string (`className`) directly, in the case where we expect just one class. When we expect two or more classes, we'll want a check that doesn't enforce a particular order, so perhaps we'll use a regular expression for those, or something, in later work. See #497. Fixes-partly: #497
1 parent b4a111f commit 4c94547

File tree

1 file changed

+14
-29
lines changed

1 file changed

+14
-29
lines changed

lib/model/content.dart

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -577,22 +577,17 @@ class _ZulipContentParser {
577577

578578
final dom.Element katexElement;
579579
if (!block) {
580-
assert(element.localName == 'span'
581-
&& element.classes.length == 1
582-
&& element.classes.contains('katex'));
580+
assert(element.localName == 'span' && element.className == 'katex');
583581

584582
katexElement = element;
585583
} else {
586-
assert(element.localName == 'span'
587-
&& element.classes.length == 1
588-
&& element.classes.contains('katex-display'));
584+
assert(element.localName == 'span' && element.className == 'katex-display');
589585

590586
if (element.nodes.length != 1) return null;
591587
final child = element.nodes.single;
592588
if (child is! dom.Element) return null;
593589
if (child.localName != 'span') return null;
594-
if (child.classes.length != 1) return null;
595-
if (!child.classes.contains('katex')) return null;
590+
if (child.className != 'katex') return null;
596591
katexElement = child;
597592
}
598593

@@ -602,8 +597,7 @@ class _ZulipContentParser {
602597
final child = katexElement.nodes.first;
603598
if (child is! dom.Element) return null;
604599
if (child.localName != 'span') return null;
605-
if (child.classes.length != 1) return null;
606-
if (!child.classes.contains('katex-mathml')) return null;
600+
if (child.className != 'katex-mathml') return null;
607601

608602
if (child.nodes.length != 1) return null;
609603
final grandchild = child.nodes.single;
@@ -655,6 +649,7 @@ class _ZulipContentParser {
655649
final element = node;
656650
final localName = element.localName;
657651
final classes = element.classes;
652+
final className = element.className;
658653
List<InlineContentNode> nodes() => parseInlineContentList(element.nodes);
659654

660655
if (localName == 'br' && classes.isEmpty) {
@@ -672,9 +667,7 @@ class _ZulipContentParser {
672667

673668
if (localName == 'a'
674669
&& (classes.isEmpty
675-
|| (classes.length == 1
676-
&& (classes.contains('stream-topic')
677-
|| classes.contains('stream'))))) {
670+
|| (className == 'stream-topic' || className == 'stream'))) {
678671
final href = element.attributes['href'];
679672
if (href == null) return unimplemented();
680673
final link = LinkNode(nodes: nodes(), url: href, debugHtmlNode: debugHtmlNode);
@@ -707,19 +700,15 @@ class _ZulipContentParser {
707700
return UnicodeEmojiNode(emojiUnicode: unicode, debugHtmlNode: debugHtmlNode);
708701
}
709702

710-
if (localName == 'img'
711-
&& classes.contains('emoji')
712-
&& classes.length == 1) {
703+
if (localName == 'img' && className == 'emoji') {
713704
final alt = element.attributes['alt'];
714705
if (alt == null) return unimplemented();
715706
final src = element.attributes['src'];
716707
if (src == null) return unimplemented();
717708
return ImageEmojiNode(src: src, alt: alt, debugHtmlNode: debugHtmlNode);
718709
}
719710

720-
if (localName == 'span'
721-
&& classes.length == 1
722-
&& classes.contains('katex')) {
711+
if (localName == 'span' && className == 'katex') {
723712
final texSource = parseMath(element, block: false);
724713
if (texSource == null) return unimplemented();
725714
return MathInlineNode(texSource: texSource, debugHtmlNode: debugHtmlNode);
@@ -775,8 +764,7 @@ class _ZulipContentParser {
775764
assert(_debugParserContext == _ParserContext.block);
776765
final mainElement = () {
777766
assert(divElement.localName == 'div'
778-
&& divElement.classes.length == 1
779-
&& divElement.classes.contains("codehilite"));
767+
&& divElement.className == "codehilite");
780768

781769
if (divElement.nodes.length != 1) return null;
782770
final child = divElement.nodes[0];
@@ -848,8 +836,7 @@ class _ZulipContentParser {
848836
assert(_debugParserContext == _ParserContext.block);
849837
final imgElement = () {
850838
assert(divElement.localName == 'div'
851-
&& divElement.classes.length == 1
852-
&& divElement.classes.contains('message_inline_image'));
839+
&& divElement.className == 'message_inline_image');
853840

854841
if (divElement.nodes.length != 1) return null;
855842
final child = divElement.nodes[0];
@@ -886,6 +873,7 @@ class _ZulipContentParser {
886873
}
887874
final element = node;
888875
final localName = element.localName;
876+
final className = element.className;
889877
final classes = element.classes;
890878

891879
if (localName == 'br' && classes.isEmpty) {
@@ -895,8 +883,7 @@ class _ZulipContentParser {
895883
if (localName == 'p' && classes.isEmpty) {
896884
// Oddly, the way a math block gets encoded in Zulip HTML is inside a <p>.
897885
if (element.nodes case [dom.Element(localName: 'span') && var child, ...]) {
898-
if (child.classes.length == 1
899-
&& child.classes.contains('katex-display')) {
886+
if (child.className == 'katex-display') {
900887
if (element.nodes case [_]
901888
|| [_, dom.Element(localName: 'br'),
902889
dom.Text(text: "\n")]) {
@@ -943,13 +930,11 @@ class _ZulipContentParser {
943930
parseBlockContentList(element.nodes));
944931
}
945932

946-
if (localName == 'div'
947-
&& classes.length == 1 && classes.contains('codehilite')) {
933+
if (localName == 'div' && className == 'codehilite') {
948934
return parseCodeBlock(element);
949935
}
950936

951-
if (localName == 'div'
952-
&& classes.length == 1 && classes.contains('message_inline_image')) {
937+
if (localName == 'div' && className == 'message_inline_image') {
953938
return parseImageNode(element);
954939
}
955940

0 commit comments

Comments
 (0)