dynamic-toc

Von $1

    Inhaltsverzeichnis
    keine Gliederung

    Version seit 15:43, 5 Nov 2026

    zu dieser Version.

    Zurück zu Versionshistorie.

    Zeige aktuelle Version

    (function(){'use strict';function startTracker(){var CONFIG={selectors:'h2,h3,h4',threshold:0.35,throttle:80,range:2,excludeTexts:['Von $1','*Edit'],excludeContainers:['.deki-page-titlex','#siteSubx'],bottomDefault:110,bottomMenuOpen:300,maxRetries:30,retryDelay:300,longPageThreshold:3000};var panel=document.createElement('div');panel.id='trackerPageContent';panel.style.cssText='position:fixed;bottom:110px;left:20px;width:250px;z-index:2147483000;pointer-events:none;opacity:1;transition:bottom .3s,opacity .4s';var list=document.createElement('div');list.className='tracker-list';list.id='trackerList';list.style.cssText='display:flex;flex-direction:column;gap:6px';panel.appendChild(list);document.body.appendChild(panel);var menuToggle=document.querySelector('.menu-toggle-icon');var headings=[];var currentIndex=-1;var timer;var menuOpen=false;var showThreshold=0;var scrollThreshold=0;var useIconTrigger=false;function checkPageHeight(){var pageHeight=Math.max(document.documentElement.scrollHeight||0,document.body.scrollHeight||0);if(pageHeight<CONFIG.longPageThreshold){var triggerIcon=document.querySelector('img[src="/skins/common/icons/icon-trans.gif"][width="185"]');if(triggerIcon){var rect=triggerIcon.getBoundingClientRect();showThreshold=rect.bottom+(window.pageYOffset||document.documentElement.scrollTop);useIconTrigger=true}}else{useIconTrigger=false;scrollThreshold=window.innerHeight}}if(menuToggle){menuToggle.addEventListener('click',function(){menuOpen=!menuOpen;panel.style.bottom=menuOpen?CONFIG.bottomMenuOpen+'px':CONFIG.bottomDefault+'px'})}function collectHeadings(){var seenTexts=[];headings=Array.from(document.querySelectorAll(CONFIG.selectors)).filter(function(h){for(var i=0;i<CONFIG.excludeContainers.length;i++){if(h.closest(CONFIG.excludeContainers[i]))return false}return true}).map(function(h){return{el:h,text:h.textContent.trim()}}).filter(function(h){for(var i=0;i<CONFIG.excludeTexts.length;i++){var pattern=CONFIG.excludeTexts[i];if(pattern.startsWith('*')&&h.text.endsWith(pattern.substring(1)))return false;if(pattern.endsWith('*')&&h.text.startsWith(pattern.slice(0,-1)))return false;if(h.text===pattern)return false}if(seenTexts.includes(h.text))return false;seenTexts.push(h.text);return true})}function getTop(el){var rect=el.getBoundingClientRect();return rect.top+(window.pageYOffset||document.documentElement.scrollTop)}function findCurrent(){if(!headings.length)return 0;var scrollPos=window.pageYOffset||document.documentElement.scrollTop;var viewportHeight=window.innerHeight;var pageHeight=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);if(scrollPos+viewportHeight>=pageHeight-100){return headings.length-1}var triggerPoint=scrollPos+(viewportHeight*CONFIG.threshold);for(var i=headings.length-1;i>=0;i--){var top=getTop(headings[i].el);if(triggerPoint>=top){return i}}return 0}function updateVisibility(){var scrollPos=window.pageYOffset||document.documentElement.scrollTop;if(useIconTrigger){if(scrollPos>showThreshold){panel.style.opacity='1'}else{panel.style.opacity='0'}}else{if(scrollPos>scrollThreshold){panel.style.opacity='1'}else{panel.style.opacity='0'}}}function render(){list.innerHTML='';if(!headings.length)return;var start=Math.max(0,currentIndex-CONFIG.range);var end=Math.min(headings.length-1,currentIndex+CONFIG.range);for(var i=start;i<=end;i++){var item=document.createElement('div');item.className='tracker-item';item.style.cssText='line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:all .25s';if(i===currentIndex){item.style.fontSize='22px';item.style.fontWeight='600';item.style.color='#06C'}else if(Math.abs(i-currentIndex)===1){item.style.fontSize='16px';item.style.color='#777'}else{item.style.fontSize='14px';item.style.color='#7777776b'}item.textContent=headings[i].text;list.appendChild(item)}}function update(){updateVisibility();if(!headings.length)return;var idx=findCurrent();if(idx!==currentIndex){currentIndex=idx;render()}}window.addEventListener('scroll',function(){clearTimeout(timer);timer=setTimeout(update,CONFIG.throttle)},{passive:true});window.addEventListener('resize',function(){checkPageHeight();update()});function init(attempt){checkPageHeight();collectHeadings();if(headings.length>0){currentIndex=findCurrent();render();updateVisibility();return}if(attempt<CONFIG.maxRetries){setTimeout(function(){init(attempt+1)},CONFIG.retryDelay)}}if(document.readyState==='complete'){setTimeout(function(){init(0)},2000)}else{window.addEventListener('load',function(){setTimeout(function(){init(0)},2000)})}}if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',startTracker)}else{startTracker()}})();

     
    Use the language selection below for English Utilise le sélecteur de langue ci-dessous pour français Per l'italiano, utilizzare la selezione della lingua qui sotto Schön sprichst du deutsch :-)