@@ -75,24 +75,56 @@ export function descriptionElementFromHash (anything = false) {
75
75
76
76
// Matches a subheader in particular
77
77
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 )
88
104
}
105
+ previous = previous . previousElementSibling
89
106
}
107
+ parent = parent . parentNode
108
+ }
109
+ return null
110
+ }
90
111
91
- div . append ( ...nodes )
92
- return div
112
+ function headingPreview ( element ) {
113
+ const div = document . createElement ( 'div' )
114
+ const nodes = [ element ]
115
+
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
+ }
93
124
}
94
125
95
- return null
126
+ div . append ( ...nodes )
127
+ return div
96
128
}
97
129
98
130
/**
0 commit comments