Skip to content

Commit 1788ae5

Browse files
Khader-1gnprice
authored andcommitted
content: Handle strike-through
This add the implementation of Strike-Through '~~text~~' or the <del> element. It's implemented with a new 'DeletedNode' and it's design implementation. Fixes: #357
1 parent e6c531a commit 1788ae5

3 files changed

Lines changed: 42 additions & 21 deletions

File tree

lib/model/content.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,10 @@ class StrongNode extends InlineContainerNode {
450450
const StrongNode({super.debugHtmlNode, required super.nodes});
451451
}
452452

453+
class DeletedNode extends InlineContainerNode {
454+
const DeletedNode({super.debugHtmlNode, required super.nodes});
455+
}
456+
453457
class EmphasisNode extends InlineContainerNode {
454458
const EmphasisNode({super.debugHtmlNode, required super.nodes});
455459
}
@@ -717,6 +721,9 @@ class _ZulipContentParser {
717721
if (localName == 'strong' && className.isEmpty) {
718722
return StrongNode(nodes: nodes(), debugHtmlNode: debugHtmlNode);
719723
}
724+
if (localName == 'del' && className.isEmpty) {
725+
return DeletedNode(nodes: nodes(), debugHtmlNode: debugHtmlNode);
726+
}
720727
if (localName == 'em' && className.isEmpty) {
721728
return EmphasisNode(nodes: nodes(), debugHtmlNode: debugHtmlNode);
722729
}

lib/widgets/content.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,8 @@ class _InlineContentBuilder {
622622
return const TextSpan(text: "");
623623
} else if (node is StrongNode) {
624624
return _buildStrong(node);
625+
} else if (node is DeletedNode) {
626+
return _buildDeleted(node);
625627
} else if (node is EmphasisNode) {
626628
return _buildEmphasis(node);
627629
} else if (node is LinkNode) {
@@ -653,6 +655,9 @@ class _InlineContentBuilder {
653655
InlineSpan _buildStrong(StrongNode node) => _buildNodes(node.nodes,
654656
style: weightVariableTextStyle(_context, wght: 600, wghtIfPlatformRequestsBold: 900));
655657

658+
InlineSpan _buildDeleted(DeletedNode node) => _buildNodes(node.nodes,
659+
style: const TextStyle(decoration: TextDecoration.lineThrough));
660+
656661
InlineSpan _buildEmphasis(EmphasisNode node) => _buildNodes(node.nodes,
657662
style: const TextStyle(fontStyle: FontStyle.italic));
658663

test/model/content_test.dart

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,11 @@ void main() {
580580
'<p><strong>bold</strong></p>',
581581
const StrongNode(nodes: [TextNode('bold')]));
582582

583+
testParseInline('parse deleted/strike-through',
584+
// "~~strike through~~"
585+
'<p><del>strike through</del></p>',
586+
const DeletedNode(nodes: [TextNode('strike through')]));
587+
583588
testParseInline('parse emphasis/italic',
584589
// "*italic*"
585590
'<p><em>italic</em></p>',
@@ -590,11 +595,12 @@ void main() {
590595
'<p><code>inline code</code></p>',
591596
const InlineCodeNode(nodes: [TextNode('inline code')]));
592597

593-
testParseInline('parse nested strong, em, code',
594-
// "***`word`***"
595-
'<p><strong><em><code>word</code></em></strong></p>',
596-
const StrongNode(nodes: [EmphasisNode(nodes: [InlineCodeNode(nodes: [
597-
TextNode('word')])])]));
598+
testParseInline('parse nested del, strong, em, code',
599+
// "~~***`word`***~~"
600+
'<p><del><strong><em><code>word</code></em></strong></del></p>',
601+
const DeletedNode(
602+
nodes: [StrongNode(nodes: [EmphasisNode(nodes: [InlineCodeNode(nodes: [
603+
TextNode('word')])])])]));
598604

599605
group('LinkNode', () {
600606
testParseInline('parse link',
@@ -618,19 +624,21 @@ void main() {
618624
nodes: [TextNode('#mobile-team > zulip-flutter')]));
619625
});
620626

621-
testParseInline('parse nested link, strong, em, code',
622-
// "[***`word`***](https://example/)"
623-
'<p><a href="https://example/"><strong><em><code>word'
624-
'</code></em></strong></a></p>',
627+
testParseInline('parse nested link, del, strong, em, code',
628+
// "[~~***`word`***~~](https://example/)"
629+
'<p><a href="https://example/"><del><strong><em><code>word'
630+
'</code></em></strong></del></a></p>',
625631
const LinkNode(url: 'https://example/',
626-
nodes: [StrongNode(nodes: [EmphasisNode(nodes: [InlineCodeNode(nodes: [
627-
TextNode('word')])])])]));
632+
nodes: [DeletedNode(nodes: [
633+
StrongNode(nodes: [EmphasisNode(nodes: [InlineCodeNode(nodes: [
634+
TextNode('word')])])])])]));
628635

629-
testParseInline('parse nested strong, em, link',
630-
// "***[t](/u)***"
631-
'<p><strong><em><a href="/u">t</a></em></strong></p>',
632-
const StrongNode(nodes: [EmphasisNode(nodes: [LinkNode(url: '/u',
633-
nodes: [TextNode('t')])])]));
636+
testParseInline('parse nested del, strong, em, link',
637+
// "~~***[t](/u)***~~"
638+
'<p><del><strong><em><a href="/u">t</a></em></strong></del></p>',
639+
const DeletedNode(
640+
nodes: [StrongNode(nodes: [EmphasisNode(nodes: [LinkNode(url: '/u',
641+
nodes: [TextNode('t')])])])]));
634642

635643
group('parse @-mentions', () {
636644
testParseInline('plain user @-mention',
@@ -727,14 +735,15 @@ void main() {
727735
HeadingNode(level: HeadingLevel.h6, links: null, nodes: [TextNode('six')])]);
728736

729737
testParse('containing inline markup',
730-
// "###### one [***`two`***](https://example/)"
731-
'<h6>one <a href="https://example/"><strong><em><code>two'
732-
'</code></em></strong></a></h6>', const [
738+
// "###### one [**~~*`two`*~~**](https://example/)"
739+
'<h6>one <a href="https://example/"><strong><del><em><code>two'
740+
'</code></em></del></strong></a></h6>', const [
733741
HeadingNode(level: HeadingLevel.h6, links: null, nodes: [
734742
TextNode('one '),
735743
LinkNode(url: 'https://example/',
736-
nodes: [StrongNode(nodes: [EmphasisNode(nodes: [
737-
InlineCodeNode(nodes: [TextNode('two')])])])]),
744+
nodes: [StrongNode(
745+
nodes: [DeletedNode( nodes: [EmphasisNode(nodes: [
746+
InlineCodeNode(nodes: [TextNode('two')])])])])]),
738747
])]);
739748

740749
testParse('amidst paragraphs',

0 commit comments

Comments
 (0)