From 2791529dfc897ed00973f6586fdc0f0ef922368b Mon Sep 17 00:00:00 2001 From: Alex Li Date: Sun, 10 Dec 2023 17:39:38 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E2=9C=A8=20Introduce=20`CalloutBlockSynt?= =?UTF-8?q?ax`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/markdown.dart | 1 + .../block_syntaxes/callout_block_syntax.dart | 89 +++++++++++++++++++ lib/src/extension_set.dart | 2 + lib/src/patterns.dart | 8 ++ test/extensions/callout_extension.unit | 7 ++ test/markdown_test.dart | 4 + 6 files changed, 111 insertions(+) create mode 100644 lib/src/block_syntaxes/callout_block_syntax.dart create mode 100644 test/extensions/callout_extension.unit diff --git a/lib/markdown.dart b/lib/markdown.dart index 409baaf6..dde88bf0 100644 --- a/lib/markdown.dart +++ b/lib/markdown.dart @@ -44,6 +44,7 @@ export 'src/ast.dart'; export 'src/block_parser.dart'; export 'src/block_syntaxes/block_syntax.dart'; export 'src/block_syntaxes/blockquote_syntax.dart'; +export 'src/block_syntaxes/callout_block_syntax.dart'; export 'src/block_syntaxes/code_block_syntax.dart'; export 'src/block_syntaxes/dummy_block_syntax.dart'; export 'src/block_syntaxes/empty_block_syntax.dart'; diff --git a/lib/src/block_syntaxes/callout_block_syntax.dart b/lib/src/block_syntaxes/callout_block_syntax.dart new file mode 100644 index 00000000..f9587ed9 --- /dev/null +++ b/lib/src/block_syntaxes/callout_block_syntax.dart @@ -0,0 +1,89 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import '../ast.dart'; +import '../block_parser.dart'; +import '../line.dart'; +import '../patterns.dart'; +import 'block_syntax.dart'; +import 'code_block_syntax.dart'; +import 'paragraph_syntax.dart'; + +/// Parses callout blocks. +/// https://github.com/orgs/community/discussions/16925 +class CalloutBlockSyntax extends BlockSyntax { + const CalloutBlockSyntax(); + + static final _contentLineRegExp = RegExp(r'>?\s?(.*)*'); + + @override + RegExp get pattern => calloutPattern; + + /// Whether this callout ends with a lazy continuation line. + // The definition of lazy continuation lines: + // https://spec.commonmark.org/0.30/#lazy-continuation-line + static var _lazyContinuation = false; + + @override + List parseChildLines(BlockParser parser) { + // Grab all of the lines that form the callout, stripping off the ">". + final childLines = []; + _lazyContinuation = false; + + while (!parser.isDone) { + final strippedContent = + parser.current.content.replaceFirst(RegExp(r'^\s*>?\s*'), ''); + final match = _contentLineRegExp.firstMatch(strippedContent); + if (match != null) { + childLines.add(Line(strippedContent)); + parser.advance(); + _lazyContinuation = false; + continue; + } + + final lastLine = 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 + // a Setext header. + // Because indented code blocks cannot interrupt paragraphs, a line + // matched CodeBlockSyntax is also paragraph continuation text. + final otherMatched = + parser.blockSyntaxes.firstWhere((s) => s.canParse(parser)); + if ((otherMatched is ParagraphSyntax && + !lastLine.isBlankLine && + !codeFencePattern.hasMatch(lastLine.content)) || + (otherMatched is CodeBlockSyntax && + !indentPattern.hasMatch(lastLine.content))) { + childLines.add(parser.current); + _lazyContinuation = true; + parser.advance(); + } else { + break; + } + } + + return childLines; + } + + @override + Node parse(BlockParser parser) { + final type = pattern.firstMatch(parser.current.content)!.group(1)!; + parser.advance(); + final childLines = parseChildLines(parser); + // Recursively parse the contents of the callout. + final children = BlockParser(childLines, parser.document).parseLines( + // The setext heading underline cannot be a lazy continuation line in a + // block quote. + // https://spec.commonmark.org/0.30/#example-93 + disabledSetextHeading: _lazyContinuation, + parentSyntax: this, + ); + + return Element('div', [ + Element('strong', [Text(type)]), + ...children, + ]); + } +} diff --git a/lib/src/extension_set.dart b/lib/src/extension_set.dart index 660759ea..b437647e 100644 --- a/lib/src/extension_set.dart +++ b/lib/src/extension_set.dart @@ -1,4 +1,5 @@ import 'block_syntaxes/block_syntax.dart'; +import 'block_syntaxes/callout_block_syntax.dart'; import 'block_syntaxes/fenced_code_block_syntax.dart'; import 'block_syntaxes/footnote_def_syntax.dart'; import 'block_syntaxes/header_with_id_syntax.dart'; @@ -60,6 +61,7 @@ class ExtensionSet { const UnorderedListWithCheckboxSyntax(), const OrderedListWithCheckboxSyntax(), const FootnoteDefSyntax(), + const CalloutBlockSyntax(), ], ), List.unmodifiable( diff --git a/lib/src/patterns.dart b/lib/src/patterns.dart index c75838ff..e83a3d9c 100644 --- a/lib/src/patterns.dart +++ b/lib/src/patterns.dart @@ -151,3 +151,11 @@ final htmlCharactersPattern = RegExp( /// A line starts with `[`. final linkReferenceDefinitionPattern = RegExp(r'^[ ]{0,3}\['); + +/// Callout type patterns. +/// A callout block starts with [!TYPE], and only 5 types are supported. +/// The block should ends with a blank line. +final calloutPattern = RegExp( + r'^> \[!(NOTE|TIP|IMPORTANT|CAUTION|WARNING)\]$', + multiLine: true, +); diff --git a/test/extensions/callout_extension.unit b/test/extensions/callout_extension.unit new file mode 100644 index 00000000..4db25f81 --- /dev/null +++ b/test/extensions/callout_extension.unit @@ -0,0 +1,7 @@ +>>> callout note +> [!NOTE] +> Test note callout. +<<< +
NOTE +

Test note callout.

+
\ No newline at end of file diff --git a/test/markdown_test.dart b/test/markdown_test.dart index 4d21fe89..3c34b4d3 100644 --- a/test/markdown_test.dart +++ b/test/markdown_test.dart @@ -42,6 +42,10 @@ void main() async { 'extensions/unordered_list_with_checkboxes.unit', blockSyntaxes: [const UnorderedListWithCheckboxSyntax()], ); + testFile( + 'extensions/callout_extension.unit', + blockSyntaxes: [const CalloutBlockSyntax()], + ); testFile( 'extensions/autolink_extension.unit', inlineSyntaxes: [AutolinkExtensionSyntax()], From 085eabc6de850bc76f7969787640cb5b01385f8f Mon Sep 17 00:00:00 2001 From: Alex Li Date: Mon, 11 Dec 2023 10:10:16 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20More=20flex=20patter?= =?UTF-8?q?ns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/patterns.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/src/patterns.dart b/lib/src/patterns.dart index e83a3d9c..76efbaf1 100644 --- a/lib/src/patterns.dart +++ b/lib/src/patterns.dart @@ -153,9 +153,8 @@ final htmlCharactersPattern = RegExp( final linkReferenceDefinitionPattern = RegExp(r'^[ ]{0,3}\['); /// Callout type patterns. -/// A callout block starts with [!TYPE], and only 5 types are supported. -/// The block should ends with a blank line. +/// A callout block is similar to a blockquote, +/// starts with `> [!TYPE]`, and only 5 types are supported. final calloutPattern = RegExp( - r'^> \[!(NOTE|TIP|IMPORTANT|CAUTION|WARNING)\]$', - multiLine: true, + r'^\s{0,3}>\s{0,3}\[!(NOTE|TIP|IMPORTANT|CAUTION|WARNING)\]\s*$', ); From cd63f438fb950448d3d67f5a7557bfc8dadb8593 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Mon, 11 Dec 2023 10:40:45 +0800 Subject: [PATCH 03/15] =?UTF-8?q?=F0=9F=9A=80=20Produce=20correct=20struct?= =?UTF-8?q?ure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block_syntaxes/callout_block_syntax.dart | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/src/block_syntaxes/callout_block_syntax.dart b/lib/src/block_syntaxes/callout_block_syntax.dart index f9587ed9..74dae897 100644 --- a/lib/src/block_syntaxes/callout_block_syntax.dart +++ b/lib/src/block_syntaxes/callout_block_syntax.dart @@ -10,7 +10,7 @@ import 'block_syntax.dart'; import 'code_block_syntax.dart'; import 'paragraph_syntax.dart'; -/// Parses callout blocks. +/// Parses GitHub callout blocks. /// https://github.com/orgs/community/discussions/16925 class CalloutBlockSyntax extends BlockSyntax { const CalloutBlockSyntax(); @@ -69,7 +69,9 @@ class CalloutBlockSyntax extends BlockSyntax { @override Node parse(BlockParser parser) { - final type = pattern.firstMatch(parser.current.content)!.group(1)!; + // Parse the callout type from the first line. + final type = + pattern.firstMatch(parser.current.content)!.group(1)!.toLowerCase(); parser.advance(); final childLines = parseChildLines(parser); // Recursively parse the contents of the callout. @@ -81,9 +83,18 @@ class CalloutBlockSyntax extends BlockSyntax { parentSyntax: this, ); - return Element('div', [ - Element('strong', [Text(type)]), - ...children, - ]); + // Mapping the callout title text. + final titleText = { + 'note': 'Note', + 'tip': 'Tip', + 'important': 'Important', + 'caution': 'Caution', + 'warning': 'Warning', + }[type]!; + final titleElement = Element('p', [Text(titleText)]) + ..attributes['class'] = 'markdown-alert-title'; + final elementClass = 'markdown-alert markdown-alert-${type.toLowerCase()}'; + return Element('div', [titleElement, ...children]) + ..attributes['class'] = elementClass; } } From d0bef01999ae6a7cf1669308316fff23879052a6 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Mon, 11 Dec 2023 10:41:02 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Case-insensitive=20t?= =?UTF-8?q?ypes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/patterns.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/patterns.dart b/lib/src/patterns.dart index 76efbaf1..1b677c1e 100644 --- a/lib/src/patterns.dart +++ b/lib/src/patterns.dart @@ -156,5 +156,6 @@ final linkReferenceDefinitionPattern = RegExp(r'^[ ]{0,3}\['); /// A callout block is similar to a blockquote, /// starts with `> [!TYPE]`, and only 5 types are supported. final calloutPattern = RegExp( - r'^\s{0,3}>\s{0,3}\[!(NOTE|TIP|IMPORTANT|CAUTION|WARNING)\]\s*$', + r'^\s{0,3}>\s{0,3}\[!(note|tip|important|caution|warning)\]\s*$', + caseSensitive: false, ); From 3fa039fb6b5147c85a260009d1c6039536ded9db Mon Sep 17 00:00:00 2001 From: Alex Li Date: Mon, 11 Dec 2023 11:13:21 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Improve=20`canParse`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/block_syntaxes/callout_block_syntax.dart | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/src/block_syntaxes/callout_block_syntax.dart b/lib/src/block_syntaxes/callout_block_syntax.dart index 74dae897..caa90e99 100644 --- a/lib/src/block_syntaxes/callout_block_syntax.dart +++ b/lib/src/block_syntaxes/callout_block_syntax.dart @@ -15,15 +15,20 @@ import 'paragraph_syntax.dart'; class CalloutBlockSyntax extends BlockSyntax { const CalloutBlockSyntax(); - static final _contentLineRegExp = RegExp(r'>?\s?(.*)*'); - @override RegExp get pattern => calloutPattern; + @override + bool canParse(BlockParser parser) { + return pattern.hasMatch(parser.current.content) && + parser.lines.any((line) => _contentLineRegExp.hasMatch(line.content)); + } + /// Whether this callout ends with a lazy continuation line. // The definition of lazy continuation lines: // https://spec.commonmark.org/0.30/#lazy-continuation-line - static var _lazyContinuation = false; + static bool _lazyContinuation = false; + static final _contentLineRegExp = RegExp(r'>?\s?(.*)*'); @override List parseChildLines(BlockParser parser) { From 4e18f5313c8938ba5f0a55bf1e0358a863b38295 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Mon, 11 Dec 2023 11:51:16 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E2=9C=85=20Fill=20test=20cases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/extensions/callout_extension.unit | 87 ++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 4 deletions(-) diff --git a/test/extensions/callout_extension.unit b/test/extensions/callout_extension.unit index 4db25f81..7e7a9c3a 100644 --- a/test/extensions/callout_extension.unit +++ b/test/extensions/callout_extension.unit @@ -1,7 +1,86 @@ ->>> callout note -> [!NOTE] +>>> type note +> [!NoTe] > Test note callout. <<< -
NOTE +
+

Note

Test note callout.

-
\ No newline at end of file +
+>>> type tip +> [!TiP] +> Test tip callout. +<<< +
+

Tip

+

Test tip callout.

+
+>>> type important +> [!ImpoRtanT] +> Test important callout. +<<< +
+

Important

+

Test important callout.

+
+>>> type warning +> [!WarNinG] +> Test warning callout. +<<< +
+

Warning

+

Test warning callout.

+
+>>> type caution +> [!CauTioN] +> Test caution callout. +<<< +
+

Caution

+

Test caution callout.

+
+>>> invalid type +> [!foo] +> Test foo callout. +<<< +
+

[!foo] +Test foo callout.

+
+>>> contents can both contain/not contain starting quote +> [!NOTE] +Test note callout. +>Test note callout x2. +<<< +
+

Note

+

Test note callout. +Test note callout x2.

+
+>>> spaces everywhere + > [!NOTE] +> Test note callout. + > Test note callout x2. +<<< +
+

Note

+

Test note callout. +Test note callout x2.

+
+>>> title has 3 more spaces then fallback to blockquote +> [!NOTE] +> Test blockquote. +<<< +
+

[!NOTE] +Test blockquote.

+
+>>>nested blockquote +> [!NOTE] +>> Test nested blockquote. +<<< +
+

Note

+
+

Test nested blockquote.

+
+
From 4e5f95d658dabe26255cc3b4c43c87282b68d51f Mon Sep 17 00:00:00 2001 From: Alex Li Date: Mon, 11 Dec 2023 14:55:50 +0800 Subject: [PATCH 07/15] Update AUTHORS --- AUTHORS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 7f87fc43..ca5b46bf 100644 --- a/AUTHORS +++ b/AUTHORS @@ -10,4 +10,4 @@ Daniel Schubert Jirka Daněk Seth Westphal Tim Maffett - +Alex Li From abec2dd9b3b3d506fe9a682faecb587487c6ad2f Mon Sep 17 00:00:00 2001 From: Alex Li Date: Sat, 16 Dec 2023 17:26:29 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=F0=9F=9A=9A=20Rename?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/markdown.dart | 2 +- ...ck_syntax.dart => alert_block_syntax.dart} | 21 +++++----- lib/src/extension_set.dart | 4 +- lib/src/patterns.dart | 9 +++-- ...ut_extension.unit => alert_extension.unit} | 40 +++++++++---------- test/markdown_test.dart | 7 ++-- 6 files changed, 43 insertions(+), 40 deletions(-) rename lib/src/block_syntaxes/{callout_block_syntax.dart => alert_block_syntax.dart} (84%) rename test/extensions/{callout_extension.unit => alert_extension.unit} (74%) diff --git a/lib/markdown.dart b/lib/markdown.dart index dde88bf0..a09e763a 100644 --- a/lib/markdown.dart +++ b/lib/markdown.dart @@ -42,9 +42,9 @@ import 'src/version.dart'; export 'src/ast.dart'; export 'src/block_parser.dart'; +export 'src/block_syntaxes/alert_block_syntax.dart'; export 'src/block_syntaxes/block_syntax.dart'; export 'src/block_syntaxes/blockquote_syntax.dart'; -export 'src/block_syntaxes/callout_block_syntax.dart'; export 'src/block_syntaxes/code_block_syntax.dart'; export 'src/block_syntaxes/dummy_block_syntax.dart'; export 'src/block_syntaxes/empty_block_syntax.dart'; diff --git a/lib/src/block_syntaxes/callout_block_syntax.dart b/lib/src/block_syntaxes/alert_block_syntax.dart similarity index 84% rename from lib/src/block_syntaxes/callout_block_syntax.dart rename to lib/src/block_syntaxes/alert_block_syntax.dart index caa90e99..cda50968 100644 --- a/lib/src/block_syntaxes/callout_block_syntax.dart +++ b/lib/src/block_syntaxes/alert_block_syntax.dart @@ -10,13 +10,14 @@ import 'block_syntax.dart'; import 'code_block_syntax.dart'; import 'paragraph_syntax.dart'; -/// Parses GitHub callout blocks. -/// https://github.com/orgs/community/discussions/16925 -class CalloutBlockSyntax extends BlockSyntax { - const CalloutBlockSyntax(); +/// Parses GitHub Alerts blocks. +/// +/// See also: https://docs.github.com/zh/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts +class AlertBlockSyntax extends BlockSyntax { + const AlertBlockSyntax(); @override - RegExp get pattern => calloutPattern; + RegExp get pattern => alertPattern; @override bool canParse(BlockParser parser) { @@ -24,7 +25,7 @@ class CalloutBlockSyntax extends BlockSyntax { parser.lines.any((line) => _contentLineRegExp.hasMatch(line.content)); } - /// Whether this callout ends with a lazy continuation line. + /// Whether this alert ends with a lazy continuation line. // The definition of lazy continuation lines: // https://spec.commonmark.org/0.30/#lazy-continuation-line static bool _lazyContinuation = false; @@ -32,7 +33,7 @@ class CalloutBlockSyntax extends BlockSyntax { @override List parseChildLines(BlockParser parser) { - // Grab all of the lines that form the callout, stripping off the ">". + // Grab all of the lines that form the alert, stripping off the ">". final childLines = []; _lazyContinuation = false; @@ -74,12 +75,12 @@ class CalloutBlockSyntax extends BlockSyntax { @override Node parse(BlockParser parser) { - // Parse the callout type from the first line. + // Parse the alert type from the first line. final type = pattern.firstMatch(parser.current.content)!.group(1)!.toLowerCase(); parser.advance(); final childLines = parseChildLines(parser); - // Recursively parse the contents of the callout. + // Recursively parse the contents of the alert. final children = BlockParser(childLines, parser.document).parseLines( // The setext heading underline cannot be a lazy continuation line in a // block quote. @@ -88,7 +89,7 @@ class CalloutBlockSyntax extends BlockSyntax { parentSyntax: this, ); - // Mapping the callout title text. + // Mapping the alert title text. final titleText = { 'note': 'Note', 'tip': 'Tip', diff --git a/lib/src/extension_set.dart b/lib/src/extension_set.dart index b437647e..58a25d86 100644 --- a/lib/src/extension_set.dart +++ b/lib/src/extension_set.dart @@ -1,5 +1,5 @@ +import 'block_syntaxes/alert_block_syntax.dart'; import 'block_syntaxes/block_syntax.dart'; -import 'block_syntaxes/callout_block_syntax.dart'; import 'block_syntaxes/fenced_code_block_syntax.dart'; import 'block_syntaxes/footnote_def_syntax.dart'; import 'block_syntaxes/header_with_id_syntax.dart'; @@ -61,7 +61,7 @@ class ExtensionSet { const UnorderedListWithCheckboxSyntax(), const OrderedListWithCheckboxSyntax(), const FootnoteDefSyntax(), - const CalloutBlockSyntax(), + const AlertBlockSyntax(), ], ), List.unmodifiable( diff --git a/lib/src/patterns.dart b/lib/src/patterns.dart index 1b677c1e..81829966 100644 --- a/lib/src/patterns.dart +++ b/lib/src/patterns.dart @@ -152,10 +152,11 @@ final htmlCharactersPattern = RegExp( /// A line starts with `[`. final linkReferenceDefinitionPattern = RegExp(r'^[ ]{0,3}\['); -/// Callout type patterns. -/// A callout block is similar to a blockquote, -/// starts with `> [!TYPE]`, and only 5 types are supported. -final calloutPattern = RegExp( +/// Alert type patterns. +/// A alert block is similar to a blockquote, +/// starts with `> [!TYPE]`, and only 5 types are supported +/// with case-insensitive. +final alertPattern = RegExp( r'^\s{0,3}>\s{0,3}\[!(note|tip|important|caution|warning)\]\s*$', caseSensitive: false, ); diff --git a/test/extensions/callout_extension.unit b/test/extensions/alert_extension.unit similarity index 74% rename from test/extensions/callout_extension.unit rename to test/extensions/alert_extension.unit index 7e7a9c3a..48b74136 100644 --- a/test/extensions/callout_extension.unit +++ b/test/extensions/alert_extension.unit @@ -1,70 +1,70 @@ >>> type note > [!NoTe] -> Test note callout. +> Test note alert. <<<

Note

-

Test note callout.

+

Test note alert.

>>> type tip > [!TiP] -> Test tip callout. +> Test tip alert. <<<

Tip

-

Test tip callout.

+

Test tip alert.

>>> type important > [!ImpoRtanT] -> Test important callout. +> Test important alert. <<<

Important

-

Test important callout.

+

Test important alert.

>>> type warning > [!WarNinG] -> Test warning callout. +> Test warning alert. <<<

Warning

-

Test warning callout.

+

Test warning alert.

>>> type caution > [!CauTioN] -> Test caution callout. +> Test caution alert. <<<

Caution

-

Test caution callout.

+

Test caution alert.

>>> invalid type > [!foo] -> Test foo callout. +> Test foo alert. <<<

[!foo] -Test foo callout.

+Test foo alert.

>>> contents can both contain/not contain starting quote > [!NOTE] -Test note callout. ->Test note callout x2. +Test note alert. +>Test note alert x2. <<<

Note

-

Test note callout. -Test note callout x2.

+

Test note alert. +Test note alert x2.

>>> spaces everywhere > [!NOTE] -> Test note callout. - > Test note callout x2. +> Test note alert. + > Test note alert x2. <<<

Note

-

Test note callout. -Test note callout x2.

+

Test note alert. +Test note alert x2.

>>> title has 3 more spaces then fallback to blockquote > [!NOTE] diff --git a/test/markdown_test.dart b/test/markdown_test.dart index 3c34b4d3..1fea6835 100644 --- a/test/markdown_test.dart +++ b/test/markdown_test.dart @@ -43,15 +43,16 @@ void main() async { blockSyntaxes: [const UnorderedListWithCheckboxSyntax()], ); testFile( - 'extensions/callout_extension.unit', - blockSyntaxes: [const CalloutBlockSyntax()], + 'extensions/alert_extension.unit', + blockSyntaxes: [const AlertBlockSyntax()], ); + + // Inline syntax extensions testFile( 'extensions/autolink_extension.unit', inlineSyntaxes: [AutolinkExtensionSyntax()], ); - // Inline syntax extensions testFile( 'extensions/emojis.unit', inlineSyntaxes: [EmojiSyntax()], From bfe95c987d89ab4cee49b67310292a6fc7e31ff5 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Sat, 16 Dec 2023 17:26:45 +0800 Subject: [PATCH 09/15] =?UTF-8?q?=F0=9F=93=9D=20Add=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fcfd579..97644bab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ * Require Dart `^3.1.0`. * Update all CommonMark specification links to 0.30. -* Fix beginning of line detection in `AutolinkExtensionSyntax`. +* Fix beginning of line detection in `AutolinkExtensionSyntax`. +* Add a new syntax `AlertBlockSyntax` to parse GitHub Alerts ## 7.1.1 From 18d05f84706c9fe524cc3125da87657a5282c91b Mon Sep 17 00:00:00 2001 From: Alex Li Date: Sat, 16 Dec 2023 17:27:25 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=F0=9F=94=A5=20Remove=20`zh`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/block_syntaxes/alert_block_syntax.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/block_syntaxes/alert_block_syntax.dart b/lib/src/block_syntaxes/alert_block_syntax.dart index cda50968..e489b4f2 100644 --- a/lib/src/block_syntaxes/alert_block_syntax.dart +++ b/lib/src/block_syntaxes/alert_block_syntax.dart @@ -12,7 +12,7 @@ import 'paragraph_syntax.dart'; /// Parses GitHub Alerts blocks. /// -/// See also: https://docs.github.com/zh/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts +/// See also: https://docs.github.com/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts class AlertBlockSyntax extends BlockSyntax { const AlertBlockSyntax(); From 18582f7d23c93d98c7cf349c14c79d8cf386bbd2 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Sun, 17 Dec 2023 01:28:38 +0800 Subject: [PATCH 11/15] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97644bab..fe714142 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 7.1.2-wip +## 7.2.0-wip * Require Dart `^3.1.0`. * Update all CommonMark specification links to 0.30. From f3e32983d0c6262466136c84765fa393a19ac143 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Sun, 17 Dec 2023 01:29:04 +0800 Subject: [PATCH 12/15] Update pubspec.yaml --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 6ddea8fa..2ef835f2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: markdown -version: 7.1.2-wip +version: 7.2.0-wip description: >- A portable Markdown library written in Dart that can parse Markdown into HTML. From 401ab1c165b7c2c6bd83efd8dc8f453b4b4fed51 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Tue, 19 Dec 2023 09:58:21 +0800 Subject: [PATCH 13/15] =?UTF-8?q?=F0=9F=94=96=20Fix=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/version.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/version.dart b/lib/src/version.dart index c8a2b008..a70cac58 100644 --- a/lib/src/version.dart +++ b/lib/src/version.dart @@ -1,2 +1,2 @@ // Generated code. Do not modify. -const packageVersion = '7.1.2-wip'; +const packageVersion = '7.2.0-wip'; From 6f0a264a8020dfc555123342ad33ebc7b3b7184c Mon Sep 17 00:00:00 2001 From: Alex Li Date: Tue, 19 Dec 2023 10:02:41 +0800 Subject: [PATCH 14/15] =?UTF-8?q?=F0=9F=A7=AA=20Add=20escape=20brackets=20?= =?UTF-8?q?case?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/patterns.dart | 2 +- test/extensions/alert_extension.unit | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/src/patterns.dart b/lib/src/patterns.dart index 81829966..4899ea16 100644 --- a/lib/src/patterns.dart +++ b/lib/src/patterns.dart @@ -157,6 +157,6 @@ final linkReferenceDefinitionPattern = RegExp(r'^[ ]{0,3}\['); /// starts with `> [!TYPE]`, and only 5 types are supported /// with case-insensitive. final alertPattern = RegExp( - r'^\s{0,3}>\s{0,3}\[!(note|tip|important|caution|warning)\]\s*$', + r'^\s{0,3}>\s{0,3}\\?\[!(note|tip|important|caution|warning)\\?\]\s*$', caseSensitive: false, ); diff --git a/test/extensions/alert_extension.unit b/test/extensions/alert_extension.unit index 48b74136..c2a3da10 100644 --- a/test/extensions/alert_extension.unit +++ b/test/extensions/alert_extension.unit @@ -84,3 +84,11 @@ Test blockquote.

Test nested blockquote.

+>>>escape brackets +> \[!note\] +> Test escape brackets. +<<< +
+

Note

+

Test escape brackets.

+
From c634fcf5dc8a9b0517c902ec129c7b3a5a5cd1c0 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Tue, 19 Dec 2023 10:03:41 +0800 Subject: [PATCH 15/15] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20const=20type=20text?= =?UTF-8?q?=20map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/block_syntaxes/alert_block_syntax.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/src/block_syntaxes/alert_block_syntax.dart b/lib/src/block_syntaxes/alert_block_syntax.dart index e489b4f2..be28ca93 100644 --- a/lib/src/block_syntaxes/alert_block_syntax.dart +++ b/lib/src/block_syntaxes/alert_block_syntax.dart @@ -90,13 +90,14 @@ class AlertBlockSyntax extends BlockSyntax { ); // Mapping the alert title text. - final titleText = { + const typeTextMap = { 'note': 'Note', 'tip': 'Tip', 'important': 'Important', 'caution': 'Caution', 'warning': 'Warning', - }[type]!; + }; + final titleText = typeTextMap[type]!; final titleElement = Element('p', [Text(titleText)]) ..attributes['class'] = 'markdown-alert-title'; final elementClass = 'markdown-alert markdown-alert-${type.toLowerCase()}';