From 6a11ef5045623bd6680e15725ad0de7d2ef5e2e2 Mon Sep 17 00:00:00 2001 From: Istvan Soos Date: Thu, 27 Feb 2025 10:39:18 +0100 Subject: [PATCH] Migrate the hash-link markdown post-processing into the new HTML-node based version. --- app/lib/shared/markdown.dart | 47 ++++++++++--------- app/test/frontend/golden/help_page.html | 2 +- app/test/frontend/golden/pkg_show_page.html | 2 +- .../golden/pkg_show_page_discontinued.html | 2 +- .../golden/pkg_show_page_flutter_plugin.html | 2 +- .../golden/pkg_show_page_publisher.html | 2 +- .../golden/pkg_show_page_retracted.html | 2 +- ..._page_retracted_non_retracted_version.html | 2 +- .../golden/pkg_show_version_page.html | 2 +- app/test/shared/markdown_test.dart | 8 ++-- .../testdata/goldens/packages/oxygen.html | 2 +- .../packages/oxygen/versions/1.0.0.html | 2 +- .../packages/oxygen/versions/2.0.0.html | 2 +- 13 files changed, 40 insertions(+), 37 deletions(-) diff --git a/app/lib/shared/markdown.dart b/app/lib/shared/markdown.dart index 5d446c0c5e..53adf18df9 100644 --- a/app/lib/shared/markdown.dart +++ b/app/lib/shared/markdown.dart @@ -98,14 +98,11 @@ String _renderSafeHtml( List nodes, { required bool disableHashIds, }) { - if (!disableHashIds) { - // add hash link HTML to header blocks - final hashLink = _HashLink(); - nodes.forEach((node) => node.accept(hashLink)); - } - final rawHtml = m.renderToHtml(nodes); - final processedHtml = _postProcessHtml(rawHtml); + final processedHtml = _postProcessHtml( + rawHtml, + disableHashIds: disableHashIds, + ); // Renders the sanitized HTML. final html = sanitizeHtml( @@ -128,7 +125,10 @@ String _renderSafeHtml( return '$html\n'; } -String _postProcessHtml(String rawHtml) { +String _postProcessHtml( + String rawHtml, { + required bool disableHashIds, +}) { final root = html_parser.parseFragment(rawHtml); // Filter unsafe urls on some of the elements. @@ -137,35 +137,38 @@ String _postProcessHtml(String rawHtml) { // Transform GitHub task lists. _TaskListRewriteTreeVisitor().visit(root); + if (!disableHashIds) { + // add hash link HTML to header blocks + _HashLink().visit(root); + } + return root.outerHtml; } /// Adds an extra # element to h1, h2 and h3 elements. -class _HashLink implements m.NodeVisitor { +class _HashLink extends html_parsing.TreeVisitor { @override - void visitText(m.Text text) {} + void visitElement(html.Element element) { + super.visitElement(element); - @override - bool visitElementBefore(m.Element element) => true; + final isHeaderWithHash = element.attributes.containsKey('id') && + _structuralHeaderTags.contains(element.localName!); - @override - void visitElementAfter(m.Element element) { - final isHeaderWithHash = element.generatedId != null && - _structuralHeaderTags.contains(element.tag); if (isHeaderWithHash) { - _addHashLink(element, element.generatedId!); + _addHashLink(element, element.attributes['id']!); } } - void _addHashLink(m.Element element, String id) { + void _addHashLink(html.Element element, String id) { final currentClasses = element.attributes['class'] ?? ''; element.attributes['class'] = '$currentClasses hash-header'.trim(); - element.children!.addAll([ - m.Text(' '), - m.Element('a', [m.Text('#')]) + element.append(html.Text(' ')); + element.append( + html.Element.tag('a') + ..text = '#' ..attributes['href'] = '#$id' ..attributes['class'] = 'hash-link', - ]); + ); } } diff --git a/app/test/frontend/golden/help_page.html b/app/test/frontend/golden/help_page.html index 507c6dc6c5..5de3cf8fa0 100644 --- a/app/test/frontend/golden/help_page.html +++ b/app/test/frontend/golden/help_page.html @@ -115,7 +115,7 @@

-

+

Help #

diff --git a/app/test/frontend/golden/pkg_show_page.html b/app/test/frontend/golden/pkg_show_page.html index 6cf80dfaa1..34c2d13724 100644 --- a/app/test/frontend/golden/pkg_show_page.html +++ b/app/test/frontend/golden/pkg_show_page.html @@ -218,7 +218,7 @@

Metadata

-

+

oxygen #

diff --git a/app/test/frontend/golden/pkg_show_page_discontinued.html b/app/test/frontend/golden/pkg_show_page_discontinued.html index e36ce1fd42..ac5ee56fc9 100644 --- a/app/test/frontend/golden/pkg_show_page_discontinued.html +++ b/app/test/frontend/golden/pkg_show_page_discontinued.html @@ -211,7 +211,7 @@

Metadata

-

+

pkg #

diff --git a/app/test/frontend/golden/pkg_show_page_flutter_plugin.html b/app/test/frontend/golden/pkg_show_page_flutter_plugin.html index 07cebf9f2c..1f102ef8f3 100644 --- a/app/test/frontend/golden/pkg_show_page_flutter_plugin.html +++ b/app/test/frontend/golden/pkg_show_page_flutter_plugin.html @@ -207,7 +207,7 @@

Metadata

-

+

flutter_titanium #

diff --git a/app/test/frontend/golden/pkg_show_page_publisher.html b/app/test/frontend/golden/pkg_show_page_publisher.html index d838390ccf..cff2e8423b 100644 --- a/app/test/frontend/golden/pkg_show_page_publisher.html +++ b/app/test/frontend/golden/pkg_show_page_publisher.html @@ -206,7 +206,7 @@

Metadata

-

+

neon #

diff --git a/app/test/frontend/golden/pkg_show_page_retracted.html b/app/test/frontend/golden/pkg_show_page_retracted.html index 566de30fa3..942a4fe114 100644 --- a/app/test/frontend/golden/pkg_show_page_retracted.html +++ b/app/test/frontend/golden/pkg_show_page_retracted.html @@ -194,7 +194,7 @@

Metadata

-

+

pkg #

diff --git a/app/test/frontend/golden/pkg_show_page_retracted_non_retracted_version.html b/app/test/frontend/golden/pkg_show_page_retracted_non_retracted_version.html index 407ea7b3c9..2c97990830 100644 --- a/app/test/frontend/golden/pkg_show_page_retracted_non_retracted_version.html +++ b/app/test/frontend/golden/pkg_show_page_retracted_non_retracted_version.html @@ -202,7 +202,7 @@

Metadata

-

+

pkg #

diff --git a/app/test/frontend/golden/pkg_show_version_page.html b/app/test/frontend/golden/pkg_show_version_page.html index cd1f07764c..0282186d60 100644 --- a/app/test/frontend/golden/pkg_show_version_page.html +++ b/app/test/frontend/golden/pkg_show_version_page.html @@ -212,7 +212,7 @@

Metadata

-

+

oxygen #

diff --git a/app/test/shared/markdown_test.dart b/app/test/shared/markdown_test.dart index f3663bff6a..88472c3d23 100644 --- a/app/test/shared/markdown_test.dart +++ b/app/test/shared/markdown_test.dart @@ -14,7 +14,7 @@ void main() { test('render link id and class', () { expect(markdownToHtml('# ABC def'), - '

ABC def #

\n'); + '

ABC def #

\n'); }); test('task list', () { @@ -298,7 +298,7 @@ void main() { '\n' '- change1', isChangelog: true), - '

Changelog #

\n' + '

Changelog #

\n' '
\n' '

1.0.0 #

\n' '
\n' @@ -316,7 +316,7 @@ void main() { '## 1.0.0\n\n- change1\n\n- change2\n\n' '## 0.9.0\n\nMostly refactoring', isChangelog: true), - '

Changelog #

\n' + '

Changelog #

\n' '
\n' '

1.0.0 #

\n' '
\n' @@ -362,7 +362,7 @@ void main() { expect(lines.where((l) => l.contains('changelog-version')), [ '

2.1.0 #

', '

2.0.0 #

', - '

1.0.0 #

', + '

1.0.0 #

', ]); }); diff --git a/app/test/task/testdata/goldens/packages/oxygen.html b/app/test/task/testdata/goldens/packages/oxygen.html index 08c4762563..ff9d1af675 100644 --- a/app/test/task/testdata/goldens/packages/oxygen.html +++ b/app/test/task/testdata/goldens/packages/oxygen.html @@ -204,7 +204,7 @@

Metadata

-

+

oxygen #

diff --git a/app/test/task/testdata/goldens/packages/oxygen/versions/1.0.0.html b/app/test/task/testdata/goldens/packages/oxygen/versions/1.0.0.html index 1d376ca240..4214843329 100644 --- a/app/test/task/testdata/goldens/packages/oxygen/versions/1.0.0.html +++ b/app/test/task/testdata/goldens/packages/oxygen/versions/1.0.0.html @@ -208,7 +208,7 @@

Metadata

-

+

oxygen #

diff --git a/app/test/task/testdata/goldens/packages/oxygen/versions/2.0.0.html b/app/test/task/testdata/goldens/packages/oxygen/versions/2.0.0.html index 08c4762563..ff9d1af675 100644 --- a/app/test/task/testdata/goldens/packages/oxygen/versions/2.0.0.html +++ b/app/test/task/testdata/goldens/packages/oxygen/versions/2.0.0.html @@ -204,7 +204,7 @@

Metadata

-

+

oxygen #