インターフェイスを簡素に
MAPの最下部に「1000年度」の枠を設け、これをMAPデータの配列の年度の雛形にしています。 ページを開いた時、その年度のデータを検索し、なければ今年度のMAPのデータ用の配列を追加します。
この配列の追加の後には配列のソートが必要です。 これは、ユーザーがブログ最初からデータをスキャンせず、飛び地の年度をスキャンしたり、前後の年度に移動してスキャンした場合に対応して、その後のデータの処理を扱い易くするためです。
年度の配列のソートは、最初の現在の年度用の配列の検索で、新たに配列を追加した時だけ必要なのですが、全ての画面を開いた時にも行うコードを書いていました。 PCの処理能力は速いので気付かないのですが、この無駄なコードは改めました。
まれに生じるエラー
色々と条件を変えて試していると、まれにぺージを開いた所でエラー停止が生じました。 調べると、高速表示用の「サブコード」と実処理用の「MAINコード」があって、後者の最初で「ストレージデータが無い」と言って停止しています。
下は、ページを開くごとに繰り返す JavaScriptの処理の模式図です。
このツールのコードは、ページデザインを決定し、表示内容をCCSを通じて選択する「styleタグ」をページの表示要素がロードされるより先にHTMLに埋め込むために、高速表示用のSUBコードを JavaScriptで可能な最速タイミングで実行します。
また、実際の表示要素が揃わないと出来ない通常の処理のMAINコードは、
の書式で、SUBコードよりわずかに遅れて実行しています。
最初のSUBコードでも、そのページを開く条件は前のページで指定してストレージに記録し、開いた時にストレージを読み込んで、ページの表示に反映します。
例えば、スキャン実行のボタンを押すと、次に開くページは記事リストは非表示、メニューはスキャン時のメニューという指定をストレージに書き込み、ページをリロードします。 次にこのページがロードされると、このストレージの指定を読み、ページデザインを決める「styleタグ」を埋め込み、また同時にページをスキャンをする指示に従って、MAIN側はスキャンのデータ処理を行います。
JavaScriptはページ毎に実行されますが、その前のページであった事とは全く独立して動作するので、この様なストレージを使った伝達が不可欠です。
で、先の図に戻りますが、エラーは ❶で読んだストレージデータが ❷の場所ではデータがないと言うのです。 上の図では、MAINの最初の ❷でもストレージの読込みを行っていますが、これはこのエラーに陥らないための施策です。 本当は ❷で再読込みは不要なはずですが、細かな機序を説明する知識がないのですが、「タイミング」が間に合わない事がまれにあるらしい。
殆どの場合、❷の再読込みは不要ですが、何かの拍子に ❶が遅くなるか ❷が早く実行されてしまうと言う事があるのでしょう。 両方で同じストレージを読むので、後になった方が上書きすると思いますが...
「最初のページ」をボタンのみにする
最初にMAPの一番下に配置した「ブログの最初のページを表示」のボタンを、後でメニューに追加したのですが、これが無駄に多いので整理しました。 一旦はMAP下のボタンのみに変更したのですが、メニュー上のボタンの方が判り易く、そう困らないと判断し、MAPの側のスイッチを廃止しました。
また、この機能で「1000年1月」のページを一旦表示しますが、下の表示が出ない方法を考えました。
これは「~」を使う「後方にある兄弟要素」を指定するセレクタ表記を利用。
これで「1000年」の「#entryList」が非表示になり、その内部の上記の表示を隠す事が出来ました。 ユーザーには、プログラムが「ただ考えている」様に見えます。
「Every Page Map 💢」 利用上のご注意
これは「非常駐型」のツールです。 このツールを「Tampermonkey」上で「ON」にすると、「記事の編集・削除」の通常のデザインと操作を一部変更します。
この事により、ブログの各種操作で間違いを生じない様に、MAP関連の作業が終了した後は、忘れずに「Every Page Map 💢」を「OFF」にしてください。
▪ ツールの「ON/OFF」は「Tampermonkey」のダッシュボードで行うと確実です。
「Every Page Map 💢」は、そう複雑な操作を必要としませんが、扱い方については、以下のページを参照ください。
「Every Page Map 💢」を利用するには
このツールは Chrome / Edge / Firefox版の拡張機能「Tampermonkey」上で動作します。 以下に、このツールの導入手順を簡単に説明します。
❶「Tampermonkey」を導入します
◎ 使用しているブラウザに拡張機能「Tampermonkey」を導入する事が必要です。
既に「Tampermonkey」を導入している場合は、この手順 ❶ は不要です。
拡張機能の導入については、以下のページに簡単な説明があるので参照ください。
❷「Tampermonkey」にスクリプトを登録します
◎「Tampermonkey」の「+」マークの「新規スクリプト」タブを開きます。
◎「新規スクリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。
〔コピー方法〕 軽量シンプルなツール「PreBox Button 」を使うと
コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」
の操作で、掲載コードのコピーが可能になります。
◎ 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。
〔 Every Page Map 💢 〕 ver. 3.2
// ==UserScript== // @name Every Page Map 💢 // @namespace http://tampermonkey.net/ // @version 3.2 // @description 「記事の編集・削除」ページで全記事の「公開設定」を記録する // @author Ameba Blog User // @match https://blog.ameba.jp/ucs/entry/srventrylist* // @run-at document-start // ==/UserScript== let retry=0; let interval=setInterval(wait_target, 1); function wait_target(){ retry++; if(retry>100){ // リトライ制限 100回 0.1secまで clearInterval(interval); } let target=document.documentElement; // 監視 target if(target){ clearInterval(interval); style_in(); }} let blogDB={}; // 記事ID 投稿フラグ 投稿年月 の配列 let entry_id_DB; // ID検索用の配列 let blogMAP={}; // 公開情報の件数データMAP function write_MAP(){ // セッションストレージ MAP 保存 let write_map_json=JSON.stringify(blogMAP); sessionStorage.setItem('blogMAP_back', write_map_json); } function write_DB(){ // セッションストレージ DB 保存 let write_json=JSON.stringify(blogDB); sessionStorage.setItem('blogDB_back', write_json); } function style_in(){ let read_json=sessionStorage.getItem('blogDB_back'); // ストレージ 保存名 blogDB=JSON.parse(read_json); if(blogDB==null){ blogDB=[['00000000000', 's', 0]]; } // 記事ID, 投稿フラグ, 投稿年月 6桁 // 初要素のみ '00000000000' ドライブモード 's'/'c'/'e' 抽出表示指定 0~3 if(blogDB[0][1]==0){ blogDB[0][1]='s'; } // 旧ファイルやトラブル時の救済 let style= '<style id="EPS">'+ '#globalHeader, #ucsHeader, #ucsMainLeft h1, .l-ucs-sidemenu-area, #ucsMainRight,'+ '.selection-bar, #footerAd, #globalFooter, .checkboxAllControl { display: none !important; }'+ '#ucsContent { width: 840px; background: #fff; box-shadow: 0 0 0 100vh #c5d8e1; '+ 'border-radius: 0; }'+ '#ucsContent::before { content: unset; } '+ '#ucsMain { margin-top: 15px; background: #fff; border-radius: 0; } '+ '#ucsMainLeft { width: 838px; padding: 0 15px; float: none; } '+ '#entryYear { margin: 0 5px; }'+ '#entryMonth { font-size: 14px; overflow: visible; margin-top: 3px }'+ '#entryMonth li, #entryMonth #nowMonthLi { font-weight: bold; padding: 2px 10px 0; }'+ '#entryMonth li a:visited { color: #3970B5; }'+ '#nowMonth { padding: 1px 6px 0; border: none; border-radius: 1px; '+ 'color: #000; box-shadow: 0 0 0 2px #0066cc; }'+ '#entryListEdit form { display: flex; flex-direction: column } #entrySort { order: -2 }'+ '.pagingArea { order: -1; position: relative; padding: 4px 30px 4px 0; margin-bottom: -33px; '+ 'background: #ddedf3 !important }'+ '.pagingArea a { border: 1px solid #888 } .pagingArea .active{ border: 2px solid #0066cc }'+ '.pagingArea a, .pagingArea .active, .pagingArea .disabled { font-size: 14px; line-height: 23px }'+ '#sorting { margin: 38px 0 4px; padding: 4px 10px; height: 110px; '+ 'font: 14px Meiryo; background: #ddedf3; height: auto !important; }'+ '#sorting .pagingArea, #sorting select, #sorting ul { display: none }'+ 'input { font-family: meiryo; font-size: 14px }'+ '#entryList .entry-item { padding: 6px 5px 2px; }'+ '#entryList li:hover{ background-color: #e2eef0 }'+ '#entryList .leftCol, #entryList .titleCol h2{ width: 560px; }'+ '#entryList .leftCol a { text-decoration: none !important; color: #3970b5 !important; }'+ '#entryList dl { font-size: 13px; padding-left: 20px; }'+ '#entryList dl.reactions { margin: -19px 0 -2px 360px; }'+ '#entryList dd { margin-right: 8px; }'+ '#entryList .rightCol { width: 250px; min-width: unset; margin: -2px 0 0 0; }'+ '#entryList .txtCol{ white-space: nowrap; font-size: 13px; margin-bottom: 2px; line-height: 16px }'+ '#entryList .status-text { display: inline-block; width: 64px; padding: 2px 4px 0; overflow: hidden; '+ 'margin-bottom: -4px; font-weight: normal; color: #000; }'+ '#entryList .txtCol .date{ display: inline-block; padding: 2px 4px 0; font-size: 13px; color: #000; }'+ '#entryList .status-text { display: inline-block; font-weight: normal; color: #000; '+ 'width: 64px; padding: 2px 4px 0; overflow: hidden; margin-bottom: -4px; }'+ '#entryList ul input[value="1"] + input + li .txtCol span:first-child{ display: inline-block;'+ 'text-indent: 12px; color: #fff; background: #2196f3 !important }'+ '#entryList ul input[value="2"] + input + li .txtCol span:first-child{ display: inline-block;'+ 'text-indent: 2px; color: #fff; background: #009688 !important }'+ '#entryList .deleteCol { margin-bottom: 0; }'+ '#entryList .deleteCol a { padding: 2px 5px 0; font-size: 14px; text-decoration: none !important; '+ 'border: 1px solid #aaa; border-radius: 4px; background: linear-gradient(0deg, #eee, #fff); }'+ '#entryList .deleteCol a:hover { outline: auto #1976d2; }'+ '#entryList .deleteCol .process + .process, #entryList dd + dd { margin-left: 10px; }'+ '#entryList .deleteCol .process svg { width: 16px; height: 16px; }'+ '#div1 { color: #333; margin: 10px -10px 0 15px; }'+ '#div2 { color: #000; margin: 8px 15px; border: 1px solid #888; background: #fafcfd; }'+ '#list_snap { padding: 2px 0 0; margin: 7px 40px 7px 0; width: 210px; }'+ '#reset { padding: 2px 0 0; margin-right: 20px; width: 60px; }'+ '#export { padding: 2px 0 0; margin: 7px 10px 7px 0; width: 150px; }'+ '#import_sw { padding: 2px 0 0; margin: 7px 10px 7px 0; width: 115px; }'+ '#import_result { display: inline-flex; padding: 2px 0 0; margin: 7px 0; width: 160px; '+ 'overflow: hidden; white-space: nowrap; }'+ '#import { display: none; }'+ '#snap_result { display: inline-block; margin: 6px 12px 4px; }'+ '#div3 { color: #333; margin: 10px 15px; }'+ '#show_map, #start_page, #do_snap { padding: 2px 10px 0; margin-right: 20px; width: auto; }'+ '#amb_menu2, #amb_menu3 { float: right; padding: 2px 10px 0; '+ 'margin: 2px 4px 3px -20px; cursor: pointer; }'+ '#entryYear { width: 120px !important; } '+ '#entryMonth li, #entryMonth #nowMonthLi { padding: 2px 0 0 !important; width: 54px; } '+ '.div_add { display: flex; flex-direction: row; justify-content: space-evenly; width: 758px; '+ 'margin: 8px 15px; padding: 4px 0; border: 1px solid #777; background: #fafcfd; } '+ '.m.y_index { width: 80px; font-size: 18px; text-align: center; outline: none !important; } '+ '.m.y_index p { border: none; padding: 1px 4px 0; } '+ '.m.y_index .yt { font-size: 14px; color: #1976d2; margin: 0 -3px 0 2px; } '+ '.m.y_index .ypt { font-size: 11px; font-weight: normal; text-align: right; '+ 'margin: 0; padding: 5px 7px 0 0; background: none !important; } '+ '.m { display: flex; flex-direction: column; font: bold 14px Meiryo; width: 50px; text-align: right; } '+ '.m:hover { outline: 2px solid #2196f3; cursor: pointer; } '+ '.mt { font-size: 13px; color: #3970bc; padding: 4px 0 0 !important; height: 22px; '+ 'margin-bottom: 3px; text-align: center; border: none !important; } '+ '.m p { padding-right: 14px; margin-top: -1px; border: 1px solid #ccc; outline-offset: -2px; } '+ '.m:not(.y_index) p:not(.mt):hover { outline: 2px solid #2196f3; position: relative; z-index: 1; } '+ '#com1 { padding: 2px 20px 0; margin: 5px 15px; '+ 'font: 14px Meiryo; color: #fff; background: red; } '+ '#com2 { position: absolute; right: 26px; top: 6px; padding: 1px 6px 0; '+ 'font: 14px Meiryo; color: #fff; background: #000; } '+ 'input[value="entry_ym=100001"] + #entrySort { visibility: hidden; } '+ 'input[value="entry_ym=100001"] ~ #entryList { visibility: hidden; } '+ '</style>'; if(blogDB[0][2]==4){ // 調査モード style +='<style>#div3 { display: none; }</style>'; } else if(blogDB[0][2]==5){ // 仮終了モード style= // 基本デザインを破棄 '<style id="EPS">'+ 'body { background: #c5d8e1; }'+ '#ucsMainLeft h1 { color: #2196f3; }'+ '#div0, #div1, #div2, #div3 { display: none; }</style>'; blogDB[0][2]=0; write_DB(); } else{ // MAP表示モード style +='<style>#div1, #div2 { display: none; }</style>'; } if(blogDB[0][2]!=0){ // 抽出表示の場合(調査・仮終了は省く) style += '<style>.entry-item { display: none; } '+ 'input[name="publish_flg"][value="'+ (blogDB[0][2] -1) +'"] + '+ 'input + .entry-item { display: block; }</style>'; } if(!document.querySelector('#EPS')){ document.documentElement.insertAdjacentHTML('beforeend', style); } } // style_in() window.addEventListener('load', function(){ let entry_id; let publish_f; let entry_date; let pub_all; let pub_dra; let pub_ame; let ua=0; let agent=window.navigator.userAgent.toLowerCase(); if(agent.indexOf('firefox') > -1){ ua=1; } // Firefoxの場合のフラグ let year; // 現在開いているページの年度 let month; // 現在開いているページの月 let year_index; // 現在のページの年度を記録する MAPのindex let disp_year=document.querySelector('#year'); year=parseInt(disp_year.textContent, 10); let disp_month=document.querySelector('#nowMonth'); month=parseInt(disp_month.textContent.replace(/[^0-9]/g, ''),10); let read_json=sessionStorage.getItem('blogDB_back'); // ストレージ 保存名 blogDB=JSON.parse(read_json); if(blogDB==null){ blogDB=[['00000000000', 's', 0]]; } // 記事ID, 投稿フラグ, 投稿年月 6桁 // 初要素のみ '00000000000' ドライブモード 's'/'c'/'e' 抽出表示指定 0~3 if(blogDB[0][1]==0){ blogDB[0][1]='s'; } // 旧ファイルやトラブル時の救済 blogMAP={}; // 公開情報の件数データMAP let read_map_json=sessionStorage.getItem('blogMAP_back'); // セッションストレージ 保存名 blogMAP=JSON.parse(read_map_json); if(blogMAP==null){ blogMAP=[[['blog_map', 1000, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0], [0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0]]]; } year_index=-1; year_index=blogMAP.findIndex(function(elem){ return elem[0][1]==year; }); // 現在の年度のMAPデータの有無を調べる if(year_index==-1){ // 現在の年度のMAPデータが無い場合は年度枠を追加 year_index=blogMAP.length; blogMAP.push([['blog_map', year, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0], [0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0],[0, 0, 0]]); blogMAP.sort(function(a, b){ // 年度の昇順にソート return b[0][1] - a[0][1]; }); year_index=blogMAP.findIndex(function(elem){ return elem[0][1]==year; }); // ソート後にyear_indexを再取得 write_MAP(); } // MAP 保存 reg_set(); function reg_set(){ let k; entry_id_DB=[]; // リセット pub_all=0; pub_dra=0; pub_ame=0; for(k=0; k<blogDB.length; k++){ entry_id_DB[k]=blogDB[k][0]; // ID検索用の配列を作成 if(blogDB[k][1]=='0'){ pub_all +=1; continue; } if(blogDB[k][1]=='1'){ pub_dra +=1; continue; } if(blogDB[k][1]=='2'){ pub_ame +=1; continue; }}} if(year==1000){ blog_start(); }// ブログの最初の記事 else{ control_pannel(blogDB[0][1]); // ドライブモードでパネル表示 menu(); now_year_disp(); // MAPを表示 } // メニュー選択表示 function control_pannel(d){ let box=document.querySelector('#sorting'); if(box){ let insert_div= '<div id="div0"></div>'+ '<div id="div1">'+ '<input id="list_snap" type="submit">'+ '<input id="reset" type="submit" value="初期化">'+ '<input id="export" type="submit" value="MAPをファイル保存">'+ '<input id="import_sw" type="submit" value="ファイル読込み">'+ '<span id="import_result"></span>'+ '<input id="import" type="file">'+ '</div>'+ '<div id="div2">'+ '<span id="snap_result"></span>'+ '<input id="amb_menu2" type="submit" value="調査を終了 ⏏">'+ '</div>'+ '<div id="div3">'+ '<input id="show_map" type="submit" value="MAP全体を表示">'+ '<input id="start_page" type="submit" value="◙ ブログの最初を表示する">'+ '<input id="do_snap" type="submit" value="MAPの調査・ファイル処理">'+ '<input id="amb_menu3" type="submit" value="通常表示に戻る ⏏">'+ '</div>'; if(!box.querySelector('#div0')){ box.insertAdjacentHTML('beforeend', insert_div); } let button1=box.querySelector('#list_snap'); let button2=box.querySelector('#reset'); let button3=box.querySelector('#export'); let button4=box.querySelector('#import_sw'); let span5=box.querySelector('#import_result'); let input6=box.querySelector('#import'); let span7=box.querySelector('#snap_result'); if(d=='s'){ button1.value='MAPの調査を開始 ▶'; button1.onclick=function(e){ e.preventDefault(); start(); } function start(){ let conf_str=[' 🔴 このページ以降の記事に関して 「公開設定MAP」を調査します', '\n 連続動作は [ Ctrl ] キーを押すか [ ❚❚ ] のクリックで停止します'].join(' '); let ok=confirm(conf_str); if(ok){ blogDB[0][1]='c'; // 連続動作フラグをセット write_DB(); // DB 保存 next(); }}} else if(d=='c'){ //「c」は連続動作 button2.style.display='none'; // 動作モードが「c」の場合は非表示 button3.style.display='none'; // 動作モードが「c」の場合は非表示 button4.style.display='none'; // 動作モードが「c」の場合は非表示 span5.style.display='none'; // 動作モードが「c」の場合は非表示 button1.value='MAPの調査を停止 ❚❚'; button1.style.width='760px'; button1.onclick=function(e){ e.preventDefault(); stop(); } document.addEventListener('keydown', (e)=>{ if(e.ctrlKey){ e.preventDefault(); stop(); }}); function stop(){ blogDB[0][1]='s'; // 連続動作フラグをセット write_DB(); // DB 保存 button1.value='MAPの調査を続行 ▶'; button1.style.pointerEvents='none'; box.style.background='#96b6d2'; setTimeout(()=>{ button1.style.pointerEvents='auto'; button1.onclick=function(e){ e.preventDefault(); blogDB[0][1]='c'; // 連続動作フラグをセット write_DB(); // DB 保存 location.reload(); }}, 500); } setTimeout(()=>{ if(blogDB[0][1]=='c'){ next(); }}, 1000); } // 連続実行のぺージ遷移のタイミング 1sec ⭕ else if(d=='e'){ // 「e」は終了 button1.value='🔵 MAP調査が終了しました'; button1.onclick=function(e){ // 調査の状態に復帰 e.preventDefault(); blogDB[0][2]=4; write_DB(); location.reload(); }} if(d=='s' || d=='e'){ button2.onclick=function(e){ // 全データをリセット e.preventDefault(); blogDB=[['00000000000', 's']]; write_DB(); // DB 保存 snap_disp(); button2.value='〔 〕'; span5.textContent=''; input6.value=''; for(let k=0; k<blogMAP.length; k++){ for(let m=1; m<13; m++){ // m=0 の年度表示は残す blogMAP[k][m]=[0, 0, 0]; }} write_MAP(); // MAP 保存 now_year_disp(); } // MAPを表示 button3.onclick=function(e){ e.preventDefault(); let write_json=JSON.stringify(blogMAP); let blob=new Blob([write_json], {type: 'application/json'}); let a_elem=document.createElement('a'); a_elem.href=URL.createObjectURL(blob); a_elem.download='blogMAP.json'; // 保存ファイル名 if(ua==1){ a_elem.target='_blank'; document.body.appendChild(a_elem); } a_elem.click(); if(ua==1){ document.body.removeChild(a_elem); } URL.revokeObjectURL(a_elem.href); } button4.onclick=function(e){ e.preventDefault(); input6.click(); } input6.addEventListener("change", function(){ if(!(input6.value)) return; // ファイルが選択されない場合 let file_list=input6.files; if(!file_list) return; // ファイルリストが選択されない場合 let file=file_list[0]; if(!file) return; // ファイルが無い場合 let file_reader=new FileReader(); file_reader.readAsText(file); file_reader.onload=function(){ if(file_reader.result.slice(0, 14)=='[[["blog_map",'){ // blogMAP.jsonの確認 let data_in=JSON.parse(file_reader.result); blogMAP=data_in; // 読込み上書き処理 write_MAP(); // MAP 保存 button2.value='初期化'; // 初期化後なら読み込んだ事を示す snap_disp(); span5.textContent=file.name; now_year_disp(); }// MAPを表示 else{ alert(" ⛔ 不適合なファイルです blogMAP(n).json ファイルを選択してください"); }} }); } snap_disp(); } // if(box) } // control_pannel() function snap_disp(){ reg_set(); let span7=document.querySelector('#snap_result'); span7.innerHTML=' 記録件数:<b>' + (blogDB.length -1) + '</b> 全員に公開:<b>' + pub_all + '</b> アメンバー限定公開:<b>' + pub_ame + '</b> 下書き:<b>' + pub_dra; +'</b>'; } function next(){ let win_url; let current; let pageid; let next_url; let pager; let end; entry_id=document.querySelectorAll('input[name="entry_id"]'); if(entry_id.length >0){ snap(); } // 投稿記事がある場合SNAPを実行 無ければスルーする win_url=window.location.search.substring(1,window.location.search.length); current=win_url.slice(-6); if(!current){ current=make_curr(); } if(win_url.indexOf('pageID') ==-1){ // pageIDが無い 月のトップページの場合 pager=document.querySelector('.pagingArea'); if(pager){ // ページャーが有りその末尾でなければ同月次ページへ next_url=['https://blog.ameba.jp/ucs/entry/srventrylist.do?', 'pageID=2&entry_ym=' + current].join(''); window.open( next_url, '_self'); } else{ // ページャーが無ければ次月トップページへ current=make_next(current); if(current!=0){ // 現在を越えないなら次月へ next_url=['https://blog.ameba.jp/ucs/entry/srventrylist.do?', 'entry_ym=' + current].join(''); window.open( next_url, '_self'); } else{ // 現在を越えたら0が戻り停止 when_edge(); }}} else{ // pageIDを含み 月のトップページでない場合 end=document.querySelector('.pagingArea .disabled.next'); if(!end){ // ページャーの末尾でなければ同月次ページへ pageid=parseInt(win_url.slice(7).slice(0, -16), 10) +1; next_url=['https://blog.ameba.jp/ucs/entry/srventrylist.do?', 'pageID=' + pageid + '&entry_ym=' + current].join(''); window.open( next_url, '_self'); } else{ // ページャーの末尾なら次月トップページへ current=make_next(current); if(current!=0){ // 現在を越えないなら次月へ next_url=['https://blog.ameba.jp/ucs/entry/srventrylist.do?', 'entry_ym=' + current].join(''); window.open( next_url, '_self'); } else{ // 現在を越えたら0が戻り停止 when_edge(); }}} function make_next(curr){ let ym; let y; let m; ym=parseInt(curr, 10); // 10進数値化 y=Math.floor(ym/100); // 年は100で割った商 m=ym % 100; // 月は100で割った余り if(m !=12){ ym=100*y + m +1; } else{ ym=100*y + 101; } let now=new Date(); if(ym > 100*now.getFullYear() + now.getMonth() +1){ return 0; } // 現在の月を越える場合は0を返す else{ return ym; }} // 次年月の数値を返す function make_curr(){ let now=new Date(); return 100*now.getFullYear() + now.getMonth() +1 } function when_edge(){ blogDB[0][1]='s'; // 連続動作フラグをリセット write_DB(); // DB 保存 control_pannel('e'); } // SNAP終了時の表示をさせる } // next() function snap(){ // ページ内の「公開設定」をSNAPする let win_url=window.location.search.substring(1,window.location.search.length); let entry_date=parseInt(win_url.slice(-6), 10); // SNAPしている現在の「年月 6桁」 if(!entry_date){ entry_date=make_curr(); } function make_curr(){ let now=new Date(); return 100*now.getFullYear() + now.getMonth() +1 } entry_id=document.querySelectorAll('input[name="entry_id"]'); publish_f=document.querySelectorAll('input[name="publish_flg"]'); for(let k=0; k< entry_id.length; k++){ let index=entry_id_DB.indexOf(entry_id[k].value); if(index==-1){ // IDがblogDBに記録されていない場合 blogDB.push([entry_id[k].value, publish_f[k].value, entry_date]); } // 公開設定の登録を追加 else{ // IDがblogDBに記録されていた場合 blogDB[index]=[entry_id[k].value, publish_f[k].value, entry_date]; }} // 公開設定の登録を更新 let filter_date=blogDB.filter(function(value){ return value[2]==entry_date; }); if(filter_date.length>0){ let pub_all=filter_date.filter(function(value){ return value[1]==0; }); blogMAP[year_index][month][0]=pub_all.length; let pub_dra=filter_date.filter(function(value){ return value[1]==1; }); blogMAP[year_index][month][1]=pub_dra.length; let pub_ame=filter_date.filter(function(value){ return value[1]==2; }); blogMAP[year_index][month][2]=pub_ame.length; } setTimeout(write_DB, 10); setTimeout(write_MAP, 10); } // snap() function now_year_disp(){ let box=document.querySelector('#sorting'); if(box){ let now_year_snap= '<div class="div_add">'+ arr_disp(year_index) + '</div>'; let div0=box.querySelector('#div0'); if(div0){ div0.innerHTML=now_year_snap; } p_color(); easy_go(); map_select(); about_comment(0); }} function map_select(){ let div0=document.querySelector('#div0'); if(div0){ let sw=document.querySelector('#show_map'); div0.onclick=function(e){ e.preventDefault(); let div_add=div0.querySelectorAll('.div_add'); if(div_add.length>1){ now_year_disp(); sw.value='MAP全体を表示'; } else{ all_year_disp(); sw.value='MAPを限定表示'; }}}} function all_year_disp(){ let box=document.querySelector('#sorting'); if(box){ let all_year_snap=''; for(let k=0; k<blogMAP.length-1; k++){ all_year_snap+= '<div class="div_add">'+ arr_disp(k) + '</div>'; } let div0=box.querySelector('#div0'); if(div0){ div0.innerHTML=all_year_snap; } p_color(); easy_go(); map_select(); about_comment(1); }} function about_comment(n){ let map_now; let map_year=document.querySelectorAll('.div_add'); if(n==0){ map_now=map_year[0]; } else{ map_now=map_year[year_index]; } if(blogDB[0][2]==0 || blogDB[0][2]==4){ let add_m=map_now.querySelectorAll('.m'); add_m[month].style.outline='2px solid #2196f3'; } if(blogDB[0][2]>0 && blogDB[0][2]<4){ let add_mp=map_now.querySelectorAll('.m p'); let index=month*4 + blogDB[0][2]; add_mp[index].style.outline='2px solid red'; add_mp[index].style.position='relative'; } if(blogDB[0][2]>-1 && blogDB[0][2]<4){ // 以下はMAPの検証コード let publish_f=document.querySelectorAll('input[name="publish_flg"]'); pub_all=0; pub_dra=0; pub_ame=0; for(let k=0; k<publish_f.length; k++){ if(publish_f[k].value==0){ pub_all+=1; } if(publish_f[k].value==1){ pub_dra+=1; } if(publish_f[k].value==2){ pub_ame+=1; }} let alert1=0; // MAP値と記事リスト数の不一致 let pagingArea=document.querySelector('form > .pagingArea'); if(!pagingArea){ if(pub_all!=blogMAP[year_index][month][0] || pub_dra!=blogMAP[year_index][month][1] || pub_ame!=blogMAP[year_index][month][2]){ alert1=1; }} else{ if(pub_all>blogMAP[year_index][month][0] || pub_dra>blogMAP[year_index][month][1] || pub_ame>blogMAP[year_index][month][2]){ alert1=1; } if(blogDB[0][2]==0){ if((blogMAP[year_index][month][0]+blogMAP[year_index][month][1]+blogMAP[year_index][month][2])<20){ alert1=1; }}} if(alert1==1){ let box=document.querySelector('#sorting'); if(box){ let com1='<p id="com1">MAPと記事リストが一致しません:MAPの調査・更新 またはファイルからMAPデータの読込みが必要です</p>'; if(!box.querySelector('#com1')){ box.insertAdjacentHTML('afterbegin', com1); }}} if(blogDB[0][2]==1){ if(pub_all<blogMAP[year_index][month][0]){ other_alert(pub_all, blogMAP[year_index][month][0]); }} if(blogDB[0][2]==2){ if(pub_dra<blogMAP[year_index][month][1]){ other_alert(pub_dra, blogMAP[year_index][month][1]); }} if(blogDB[0][2]==3){ if(pub_ame<blogMAP[year_index][month][2]){ other_alert(pub_ame, blogMAP[year_index][month][2]); }} function other_alert(count, map){ let pagingArea=document.querySelector('form > .pagingArea'); if(pagingArea){ let com2='<p id="com2">抽出記事の分散:<b>'+ count + '</b> 別ページ:<b>'+ (map - count) +'</b></p>'; if(!pagingArea.querySelector('#com2')){ pagingArea.insertAdjacentHTML('beforeend', com2); }}} } // if(blogDB[0][2]>-1 && blogDB[0][2]<4) } // about_comment() function arr_disp(y){ let arr= '<div class="m y_index"><p>'+blogMAP[y][0][1]+'<span class="yt">年</span></p>'+ '<p class="ypt">全員に公開</p><p class="ypt"> 下書き</p><p class="ypt">アメンバー</p></div>'+ '<div class="m"><p class="mt">1月</p><p>'+blogMAP[y][1][0]+'</p><p>'+blogMAP[y][1][1]+'</p><p>'+blogMAP[y][1][2]+'</p></div>'+ '<div class="m"><p class="mt">2月</p><p>'+blogMAP[y][2][0]+'</p><p>'+blogMAP[y][2][1]+'</p><p>'+blogMAP[y][2][2]+'</p></div>'+ '<div class="m"><p class="mt">3月</p><p>'+blogMAP[y][3][0]+'</p><p>'+blogMAP[y][3][1]+'</p><p>'+blogMAP[y][3][2]+'</p></div>'+ '<div class="m"><p class="mt">4月</p><p>'+blogMAP[y][4][0]+'</p><p>'+blogMAP[y][4][1]+'</p><p>'+blogMAP[y][4][2]+'</p></div>'+ '<div class="m"><p class="mt">5月</p><p>'+blogMAP[y][5][0]+'</p><p>'+blogMAP[y][5][1]+'</p><p>'+blogMAP[y][5][2]+'</p></div>'+ '<div class="m"><p class="mt">6月</p><p>'+blogMAP[y][6][0]+'</p><p>'+blogMAP[y][6][1]+'</p><p>'+blogMAP[y][6][2]+'</p></div>'+ '<div class="m"><p class="mt">7月</p><p>'+blogMAP[y][7][0]+'</p><p>'+blogMAP[y][7][1]+'</p><p>'+blogMAP[y][7][2]+'</p></div>'+ '<div class="m"><p class="mt">8月</p><p>'+blogMAP[y][8][0]+'</p><p>'+blogMAP[y][8][1]+'</p><p>'+blogMAP[y][8][2]+'</p></div>'+ '<div class="m"><p class="mt">9月</p><p>'+blogMAP[y][9][0]+'</p><p>'+blogMAP[y][9][1]+'</p><p>'+blogMAP[y][9][2]+'</p></div>'+ '<div class="m"><p class="mt">10月</p><p>'+blogMAP[y][10][0]+'</p><p>'+blogMAP[y][10][1]+'</p><p>'+blogMAP[y][10][2]+'</p></div>'+ '<div class="m"><p class="mt">11月</p><p>'+blogMAP[y][11][0]+'</p><p>'+blogMAP[y][11][1]+'</p><p>'+blogMAP[y][11][2]+'</p></div>'+ '<div class="m"><p class="mt">12月</p><p>'+blogMAP[y][12][0]+'</p><p>'+blogMAP[y][12][1]+'</p><p>'+blogMAP[y][12][2]+'</p></div>'; return arr; } // arr_disp(y) function p_color(){ let box=document.querySelector('#sorting'); if(box){ let pub_all=box.querySelectorAll('.div_add .m p:nth-child(2)'); for(let k=0; k<pub_all.length; k++){ if(pub_all[k].textContent=='0'){ pub_all[k].style.color='transparent'; }} let pub_dra=box.querySelectorAll('.div_add .m p:nth-child(3)'); for(let k=0; k<pub_dra.length; k++){ if(pub_dra[k].textContent=='0'){ pub_dra[k].style.color='transparent'; } else{ pub_dra[k].style.background='#d7ecfd'; }} let pub_ame=box.querySelectorAll('.div_add .m p:nth-child(4)'); for(let k=0; k<pub_ame.length; k++){ if(pub_ame[k].textContent=='0'){ pub_ame[k].style.color='transparent'; } else{ pub_ame[k].style.background='#a3d8d4'; }} }} // p_color() function easy_go(){ let add_mp=document.querySelectorAll('.div_add .m p'); for(let k=0; k<add_mp.length; k++){ add_mp[k].addEventListener('mouseenter', function(){ if(!add_mp[k].classList.contains('mt')){ add_mp[k].closest('.m').style.outlineColor='transparent'; }}); add_mp[k].addEventListener('mouseleave', function(){ if(!add_mp[k].classList.contains('mt')){ add_mp[k].closest('.m').style.outlineColor='#2196f3'; }}); } for(let k=0; k<add_mp.length; k++){ add_mp[k].addEventListener('click', function(e){ if(!add_mp[k].closest('.m').classList.contains('y_index')){ e.preventDefault(); e.stopImmediatePropagation(); jump_year(add_mp[k]); } }); } function jump_year(m_mp){ let div_add=m_mp.closest('.div_add'); let to_year=div_add.querySelector('.y_index p').textContent; to_year=to_year.replace(/[^0-9]/g, ''); let div_m=m_mp.closest('.m'); let to_month=div_m.querySelector('.mt').textContent; to_month=to_month.replace(/[^0-9]/g, ''); if(to_month!='10' && to_month!='11' && to_month!='12'){ to_month='0'+ to_month; } let month_p=div_m.querySelectorAll('p'); if(m_mp==month_p[0]){ blogDB[0][2]=0; } // MAPの「月枠」を選択 else if(m_mp==month_p[1]){ blogDB[0][2]=1; } // MAPの「全体に公開」を選択 else if(m_mp==month_p[2]){ blogDB[0][2]=2; } // MAPの「下書き」を選択 else if(m_mp==month_p[3]){ blogDB[0][2]=3; } // MAPの「アメンバー」を選択 write_DB(); // DB 保存 let to_url= 'https://blog.ameba.jp/ucs/entry/srventrylist.do?entry_ym='+ to_year + to_month; location.href=to_url; } // 選択した「年度・月」のページを開く } // easy_go() function menu(){ let amb_menu2=document.querySelector('#amb_menu2'); let amb_menu3=document.querySelector('#amb_menu3'); if(blogDB[0][2]!=4){ let show_map=document.querySelector('#show_map'); show_map.onclick=function(e){ e.preventDefault(); let div0=document.querySelector('#div0'); if(div0){ div0.click(); }} let start_page=document.querySelector('#start_page'); start_page.onclick=function(e){ e.preventDefault(); blogDB[0][2]=0; write_DB(); location.href= 'https://blog.ameba.jp/ucs/entry/srventrylist.do?entry_ym=100001'; } let do_snap=document.querySelector('#do_snap'); do_snap.onclick=function(e){ e.preventDefault(); blogDB[0][2]=4; write_DB(); location.reload(); } amb_menu3.onclick=function(e){ e.preventDefault(); if(blogDB[0][2]!=4){ blogDB[0][2]=5; write_DB(); location.reload(); }}} else if(blogDB[0][2]==4){ // 4は Snap実行モード amb_menu2.onclick=function(e){ e.preventDefault(); blogDB[0][2]=0; write_DB(); location.reload(); }} } // menu() function blog_start(){ let return_sw=document.querySelector('#entryYear a'); if(return_sw){ return_sw.click(); }} });
〔追記〕2023.02.28
アメーバ管理ヘッダーの変更に対応して、スタイルコードの一部を更新しました。
上記コードは Every Page Map ver.3.0 ➔ ver.3.1 としています。
〔追記〕 2023.06.10
Chromeにおける「overflow: overlay」の無効化に即し、上記コードの該当箇所を修正しました。 これにより、ver.3.1 ➔ ver.3.2 に更新しています。
「Every Page Map 💢」最新版について
旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。
●「Every Page Map 💢」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。