@@ -75,24 +75,56 @@ export function descriptionElementFromHash (anything = false) {
7575
7676 // Matches a subheader in particular
7777 if ( headingTagNames . includes ( element . tagName ) ) {
78- const div = document . createElement ( 'div' )
79- const nodes = [ element ]
80-
81- // Capture all nodes under the current heading level.
82- let node = element
83- while ( ( node = node . nextSibling ) ) {
84- if ( headingTagNames . includes ( node . tagName ) && node . tagName <= element . tagName ) {
85- break
86- } else {
87- nodes . push ( node )
78+ return headingPreview ( element )
79+ }
80+
81+ const nearestHeading = findNearestAboveHeading ( element )
82+
83+ if ( nearestHeading ) {
84+ return nearestHeading
85+ } else {
86+ return document . getElementById ( 'top-content' )
87+ }
88+ }
89+
90+ function findNearestAboveHeading ( element ) {
91+ let previous = element . previousElementSibling
92+ while ( previous ) {
93+ if ( headingTagNames . includes ( previous . tagName ) ) {
94+ return headingPreview ( previous )
95+ }
96+ previous = previous . previousElementSibling
97+ }
98+ let parent = element . parentNode
99+ while ( parent ) {
100+ previous = parent . previousElementSibling
101+ while ( previous ) {
102+ if ( headingTagNames . includes ( previous . tagName ) ) {
103+ return headingPreview ( previous )
88104 }
105+ previous = previous . previousElementSibling
89106 }
107+ parent = parent . parentNode
108+ }
109+ return null
110+ }
111+
112+ function headingPreview ( element ) {
113+ const div = document . createElement ( 'div' )
114+ const nodes = [ element ]
90115
91- div . append ( ...nodes )
92- return div
116+ // Capture all nodes under the current heading level.
117+ let node = element
118+ while ( ( node = node . nextSibling ) ) {
119+ if ( headingTagNames . includes ( node . tagName ) && node . tagName <= element . tagName ) {
120+ break
121+ } else {
122+ nodes . push ( node )
123+ }
93124 }
94125
95- return null
126+ div . append ( ...nodes )
127+ return div
96128}
97129
98130/**
0 commit comments