From 1ca51664e7b1b7fe789f6be2668c909ce3aea342 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Wed, 6 Mar 2024 20:26:59 -0800 Subject: [PATCH] fix a crash when parsing alert block syntax (#593) * fix a crash when parsing alert block syntax * update version.dart * Remove the reference to 'parser.lines' in canParse(). --- CHANGELOG.md | 4 ++- .../block_syntaxes/alert_block_syntax.dart | 11 +++---- lib/src/patterns.dart | 6 ++-- lib/src/version.dart | 2 +- pubspec.yaml | 4 +-- test/extensions/alert_extension.unit | 31 +++++++++++++++++++ 6 files changed, 45 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55760bf5..f7859d45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ -## 7.2.2-wip +## 7.2.2 +* Fix a crash parsing alert block syntax (#584). +* Have alert block syntax support multiple paragraphs (#577). * Require Dart `^3.2.0`. ## 7.2.1 diff --git a/lib/src/block_syntaxes/alert_block_syntax.dart b/lib/src/block_syntaxes/alert_block_syntax.dart index 54286040..0f4f5b11 100644 --- a/lib/src/block_syntaxes/alert_block_syntax.dart +++ b/lib/src/block_syntaxes/alert_block_syntax.dart @@ -21,8 +21,7 @@ class AlertBlockSyntax extends BlockSyntax { @override bool canParse(BlockParser parser) { - return pattern.hasMatch(parser.current.content) && - parser.lines.any((line) => _contentLineRegExp.hasMatch(line.content)); + return alertPattern.hasMatch(parser.current.content); } /// Whether this alert ends with a lazy continuation line. @@ -39,9 +38,9 @@ class AlertBlockSyntax extends BlockSyntax { _lazyContinuation = false; while (!parser.isDone) { - final strippedContent = - parser.current.content.replaceFirst(RegExp(r'^\s*>?\s*'), ''); - final match = strippedContent.isEmpty + final lineContent = parser.current.content.trimLeft(); + final strippedContent = lineContent.replaceFirst(RegExp(r'^>?\s*'), ''); + final match = strippedContent.isEmpty && !lineContent.startsWith('>') ? null : _contentLineRegExp.firstMatch(strippedContent); if (match != null) { @@ -51,7 +50,7 @@ class AlertBlockSyntax extends BlockSyntax { continue; } - final lastLine = childLines.last; + final lastLine = childLines.isEmpty ? Line('') : childLines.last; // A paragraph continuation is OK. This is content that cannot be parsed // as any other syntax except Paragraph, and it doesn't match the bar in diff --git a/lib/src/patterns.dart b/lib/src/patterns.dart index 4899ea16..2690419c 100644 --- a/lib/src/patterns.dart +++ b/lib/src/patterns.dart @@ -153,9 +153,9 @@ final htmlCharactersPattern = RegExp( final linkReferenceDefinitionPattern = RegExp(r'^[ ]{0,3}\['); /// Alert type patterns. -/// A alert block is similar to a blockquote, -/// starts with `> [!TYPE]`, and only 5 types are supported -/// with case-insensitive. +/// +/// A alert block is similar to a blockquote, starts with `> [!TYPE]`, and only +/// 5 types are supported (case-insensitive). final alertPattern = RegExp( r'^\s{0,3}>\s{0,3}\\?\[!(note|tip|important|caution|warning)\\?\]\s*$', caseSensitive: false, diff --git a/lib/src/version.dart b/lib/src/version.dart index b0cf8611..f10c4ff9 100644 --- a/lib/src/version.dart +++ b/lib/src/version.dart @@ -1,2 +1,2 @@ // Generated code. Do not modify. -const packageVersion = '7.2.2-wip'; +const packageVersion = '7.2.2'; diff --git a/pubspec.yaml b/pubspec.yaml index bd85b659..7cb8b6fb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,9 +1,9 @@ name: markdown -version: 7.2.2-wip - +version: 7.2.2 description: >- A portable Markdown library written in Dart that can parse Markdown into HTML. repository: https://github.com/dart-lang/markdown + topics: - markdown diff --git a/test/extensions/alert_extension.unit b/test/extensions/alert_extension.unit index 0f422b5c..9a21f186 100644 --- a/test/extensions/alert_extension.unit +++ b/test/extensions/alert_extension.unit @@ -129,3 +129,34 @@ Additional markdown text. with two lines.

Additional markdown text.

+>>> supports continuation lines +> [!note] +> A sample note +with two lines. + +Additional markdown text. +<<< +
+

Note

+

A sample note +with two lines.

+
+

Additional markdown text.

+>>> crash repro #584.1 +> [!Warning] +> +> Some extensions won't work on dynamic types. +<<< +
+

Warning

+

Some extensions won't work on dynamic types.

+
+>>> crash repro #584.2 +> [!NOTE] +> +> if you receive the following error: +<<< +
+

Note

+

if you receive the following error:

+