From 410886c937e9339c4a0d5d1f7b1ca55ef95f71d7 Mon Sep 17 00:00:00 2001 From: Michael Jordan Date: Fri, 28 Aug 2020 14:39:33 -0600 Subject: [PATCH] Revert changes made in PR #235 (#264) --- packages/flutter_markdown/lib/src/widget.dart | 18 +++-- .../test/flutter_markdown_test.dart | 66 ++++++++++++------- 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/packages/flutter_markdown/lib/src/widget.dart b/packages/flutter_markdown/lib/src/widget.dart index 3cfeaf9f0fc5..fe45b049ef29 100644 --- a/packages/flutter_markdown/lib/src/widget.dart +++ b/packages/flutter_markdown/lib/src/widget.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:convert'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -200,12 +202,6 @@ class _MarkdownWidgetState extends State _disposeRecognizers(); - /// FIXME: Enhance it using a single RegEx - final List lines = widget.data - .replaceAll(RegExp(r'[ ]{2}(\r?\n)'), ' &') - .split(RegExp(r'\r?\n')) - .map((e) => e?.replaceAll(RegExp(r' &'), ' \n')) - .toList(); final md.Document document = md.Document( extensionSet: widget.extensionSet ?? md.ExtensionSet.gitHubFlavored, inlineSyntaxes: (widget.extensionSet?.inlineSyntaxes ?? []) @@ -213,6 +209,13 @@ class _MarkdownWidgetState extends State ..map((syntax) => syntax), encodeHtml: false, ); + + // Parse the source Markdown data into nodes of an Abstract Syntax Tree. + final List lines = LineSplitter().convert(widget.data); + final List astNodes = document.parseLines(lines); + + // Configure a Markdown widget builder to traverse the AST nodes and + // create a widget tree based on the elements. final MarkdownBuilder builder = MarkdownBuilder( delegate: this, selectable: widget.selectable, @@ -223,7 +226,8 @@ class _MarkdownWidgetState extends State builders: widget.builders, fitContent: widget.fitContent, ); - _children = builder.build(document.parseLines(lines)); + + _children = builder.build(astNodes); } void _disposeRecognizers() { diff --git a/packages/flutter_markdown/test/flutter_markdown_test.dart b/packages/flutter_markdown/test/flutter_markdown_test.dart index 85ab0747c127..479906665458 100644 --- a/packages/flutter_markdown/test/flutter_markdown_test.dart +++ b/packages/flutter_markdown/test/flutter_markdown_test.dart @@ -70,34 +70,54 @@ void main() { _expectTextStrings(widgets, ['strikethrough']); }); - testWidgets('Single line break', (WidgetTester tester) async { - await tester - .pumpWidget(_boilerplate(const MarkdownBody(data: 'line 1 \nline 2'))); + group('Line Breaks', () { + testWidgets( + // Example 654 from the GitHub Flavored Markdown specification. + 'Two spaces at end of line inside a block element', + (WidgetTester tester) async { + await tester.pumpWidget( + _boilerplate(const MarkdownBody(data: 'line 1 \nline 2'))); + + final Iterable widgets = tester.allWidgets; + _expectWidgetTypes(widgets, + [Directionality, MarkdownBody, Column, Wrap, RichText]); + _expectTextStrings(widgets, ['line 1\nline 2']); + }, + ); - final Iterable widgets = tester.allWidgets; - _expectWidgetTypes( - widgets, [Directionality, MarkdownBody, Column, Wrap, RichText]); - _expectTextStrings(widgets, ['line 1\nline 2']); - }); + testWidgets( + // Example 655 from the GitHub Flavored Markdown specification. + 'Backslash at end of line inside a block element', + (WidgetTester tester) async { + await tester.pumpWidget( + _boilerplate(const MarkdownBody(data: 'line 1\\\nline 2'))); + + final Iterable widgets = tester.allWidgets; + _expectWidgetTypes(widgets, + [Directionality, MarkdownBody, Column, Wrap, RichText]); + _expectTextStrings(widgets, ['line 1\nline 2']); + }, + ); - testWidgets('Multiple line breaks', (WidgetTester tester) async { - await tester.pumpWidget( - _boilerplate(const MarkdownBody(data: 'line 1 \n \nline 2'))); + testWidgets('Non-applicable line break', (WidgetTester tester) async { + final body = MarkdownBody(data: 'line 1.\nline 2.'); + await tester.pumpWidget(_boilerplate(body)); - final Iterable widgets = tester.allWidgets; - _expectWidgetTypes( - widgets, [Directionality, MarkdownBody, Column, Wrap, RichText]); - _expectTextStrings(widgets, ['line 1\n\nline 2']); - }); + final Iterable widgets = tester.allWidgets; + _expectWidgetTypes(widgets, + [Directionality, MarkdownBody, Column, Wrap, RichText]); + _expectTextStrings(widgets, ['line 1. line 2.']); + }); - testWidgets('Non-applicable line break', (WidgetTester tester) async { - final body = MarkdownBody(data: 'line 1.\nline 2.'); - await tester.pumpWidget(_boilerplate(body)); + testWidgets('Non-applicable line break', (WidgetTester tester) async { + final body = MarkdownBody(data: 'line 1.\nline 2.'); + await tester.pumpWidget(_boilerplate(body)); - final Iterable widgets = tester.allWidgets; - _expectWidgetTypes( - widgets, [Directionality, MarkdownBody, Column, Wrap, RichText]); - _expectTextStrings(widgets, ['line 1. line 2.']); + final Iterable widgets = tester.allWidgets; + _expectWidgetTypes(widgets, + [Directionality, MarkdownBody, Column, Wrap, RichText]); + _expectTextStrings(widgets, ['line 1. line 2.']); + }); }); testWidgets('Empty string', (WidgetTester tester) async {