javascript:(function(){ /* # --- 【ブロック1】 初期化とCSS設定 --- */ const d=document,g=i=>d.getElementById(i),c=t=>d.createElement(t);const eW=g('fE-w');if(eW)eW.remove();const oS=g('fE-st');if(oS)oS.remove();const st=c('style');st.id='fE-st'; st.innerHTML='#fE-s{position:fixed;top:32px;right:0;width:30%;height:calc(100% - 32px);background:var(--fE-bg);border-left:2px solid #800000;z-index:9999;display:flex;flex-direction:column;color:#800000;box-shadow:-2px 0 5px rgba(0,0,0,.2);transition:transform .3s ease}#fE-s.fE-dark{--fE-bg:#1a1a1a;--fE-bg2:#2a2020;--fE-bg3:#2e2424;--fE-txt:#e8d5b0;--fE-brd:#a05050}#fE-s:not(.fE-dark){--fE-bg:#F5F5DC;--fE-bg2:#F0E0D6;--fE-bg3:#FFE;--fE-txt:#800000;--fE-brd:#800000}#fE-s{color:var(--fE-txt)}#fE-h{padding:6px 10px;border-bottom:1px solid var(--fE-brd);background:var(--fE-bg);position:relative;cursor:move}#fE-btns{display:flex;gap:4px;margin-bottom:4px}#fE-btns button{cursor:pointer;background:var(--fE-bg);border:1px solid var(--fE-brd);color:var(--fE-txt);padding:2px 8px;font-size:12px;flex:1}#fE-btns button.fE-on{background:var(--fE-brd);color:var(--fE-bg)}#fE-cfg{overflow:hidden;transition:max-height .2s ease}#fE-cfg.fE-hide{max-height:0!important}.fE-hl-row{margin-bottom:4px;display:flex;align-items:center;width:100%;border-top:1px solid var(--fE-brd);padding-top:4px}.fE-hl-row label{width:40px;font-size:12px;cursor:default;flex-shrink:0}.fE-r{margin-bottom:4px;display:flex;align-items:center;width:100%}.fE-r label{width:40px;font-size:12px;cursor:default;flex-shrink:0}.fE-ib{flex:1;border:1px solid #ccc;padding:2px;box-sizing:border-box;background:#fff;min-height:20px;white-space:nowrap;overflow:hidden;font-size:13px;cursor:text;color:#333}.fE-ib:empty:before{content:attr(data-placeholder);color:#888}#fE-ai{width:38px;border:1px solid var(--fE-brd);padding:2px;font-size:12px;text-align:center;background:var(--fE-bg);color:var(--fE-txt)}#fE-jup,#fE-jdn{cursor:pointer;background:var(--fE-bg);border:1px solid var(--fE-brd);color:var(--fE-txt);padding:2px 4px;font-size:10px;line-height:1}#fE-l{flex:1;overflow-y:auto;padding:10px;padding-left:45px}.fE-ic{position:relative;margin-bottom:10px}.fE-cb{position:absolute;left:-35px;top:0;width:30px;height:100%;text-align:center;cursor:pointer;border:none;background:var(--fE-bg2);color:var(--fE-txt);font-size:16px;display:flex;align-items:center;justify-content:center;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24);transition:all .3s ease}.fE-cb:hover{box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23)}.fE-i{border:1px solid var(--fE-brd);padding:5px;cursor:pointer;background:var(--fE-bg2);color:var(--fE-txt);font-size:14px;word-break:break-all;min-height:40px;display:flow-root}.fE-rn{font-weight:bold;font-size:12px;display:flex;align-items:center;gap:4px;border-bottom:1px solid var(--fE-brd);margin-bottom:2px;cursor:pointer;color:var(--fE-txt)}.fE-rn:hover{text-decoration:underline}.fE-rn-ico{font-size:10px;opacity:.7}.fE-hl{background-color:#ff0;color:#000;font-weight:bold}.fE-cc{float:right;color:green;font-weight:bold;font-size:12px;margin-left:5px;white-space:nowrap}#fE-mb{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.7);z-index:10000;display:flex;align-items:center;justify-content:center}#fE-m{background:#FFE;border:3px solid #800000;width:60%;max-height:90%;display:flex;flex-direction:column;position:relative}#fE-mc{position:absolute;top:5px;right:10px;cursor:pointer;font-weight:bold;z-index:10001}#fE-mj{position:absolute;top:5px;left:10px;cursor:pointer;background:#fff;border:1px solid #800000;padding:2px 5px;font-size:12px;font-weight:bold;z-index:10001}#fE-mco{padding:20px;overflow-y:auto;flex:1}.fE-ob{display:flow-root;min-height:100px;padding-top:20px}.fE-mbr{display:flex;gap:10px;padding:15px 0;border-top:1px solid #800000;border-bottom:1px dashed #800000;margin:15px 0}.fE-mbn{cursor:pointer;border:none;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24);background:#fff;color:#800000;padding:5px 10px;font-size:12px;transition:all .3s ease}#fE-vh{padding:6px 10px;border-bottom:1px solid #800000;background:#F5F5DC}#fE-vh-r1,#fE-vh-r2{display:flex;align-items:center;gap:4px;margin-bottom:4px}#fE-vh-r2{margin-bottom:0}.fE-vl{font-size:12px;white-space:nowrap;color:#800000}.fE-vi{flex:1;border:1px solid #ccc;padding:2px;font-size:12px;background:#fff;color:#333;min-width:0}.fE-vi:disabled{background:#ddd;color:#999}#fE-s.fE-min{transform:translateX(100%)}#fE-tg{position:absolute;left:-24px;top:50%;transform:translateY(-50%);width:24px;height:40px;background:var(--fE-bg);border:1px solid var(--fE-brd);border-right:none;color:var(--fE-txt);cursor:pointer;z-index:10002;display:flex;align-items:center;justify-content:center;border-radius:4px 0 0 4px;font-size:12px;font-weight:bold}#fE-scrl{position:absolute;top:5px;right:20px;display:flex;flex-direction:column;gap:2px;z-index:10}.fE-sb{background:var(--fE-bg);border:1px solid var(--fE-brd);color:var(--fE-txt);cursor:pointer;padding:2px 5px;font-size:12px;opacity:0.7}.fE-sb:hover{opacity:1}'; d.head.appendChild(st); /* # --- 【ブロック2】 UI構築と初期設定 --- */ const sb=c('div');sb.id='fE-s';let oW=c('div');oW.id='fE-w';oW.appendChild(sb);d.body.appendChild(oW); try{const w=localStorage.getItem('fEW');if(w)sb.style.width=w+'px'}catch(e){} /* ⇔格納ボタン */ const tgB=c('button');tgB.id='fE-tg';tgB.innerText='⇔';tgB.title='サイドバー格納/展開';sb.appendChild(tgB); const hd=c('div');hd.id='fE-h';sb.appendChild(hd); /* ボタン行 */ const bRow=c('div');bRow.id='fE-btns';hd.appendChild(bRow); const uB=c('button');uB.id='fE-u';uB.innerText='更新';bRow.appendChild(uB); const aB=c('button');aB.id='fE-a';aB.innerText='自動';bRow.appendChild(aB); const stB=c('button');stB.id='fE-st2';stB.innerText='設定';bRow.appendChild(stB); const vB=c('button');vB.id='fE-v';vB.innerText='閲覧';bRow.appendChild(vB); const cB=c('button');cB.id='fE-c';cB.innerText='終了';bRow.appendChild(cB); /* 設定パネル(デフォルト格納) */ const cfg=c('div');cfg.id='fE-cfg';cfg.className='fE-hide';hd.appendChild(cfg); let iS='お願い 出来ま 下さい ください',iE='',iH=''; try{iS=localStorage.getItem('fES')||iS;iE=localStorage.getItem('fEE')||'';iH=localStorage.getItem('fEH')||''}catch(e){} /* 検索行:ダークモードボタン付き */ const sR=c('div');sR.className='fE-r';cfg.appendChild(sR); sR.innerHTML='
'; const dkB=c('button');dkB.id='fE-dk';dkB.innerText='🌙';dkB.style.cssText='cursor:pointer;background:var(--fE-bg);border:1px solid var(--fE-brd);color:var(--fE-txt);padding:2px 5px;font-size:12px;margin-left:3px;flex-shrink:0';sR.appendChild(dkB); /* 除外行:自動更新秒数スロット付き */ const eR=c('div');eR.className='fE-r';cfg.appendChild(eR); eR.innerHTML=''; const aiLabel=c('span');aiLabel.style.cssText='font-size:11px;margin-left:3px;flex-shrink:0;color:var(--fE-txt)';aiLabel.innerText='秒'; const aiInput=c('input');aiInput.type='number';aiInput.id='fE-ai';aiInput.min='10';aiInput.max='3600';aiInput.value='60';aiInput.title='自動更新間隔(秒)'; try{aiInput.value=localStorage.getItem('fEAI')||'60'}catch(e){} eR.appendChild(aiInput);eR.appendChild(aiLabel); const sI=g('fE-si');sI.innerText=iS; const eI=g('fE-ei');eI.innerText=iE; /* 設定展開/格納 */ const openCfg=()=>{cfg.style.maxHeight=cfg.scrollHeight+50+'px';cfg.classList.remove('fE-hide');stB.classList.add('fE-on')}; const closeCfg=()=>{cfg.style.maxHeight='0';cfg.classList.add('fE-hide');stB.classList.remove('fE-on')}; stB.onclick=()=>{if(cfg.classList.contains('fE-hide'))openCfg();else closeCfg()}; /* ダークモードトグル */ let darkOn=false;try{darkOn=localStorage.getItem('fEDK')==='1'}catch(e){} const applyDark=()=>{if(darkOn){sb.classList.add('fE-dark');dkB.innerText='☀'}else{sb.classList.remove('fE-dark');dkB.innerText='🌙'}}; applyDark(); dkB.onclick=()=>{darkOn=!darkOn;try{localStorage.setItem('fEDK',darkOn?'1':'0')}catch(e){}applyDark()}; /* 強調バー:設定パネル外・常時表示 */ const hRow=c('div');hRow.className='fE-hl-row';hd.appendChild(hRow); hRow.innerHTML=''; const hI=g('fE-hi'); const jUpB=g('fE-jup'),jDnB=g('fE-jdn'); try{hI.innerText=localStorage.getItem('fEH')||''}catch(e){} /* 強調バー:エンターで▼ボタンと同じ挙動(ジャンプ)を実行 */ hI.onkeydown=e=>{if(e.key==='Enter'){e.preventDefault();jDnB.click()}}; /* レス表示エリアとスクロールジャンプボタンのラッパー */ const lAW=c('div');lAW.style.cssText='position:relative;flex:1;display:flex;flex-direction:column;overflow:hidden'; const lA=c('div');lA.id='fE-l'; const scrl=c('div');scrl.id='fE-scrl'; scrl.innerHTML=''; lAW.appendChild(lA);lAW.appendChild(scrl);sb.appendChild(lAW); /* # --- 【ブロック3】 イベントリスナーとリサイズ・移動処理 --- */ let aRM=new Map(),cM=new Map(),hE=[],hI_idx=0,dF=0,x=0,y=0,a=0,b=0,c_kS='',c_eS='',c_hS=''; let autoTimer=null,autoOn=false; hd.onmousedown=e=>{if(e.target.closest('button,input,.fE-ib,.fE-rs'))return;dF=1;x=e.clientX;y=e.clientY;const r=sb.getBoundingClientRect();a=r.left;b=r.top;sb.style.left=a+'px';sb.style.top=b+'px';sb.style.right='auto';d.onmousemove=ev=>{if(!dF)return;sb.style.left=Math.max(0,Math.min(innerWidth-sb.offsetWidth,a+ev.clientX-x))+'px';sb.style.top=Math.max(0,Math.min(innerHeight-sb.offsetHeight,b+ev.clientY-y))+'px'};d.onmouseup=()=>{dF=0;d.onmousemove=d.onmouseup=null};e.preventDefault()}; const mk=(id,sd)=>{let G=c('div');G.id=id;G.className='fE-rs';sb.appendChild(G);G.style.cssText='position:absolute;'+sd+':-5px;top:0;width:10px;height:100%;cursor:ew-resize;z-index:10001';G.onmousedown=e=>{e.stopPropagation();e.preventDefault();const r=sb.getBoundingClientRect(),L=r.left,R=r.right,W=r.width,X=e.clientX;d.onmousemove=ev=>{let nw,nl=L;if(sd==='left'){nw=Math.max(260,Math.min(innerWidth,W-(ev.clientX-X)));nl=R-nw;if(nl<0){nw=R;nl=0}}else{nw=Math.max(260,Math.min(innerWidth-L,W+(ev.clientX-X)))}sb.style.width=nw+'px';sb.style.left=nl+'px';sb.style.right='auto'};d.onmouseup=()=>{try{localStorage.setItem('fEW',parseInt(sb.offsetWidth))}catch(e){}d.onmousemove=d.onmouseup=null}}}; mk('fE-rs-l','left');mk('fE-rs-r','right'); /* 【修正点】格納ボタン・スクロールジャンプボタンのクリック処理追加 */ const tgBtn=g('fE-tg'),sUpBtn=g('fE-sup'),sDnBtn=g('fE-sdn'); if(tgBtn)tgBtn.onclick=()=>sb.classList.toggle('fE-min'); if(sUpBtn)sUpBtn.onclick=()=>lA.scrollTop=0; if(sDnBtn)sDnBtn.onclick=()=>lA.scrollTop=lA.scrollHeight; /* スレッド更新:scrlf リロード + 続きを読むボタン を両方実行 */ const reloadThread=()=>{ const lk=d.querySelector('a[onclick*="scrlf"]');if(lk)lk.click(); const more=d.getElementById('fvw_loading');if(more)more.click(); }; /* 自動更新の開始・停止 */ const startAuto=()=>{ if(autoTimer)clearInterval(autoTimer); autoOn=true;aB.classList.add('fE-on'); const sec=Math.max(10,parseInt(g('fE-ai').value)||60); try{localStorage.setItem('fEAI',sec)}catch(e){} autoTimer=setInterval(()=>{ window.scrollTo({top:d.documentElement.scrollHeight,behavior:'smooth'}); reloadThread(); setTimeout(()=>{rL();lA.scrollTop=lA.scrollHeight},800); },sec*1000); }; const stopAuto=()=>{clearInterval(autoTimer);autoTimer=null;autoOn=false;aB.classList.remove('fE-on')}; /* クリックイベント(モーダル閉じた後の再描画) */ const cE=e=>{if(e.target.closest('#fE-mc')||e.target.id==='fE-mb'||e.target.id==='fE-mj'||e.target.id==='fE-vcb')setTimeout(rL,80);const cT=e.target.closest('a');if(cT&&((cT.getAttribute('onclick')||'').includes('scrlf')||cT.innerText.includes('リロード')))setTimeout(rL,500)}; const sE=()=>{if((window.innerHeight+window.scrollY)>=d.documentElement.scrollHeight-50){clearTimeout(window._fEdU);window._fEdU=setTimeout(rL,300)}}; d.addEventListener('click',cE,true);window.addEventListener('scroll',sE); /* 更新ボタン:スレッド更新(scrlf+続きを読む)→サイドバー再描画 */ uB.onclick=()=>{reloadThread();setTimeout(rL,800)}; /* 自動ボタン:トグル */ aB.onclick=()=>{autoOn?stopAuto():startAuto()}; /* 終了 */ cB.onclick=()=>{stopAuto();oW.remove();st.remove();aRM.clear();cM.clear();hE=[];d.removeEventListener('click',cE,true);window.removeEventListener('scroll',sE)}; /* ▲▼ ジャンプ */ jUpB.onclick=()=>{const k=sI.innerText.replace(/\r?\n/g,' ').trim(),E=eI.innerText.replace(/\r?\n/g,' ').trim(),h=hI.innerText.replace(/\r?\n/g,' ').trim();if(k!==c_kS||E!==c_eS||h!==c_hS)rL();if(hE.length===0)return;hI_idx--;if(hI_idx<0)hI_idx=hE.length-1;hE[hI_idx].scrollIntoView({behavior:'smooth',block:'center'})}; jDnB.onclick=()=>{const k=sI.innerText.replace(/\r?\n/g,' ').trim(),E=eI.innerText.replace(/\r?\n/g,' ').trim(),h=hI.innerText.replace(/\r?\n/g,' ').trim();if(k!==c_kS||E!==c_eS||h!==c_hS)rL();if(hE.length===0)return;if(hI_idx>=hE.length)hI_idx=0;hE[hI_idx].scrollIntoView({behavior:'smooth',block:'center'});hI_idx++}; const hImg=rE=>{const ln=rE.querySelectorAll('a');for(let o of ln){const hr=o.href.toLowerCase();if(hr.endsWith('.jpg')||hr.endsWith('.png')||hr.endsWith('.gif')||hr.endsWith('.webp'))return true}return!!rE.querySelector('img')}; const cTC=(t,bn,oT)=>{navigator.clipboard.writeText(t).then(()=>{bn.innerText='OK';setTimeout(()=>bn.innerText=oT,1000)})}; /* # --- 【ブロック4】 データ抽出とコンテキストマッチング処理 --- */ const sMR=()=>{aRM.clear();cM.clear();d.querySelectorAll('.rtd,.c9-10').forEach(rp=>{if(!rp.querySelector('.rsc,.c9-11'))return;const bq=rp.querySelector('blockquote');if(!bq)return;const rnE=rp.querySelector('.no_quote,.cno,.n');const rN=rnE?rnE.innerText.replace('No.','').trim():null;if(!rN)return;const oL=bq.innerHTML.split(/