MediaWiki:Common.js: Difference between revisions
No edit summary |
No edit summary |
||
| Line 961: | Line 961: | ||
if ( !needle || needle.length < 4 ) return; | if ( !needle || needle.length < 4 ) return; | ||
var content = document.querySelector( '.mw-parser-output' ); | // Wait for tagTextNodes() to finish wrapping text in data-deva spans, | ||
// then search those spans rather than raw text nodes. | |||
function doHighlight() { | |||
var content = document.querySelector( '.mw-parser-output' ); | |||
if ( !content ) return; | |||
var snippet = needle.slice( 0, 40 ); | |||
var found = false; | |||
// Search data-deva spans first (post-tagTextNodes state) | |||
var spans = content.querySelectorAll( '[data-deva]' ); | |||
for ( var i = 0; i < spans.length && !found; i++ ) { | |||
var spanEl = spans[ i ]; | |||
var | var orig = spanEl.getAttribute( 'data-deva' ) || ''; | ||
if ( orig.indexOf( snippet ) === -1 ) continue; | |||
// Replace the span with: text-before + <mark> + text-after | |||
var | var idx = orig.indexOf( snippet ); | ||
if ( | var hlText = orig.slice( idx, Math.min( idx + needle.length, orig.length ) ); | ||
var mark = document.createElement( 'mark' ); | |||
mark.className = 'gr-ullekha-highlight'; | |||
mark.style.cssText = 'background:#fff176;border-radius:2px;padding:0 2px;'; | |||
mark.textContent = hlText; | |||
var parent = spanEl.parentNode; | |||
if ( !parent ) continue; | |||
var before = document.createTextNode( orig.slice( 0, idx ) ); | |||
var after = document.createTextNode( orig.slice( idx + hlText.length ) ); | |||
parent.insertBefore( before, spanEl ); | |||
parent.insertBefore( mark, spanEl ); | |||
parent.insertBefore( after, spanEl ); | |||
parent.removeChild( spanEl ); | |||
setTimeout( function () { | |||
mark.scrollIntoView( { behavior: 'smooth', block: 'center' } ); | |||
}, 100 ); | |||
found = true; | |||
} | |||
// Fallback: raw text nodes (before tagTextNodes runs) | |||
if ( !found ) { | |||
var walker = document.createTreeWalker( content, NodeFilter.SHOW_TEXT ); | |||
while ( walker.nextNode() && !found ) { | |||
var node = walker.currentNode; | |||
var txt = node.textContent || ''; | |||
if ( txt.indexOf( snippet ) === -1 ) continue; | |||
var idx2 = txt.indexOf( snippet ); | |||
var mark2 = document.createElement( 'mark' ); | |||
mark2.className = 'gr-ullekha-highlight'; | |||
mark2.style.cssText = 'background:#fff176;border-radius:2px;padding:0 2px;'; | |||
mark2.textContent = txt.slice( idx2, Math.min( idx2 + needle.length, txt.length ) ); | |||
var p = node.parentNode; | |||
p.insertBefore( document.createTextNode( txt.slice( 0, idx2 ) ), node ); | |||
p.insertBefore( mark2, node ); | |||
p.insertBefore( document.createTextNode( txt.slice( idx2 + mark2.textContent.length ) ), node ); | |||
p.removeChild( node ); | |||
setTimeout( function () { | setTimeout( function () { | ||
mark2.scrollIntoView( { behavior: 'smooth', block: 'center' } ); | |||
}, | }, 100 ); | ||
found = true; | found = true; | ||
} | } | ||
} | } | ||
} | } | ||
// Delay to let tagTextNodes() and MW rendering finish | |||
setTimeout( doHighlight, 600 ); | |||
} | } | ||