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()}';