Skip to content

Commit 410886c

Browse files
authored
Revert changes made in PR flutter#235 (flutter#264)
1 parent 8264633 commit 410886c

File tree

2 files changed

+54
-30
lines changed

2 files changed

+54
-30
lines changed

packages/flutter_markdown/lib/src/widget.dart

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import 'dart:convert';
6+
57
import 'package:flutter/cupertino.dart';
68
import 'package:flutter/gestures.dart';
79
import 'package:flutter/material.dart';
@@ -200,19 +202,20 @@ class _MarkdownWidgetState extends State<MarkdownWidget>
200202

201203
_disposeRecognizers();
202204

203-
/// FIXME: Enhance it using a single RegEx
204-
final List<String> lines = widget.data
205-
.replaceAll(RegExp(r'[ ]{2}(\r?\n)'), ' &amp;')
206-
.split(RegExp(r'\r?\n'))
207-
.map((e) => e?.replaceAll(RegExp(r' &amp;'), ' \n'))
208-
.toList();
209205
final md.Document document = md.Document(
210206
extensionSet: widget.extensionSet ?? md.ExtensionSet.gitHubFlavored,
211207
inlineSyntaxes: (widget.extensionSet?.inlineSyntaxes ?? [])
212208
..add(TaskListSyntax())
213209
..map((syntax) => syntax),
214210
encodeHtml: false,
215211
);
212+
213+
// Parse the source Markdown data into nodes of an Abstract Syntax Tree.
214+
final List<String> lines = LineSplitter().convert(widget.data);
215+
final List<md.Node> astNodes = document.parseLines(lines);
216+
217+
// Configure a Markdown widget builder to traverse the AST nodes and
218+
// create a widget tree based on the elements.
216219
final MarkdownBuilder builder = MarkdownBuilder(
217220
delegate: this,
218221
selectable: widget.selectable,
@@ -223,7 +226,8 @@ class _MarkdownWidgetState extends State<MarkdownWidget>
223226
builders: widget.builders,
224227
fitContent: widget.fitContent,
225228
);
226-
_children = builder.build(document.parseLines(lines));
229+
230+
_children = builder.build(astNodes);
227231
}
228232

229233
void _disposeRecognizers() {

packages/flutter_markdown/test/flutter_markdown_test.dart

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -70,34 +70,54 @@ void main() {
7070
_expectTextStrings(widgets, <String>['strikethrough']);
7171
});
7272

73-
testWidgets('Single line break', (WidgetTester tester) async {
74-
await tester
75-
.pumpWidget(_boilerplate(const MarkdownBody(data: 'line 1 \nline 2')));
73+
group('Line Breaks', () {
74+
testWidgets(
75+
// Example 654 from the GitHub Flavored Markdown specification.
76+
'Two spaces at end of line inside a block element',
77+
(WidgetTester tester) async {
78+
await tester.pumpWidget(
79+
_boilerplate(const MarkdownBody(data: 'line 1 \nline 2')));
80+
81+
final Iterable<Widget> widgets = tester.allWidgets;
82+
_expectWidgetTypes(widgets,
83+
<Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
84+
_expectTextStrings(widgets, <String>['line 1\nline 2']);
85+
},
86+
);
7687

77-
final Iterable<Widget> widgets = tester.allWidgets;
78-
_expectWidgetTypes(
79-
widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
80-
_expectTextStrings(widgets, <String>['line 1\nline 2']);
81-
});
88+
testWidgets(
89+
// Example 655 from the GitHub Flavored Markdown specification.
90+
'Backslash at end of line inside a block element',
91+
(WidgetTester tester) async {
92+
await tester.pumpWidget(
93+
_boilerplate(const MarkdownBody(data: 'line 1\\\nline 2')));
94+
95+
final Iterable<Widget> widgets = tester.allWidgets;
96+
_expectWidgetTypes(widgets,
97+
<Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
98+
_expectTextStrings(widgets, <String>['line 1\nline 2']);
99+
},
100+
);
82101

83-
testWidgets('Multiple line breaks', (WidgetTester tester) async {
84-
await tester.pumpWidget(
85-
_boilerplate(const MarkdownBody(data: 'line 1 \n \nline 2')));
102+
testWidgets('Non-applicable line break', (WidgetTester tester) async {
103+
final body = MarkdownBody(data: 'line 1.\nline 2.');
104+
await tester.pumpWidget(_boilerplate(body));
86105

87-
final Iterable<Widget> widgets = tester.allWidgets;
88-
_expectWidgetTypes(
89-
widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
90-
_expectTextStrings(widgets, <String>['line 1\n\nline 2']);
91-
});
106+
final Iterable<Widget> widgets = tester.allWidgets;
107+
_expectWidgetTypes(widgets,
108+
<Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
109+
_expectTextStrings(widgets, <String>['line 1. line 2.']);
110+
});
92111

93-
testWidgets('Non-applicable line break', (WidgetTester tester) async {
94-
final body = MarkdownBody(data: 'line 1.\nline 2.');
95-
await tester.pumpWidget(_boilerplate(body));
112+
testWidgets('Non-applicable line break', (WidgetTester tester) async {
113+
final body = MarkdownBody(data: 'line 1.\nline 2.');
114+
await tester.pumpWidget(_boilerplate(body));
96115

97-
final Iterable<Widget> widgets = tester.allWidgets;
98-
_expectWidgetTypes(
99-
widgets, <Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
100-
_expectTextStrings(widgets, <String>['line 1. line 2.']);
116+
final Iterable<Widget> widgets = tester.allWidgets;
117+
_expectWidgetTypes(widgets,
118+
<Type>[Directionality, MarkdownBody, Column, Wrap, RichText]);
119+
_expectTextStrings(widgets, <String>['line 1. line 2.']);
120+
});
101121
});
102122

103123
testWidgets('Empty string', (WidgetTester tester) async {

0 commit comments

Comments
 (0)