@@ -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
0 commit comments