インターフェイスを簡素に 

MAPの最下部に「1000年度」の枠を設け、これをMAPデータの配列の年度の雛形にしています。 ページを開いた時、その年度のデータを検索し、なければ今年度のMAPのデータ用の配列を追加します。

 

この配列の追加の後には配列のソートが必要です。 これは、ユーザーがブログ最初からデータをスキャンせず、飛び地の年度をスキャンしたり、前後の年度に移動してスキャンした場合に対応して、その後のデータの処理を扱い易くするためです。

 

 

年度の配列のソートは、最初の現在の年度用の配列の検索で、新たに配列を追加した時だけ必要なのですが、全ての画面を開いた時にも行うコードを書いていました。 PCの処理能力は速いので気付かないのですが、この無駄なコードは改めました。

 

 

 

まれに生じるエラー

色々と条件を変えて試していると、まれにぺージを開いた所でエラー停止が生じました。 調べると、高速表示用の「サブコード」と実処理用の「MAINコード」があって、後者の最初で「ストレージデータが無い」と言って停止しています。

 

下は、ページを開くごとに繰り返す JavaScriptの処理の模式図です。

 

 

このツールのコードは、ページデザインを決定し、表示内容をCCSを通じて選択する「styleタグ」をページの表示要素がロードされるより先にHTMLに埋め込むために、高速表示用のSUBコードを JavaScriptで可能な最速タイミングで実行します。

 

また、実際の表示要素が揃わないと出来ない通常の処理のMAINコードは、

 

window.addEventListener('load', function(){ ~~~ });

 

の書式で、SUBコードよりわずかに遅れて実行しています。

 

最初のSUBコードでも、そのページを開く条件は前のページで指定してストレージに記録し、開いた時にストレージを読み込んで、ページの表示に反映します。

 

例えば、スキャン実行のボタンを押すと、次に開くページは記事リストは非表示、メニューはスキャン時のメニューという指定をストレージに書き込み、ページをリロードします。 次にこのページがロードされると、このストレージの指定を読み、ページデザインを決める「styleタグ」を埋め込み、また同時にページをスキャンをする指示に従って、MAIN側はスキャンのデータ処理を行います。

 

JavaScriptはページ毎に実行されますが、その前のページであった事とは全く独立して動作するので、この様なストレージを使った伝達が不可欠です。

 

で、先の図に戻りますが、エラーは で読んだストレージデータが の場所ではデータがないと言うのです。 上の図では、MAINの最初の でもストレージの読込みを行っていますが、これはこのエラーに陥らないための施策です。 本当は で再読込みは不要なはずですが、細かな機序を説明する知識がないのですが、「タイミング」が間に合わない事がまれにあるらしい。

 

殆どの場合、の再読込みは不要ですが、何かの拍子に が遅くなるか が早く実行されてしまうと言う事があるのでしょう。 両方で同じストレージを読むので、後になった方が上書きすると思いますが...

 

 

 

「最初のページ」をボタンのみにする 

最初にMAPの一番下に配置した「ブログの最初のページを表示」のボタンを、後でメニューに追加したのですが、これが無駄に多いので整理しました。 一旦はMAP下のボタンのみに変更したのですが、メニュー上のボタンの方が判り易く、そう困らないと判断し、MAPの側のスイッチを廃止しました。

 

また、この機能で「1000年1月」のページを一旦表示しますが、下の表示が出ない方法を考えました。

 

 

これは「~」を使う「後方にある兄弟要素」を指定するセレクタ表記を利用。

 

input[value="entry_ym=100001"] ~ #entryList { visibility: hidden; }

 

これで「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 💢」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。