Skip to content

Commit 142d870

Browse files
committed
Migrate the hash-link markdown post-processing into the new HTML-node based version. (dart-lang#8597)
1 parent bfe55ad commit 142d870

File tree

13 files changed

+40
-37
lines changed

13 files changed

+40
-37
lines changed

app/lib/shared/markdown.dart

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,11 @@ String _renderSafeHtml(
9898
List<m.Node> nodes, {
9999
required bool disableHashIds,
100100
}) {
101-
if (!disableHashIds) {
102-
// add hash link HTML to header blocks
103-
final hashLink = _HashLink();
104-
nodes.forEach((node) => node.accept(hashLink));
105-
}
106-
107101
final rawHtml = m.renderToHtml(nodes);
108-
final processedHtml = _postProcessHtml(rawHtml);
102+
final processedHtml = _postProcessHtml(
103+
rawHtml,
104+
disableHashIds: disableHashIds,
105+
);
109106

110107
// Renders the sanitized HTML.
111108
final html = sanitizeHtml(
@@ -128,7 +125,10 @@ String _renderSafeHtml(
128125
return '$html\n';
129126
}
130127

131-
String _postProcessHtml(String rawHtml) {
128+
String _postProcessHtml(
129+
String rawHtml, {
130+
required bool disableHashIds,
131+
}) {
132132
final root = html_parser.parseFragment(rawHtml);
133133

134134
// Filter unsafe urls on some of the elements.
@@ -137,35 +137,38 @@ String _postProcessHtml(String rawHtml) {
137137
// Transform GitHub task lists.
138138
_TaskListRewriteTreeVisitor().visit(root);
139139

140+
if (!disableHashIds) {
141+
// add hash link HTML to header blocks
142+
_HashLink().visit(root);
143+
}
144+
140145
return root.outerHtml;
141146
}
142147

143148
/// Adds an extra <a href="#hash">#</a> element to h1, h2 and h3 elements.
144-
class _HashLink implements m.NodeVisitor {
149+
class _HashLink extends html_parsing.TreeVisitor {
145150
@override
146-
void visitText(m.Text text) {}
151+
void visitElement(html.Element element) {
152+
super.visitElement(element);
147153

148-
@override
149-
bool visitElementBefore(m.Element element) => true;
154+
final isHeaderWithHash = element.attributes.containsKey('id') &&
155+
_structuralHeaderTags.contains(element.localName!);
150156

151-
@override
152-
void visitElementAfter(m.Element element) {
153-
final isHeaderWithHash = element.generatedId != null &&
154-
_structuralHeaderTags.contains(element.tag);
155157
if (isHeaderWithHash) {
156-
_addHashLink(element, element.generatedId!);
158+
_addHashLink(element, element.attributes['id']!);
157159
}
158160
}
159161

160-
void _addHashLink(m.Element element, String id) {
162+
void _addHashLink(html.Element element, String id) {
161163
final currentClasses = element.attributes['class'] ?? '';
162164
element.attributes['class'] = '$currentClasses hash-header'.trim();
163-
element.children!.addAll([
164-
m.Text(' '),
165-
m.Element('a', [m.Text('#')])
165+
element.append(html.Text(' '));
166+
element.append(
167+
html.Element.tag('a')
168+
..text = '#'
166169
..attributes['href'] = '#$id'
167170
..attributes['class'] = 'hash-link',
168-
]);
171+
);
169172
}
170173
}
171174

app/test/frontend/golden/help_page.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ <h3 class="foldable-button">
115115
<img class="standalone-side-image" src="/static/hash-%%etag%%/img/packages-side.webp" alt="" width="400" height="400" role="presentation"/>
116116
</div>
117117
<div class="standalone-content">
118-
<h1 class="hash-header" id="help">
118+
<h1 id="help" class="hash-header">
119119
Help
120120
<a href="#help" class="hash-link">#</a>
121121
</h1>

app/test/frontend/golden/pkg_show_page.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ <h3 class="detail-lead-title">Metadata</h3>
218218
<div class="detail-container detail-body-main">
219219
<div class="detail-tabs-content">
220220
<section class="tab-content detail-tab-readme-content -active markdown-body">
221-
<h1 class="hash-header" id="oxygen">
221+
<h1 id="oxygen" class="hash-header">
222222
oxygen
223223
<a href="#oxygen" class="hash-link">#</a>
224224
</h1>

app/test/frontend/golden/pkg_show_page_discontinued.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ <h3 class="detail-lead-title">Metadata</h3>
211211
<div class="detail-container detail-body-main">
212212
<div class="detail-tabs-content">
213213
<section class="tab-content detail-tab-readme-content -active markdown-body">
214-
<h1 class="hash-header" id="pkg">
214+
<h1 id="pkg" class="hash-header">
215215
pkg
216216
<a href="#pkg" class="hash-link">#</a>
217217
</h1>

app/test/frontend/golden/pkg_show_page_flutter_plugin.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ <h3 class="detail-lead-title">Metadata</h3>
207207
<div class="detail-container detail-body-main">
208208
<div class="detail-tabs-content">
209209
<section class="tab-content detail-tab-readme-content -active markdown-body">
210-
<h1 class="hash-header" id="flutter_titanium">
210+
<h1 id="flutter_titanium" class="hash-header">
211211
flutter_titanium
212212
<a href="#flutter_titanium" class="hash-link">#</a>
213213
</h1>

app/test/frontend/golden/pkg_show_page_publisher.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ <h3 class="detail-lead-title">Metadata</h3>
206206
<div class="detail-container detail-body-main">
207207
<div class="detail-tabs-content">
208208
<section class="tab-content detail-tab-readme-content -active markdown-body">
209-
<h1 class="hash-header" id="neon">
209+
<h1 id="neon" class="hash-header">
210210
neon
211211
<a href="#neon" class="hash-link">#</a>
212212
</h1>

app/test/frontend/golden/pkg_show_page_retracted.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ <h3 class="detail-lead-title">Metadata</h3>
194194
<div class="detail-container detail-body-main">
195195
<div class="detail-tabs-content">
196196
<section class="tab-content detail-tab-readme-content -active markdown-body">
197-
<h1 class="hash-header" id="pkg">
197+
<h1 id="pkg" class="hash-header">
198198
pkg
199199
<a href="#pkg" class="hash-link">#</a>
200200
</h1>

app/test/frontend/golden/pkg_show_page_retracted_non_retracted_version.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ <h3 class="detail-lead-title">Metadata</h3>
202202
<div class="detail-container detail-body-main">
203203
<div class="detail-tabs-content">
204204
<section class="tab-content detail-tab-readme-content -active markdown-body">
205-
<h1 class="hash-header" id="pkg">
205+
<h1 id="pkg" class="hash-header">
206206
pkg
207207
<a href="#pkg" class="hash-link">#</a>
208208
</h1>

app/test/frontend/golden/pkg_show_version_page.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ <h3 class="detail-lead-title">Metadata</h3>
212212
<div class="detail-container detail-body-main">
213213
<div class="detail-tabs-content">
214214
<section class="tab-content detail-tab-readme-content -active markdown-body">
215-
<h1 class="hash-header" id="oxygen">
215+
<h1 id="oxygen" class="hash-header">
216216
oxygen
217217
<a href="#oxygen" class="hash-link">#</a>
218218
</h1>

app/test/shared/markdown_test.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ void main() {
1414

1515
test('render link id and class', () {
1616
expect(markdownToHtml('# ABC def'),
17-
'<h1 class="hash-header" id="abc-def">ABC def <a href="#abc-def" class="hash-link">#</a></h1>\n');
17+
'<h1 id="abc-def" class="hash-header">ABC def <a href="#abc-def" class="hash-link">#</a></h1>\n');
1818
});
1919

2020
test('task list', () {
@@ -298,7 +298,7 @@ void main() {
298298
'\n'
299299
'- change1',
300300
isChangelog: true),
301-
'<h1 class="hash-header" id="changelog">Changelog <a href="#changelog" class="hash-link">#</a></h1>\n'
301+
'<h1 id="changelog" class="hash-header">Changelog <a href="#changelog" class="hash-link">#</a></h1>\n'
302302
'<div class="changelog-entry">\n'
303303
'<h2 class="changelog-version hash-header" id="100">1.0.0 <a href="#100" class="hash-link">#</a></h2>\n'
304304
'<div class="changelog-content">\n'
@@ -316,7 +316,7 @@ void main() {
316316
'## 1.0.0\n\n- change1\n\n- change2\n\n'
317317
'## 0.9.0\n\nMostly refactoring',
318318
isChangelog: true),
319-
'<h1 class="hash-header" id="changelog">Changelog <a href="#changelog" class="hash-link">#</a></h1>\n'
319+
'<h1 id="changelog" class="hash-header">Changelog <a href="#changelog" class="hash-link">#</a></h1>\n'
320320
'<div class="changelog-entry">\n'
321321
'<h2 class="changelog-version hash-header" id="100">1.0.0 <a href="#100" class="hash-link">#</a></h2>\n'
322322
'<div class="changelog-content">\n'
@@ -362,7 +362,7 @@ void main() {
362362
expect(lines.where((l) => l.contains('changelog-version')), [
363363
'<h2 class="changelog-version hash-header" id="210">2.1.0 <a href="#210" class="hash-link">#</a></h2>',
364364
'<h2 class="changelog-version hash-header" id="200">2.0.0 <a href="#200" class="hash-link">#</a></h2>',
365-
'<h2 class="changelog-version hash-header" id="100-2">1.0.0 <a href="#100" class="hash-link">#</a></h2>',
365+
'<h2 class="changelog-version hash-header" id="100-2">1.0.0 <a href="#100-2" class="hash-link">#</a></h2>',
366366
]);
367367
});
368368

0 commit comments

Comments
 (0)