@@ -25,21 +25,27 @@ window.POG=(function() {
25
25
26
26
function getClosestSibling ( node , siblings ) {
27
27
var copies = siblings . slice ( 0 ) ;
28
- copies . push ( node ) ;
29
- var closest = copies . length - 1 ;
30
- var nodeIndex = [ ] . indexOf . call ( copies , node ) ;
28
+ copies . unshift ( node ) ;
29
+ var copiesLength = copies . length ;
30
+ var closest = 1 ;
31
+
32
+ if ( closest > copiesLength ) {
33
+ closest = 0 ;
34
+ }
35
+
36
+ var nodeIndex = 0 ;
31
37
var siblingIndex = closest ;
32
38
33
- for ( var i = 0 , j = copies . length ; i < j ; i ++ ) {
39
+ for ( var i = 0 ; i < copiesLength ; i ++ ) {
34
40
var delta = Math . abs ( nodeIndex - i ) ;
35
41
36
- if ( delta < closest ) {
42
+ if ( delta > closest ) {
37
43
closest = delta ;
38
44
siblingIndex = i ;
39
45
}
40
46
}
41
47
42
- return ( siblingIndex === ( copies . length - 1 ) ) ? null : copies [ siblingIndex ] ;
48
+ return ( siblingIndex === 0 ) ? null : copies [ siblingIndex ] ;
43
49
}
44
50
45
51
function getComments ( root ) {
@@ -154,22 +160,18 @@ window.POG=(function() {
154
160
var text = '' ;
155
161
156
162
if ( node . id ) {
157
- text = getLabelTextFor ( node . id ) ;
163
+ text = getLabelTextFor ( node , 'id' ) ;
158
164
}
159
165
160
166
if ( text === '' && node . name ) {
161
167
// non-standard, but it happens
162
- text = getLabelTextFor ( node . name ) ;
168
+ text = getLabelTextFor ( node , ' name' ) ;
163
169
}
164
170
165
171
if ( text === '' ) {
166
172
// find label from siblings
167
173
// TODO: should use more aggressive collector
168
- labels = Array . filter ( [ ] . slice . call ( node . parentNode . children ) ,
169
- function ( item , index ) {
170
- return item . nodeName === 'LABEL' ;
171
- } ) ;
172
-
174
+ var labels = node . parentNode . querySelectorAll ( 'label' ) ;
173
175
var label = getClosestSibling ( node , labels ) ;
174
176
175
177
if ( label ) {
@@ -181,17 +183,31 @@ window.POG=(function() {
181
183
return text ;
182
184
}
183
185
184
- function getLabelTextFor ( identifier ) {
185
- var label = null ;
186
+ function getLabelTextFor ( node , attribute ) {
187
+ var identifier = node . getAttribute ( attribute ) || node [ attribute ] || '' ;
186
188
var text = '' ;
187
189
188
190
if ( identifier ) {
189
- label = document . querySelector ( 'label[for="' + identifier + '"]' ) ;
191
+ var label = document . querySelector ( 'label[for="' + identifier + '"]' ) ;
190
192
191
193
if ( label ) {
192
194
text = label . textContent || label . innerText || '' ;
193
195
text = text . trim ( ) ;
194
196
}
197
+
198
+ if ( text === '' ) {
199
+ var identifierLowered = identifier . toLowerCase ( ) ;
200
+ var labels = Array . filter ( document . querySelectorAll ( 'label[for]' ) , function ( item ) {
201
+ return item . getAttribute ( 'for' ) . toLowerCase ( ) === identifierLowered ;
202
+ } ) ;
203
+
204
+ label = getClosestSibling ( node , labels ) ;
205
+
206
+ if ( label ) {
207
+ text = label . textContent || label . innerText || '' ;
208
+ text = text . trim ( ) ;
209
+ }
210
+ }
195
211
}
196
212
197
213
return text ;
0 commit comments