MediaWiki:Common.js: Difference between revisions

No edit summary
No edit summary
Line 113: Line 113:
   var translatableSpans = [];
   var translatableSpans = [];


   function tagTextNodes() {
  // ── TOC active highlight (CSS-driven, MutationObserver backup) ──
     var content = document.querySelector('.mw-parser-output');
   function watchTocActive() {
     if (!content) return;
     var toc = document.querySelector('.vector-toc');
     if (!toc || toc._grObserved) return;
    toc._grObserved = true;


     var walker = document.createTreeWalker(content, NodeFilter.SHOW_TEXT);
     var observer = new MutationObserver(function (mutations) {
    var nodes = [];
      mutations.forEach(function (m) {
    while (walker.nextNode()) nodes.push(walker.currentNode);
        if (m.attributeName !== 'class') return;
        var li = m.target;
        var link = li.querySelector(':scope > .vector-toc-link');
        if (!link) return;
        if (li.classList.contains('vector-toc-list-item-active')) {
          link.style.color = '#f57c00';
          link.style.fontWeight = '700';
        } else {
          link.style.color = '';
          link.style.fontWeight = '';
        }
      });
    });


     nodes.forEach(function (node) {
     toc.querySelectorAll('.vector-toc-list-item').forEach(function (li) {
      var p = node.parentNode;
       observer.observe(li, { attributes: true, attributeFilter: ['class'] });
      if (!p) return;
      // Skip already tagged
      if (p.hasAttribute && p.hasAttribute('data-deva')) return;
      // Skip UI elements
      if (p.closest) {
        if (p.closest('.gr-script-bar') ||
            p.closest('.vector-toc') ||
            p.closest('#toc') ||
            p.closest('.mw-editsection')) return;
      }
      var orig = node.textContent;
      if (!orig.trim()) return;
      // Wrap in span with original stored
       var span = document.createElement('span');
      span.setAttribute('data-deva', orig);
      span.textContent = orig;
      p.replaceChild(span, node);
      translatableSpans.push(span);
     });
     });
   }
   }