投稿状態の一覧表示

「Every Page Snap 💢 」は、ブログの「一括下書き化」を元の公開状態に戻す目的で制作したツールです。 ブログの「仮閉鎖」は、通常は余り必要のない処理ですが、

高速で全記事の「全員に公開」「下書き」「アメンバー公開」の状態を調査できる機能は、記事の投稿状態の可視化に使えます。

 

今回は、「Snap 💢 」をペースに、ブログのマップを作る「Every Page Map 💢」を制作しました。 

 

このツールを作って気付いたのですが、昔に投稿をためらい「下書き」にしたままの記事を発掘しました。 マップ表示は、書庫の整理方針を決める助けになるかも知れません。 投稿状況を可視化した「マップ」の使い方は、ユーザー次第です。

 

 

 

 「Every Page Map 💢」の概要

 

マップ表示 

下は、このツールのマップ表示のサンプルです。

 

 

最新の年度から下に向かって年度毎にデータが並び、ブログ全体に渡って投稿の状態を一覧表示します。

 

左端は「年度表示」で、右側は年度の各月ごとに「全員に公開」「下書き」「アメンバー限定公開」の記事件数表示がワンセットになっています。「下書き」はブルー、「アメンバー限定公開」はグリーンの淡い背景が付きます。

 

 

 

 マップ表示と年度表示の切換え

ページ最上部の「年」「月」を選択すると、ページの下側に選択した月の記事リストが表示され、これは本来の「記事の編集・削除」の記事リストの表示です。

 

コンソール部には、最上部で選択した年度の「年度表示」が表示されます。 下は、ブログ全体の調査が終わった所ですが、最上部で「年」を変更すると、選択した年度の投稿状況を一覧する「年度表示」に変わります。

 

 

この単体の「年度表示」の「年度」(上の赤枠)の部分をクリックすると、下の様に、ブログ全体のマップ表示になります。

 

 

左側の赤枠の「年度」の部分がスイッチになっていて、 赤枠のどこをクリックしても、元の「年度表示」に戻ります。

 

 

マップの月枠から、その月の表示に移動 

「年度表示」「マップ表示」のどちらの状態でも、右側の「月枠」をクリックすると、その月の記事リストを表示するページに移動できます。

 

 

「マップ」で全体を一覧し、そこから月単位の詳細にアクセスできるわけです。

 

 

 

 マップの調査

このツールで調査したブログの投稿状況のデータは、セッションストレージに保持しますが、別のウインドウ(ウインドウタブ)に移動すると、別セッションとなり、データは継承されません。 調査を実行したウインドウ(ウインドウタブ)を閉じると、収集したデータは消えてしまう事に注意が要ります。

 

しかし、調査は1000件の記事で10分も要しないため、気軽に調査したり、調査をやり直しをする感覚で扱えます。

 

 

調査の開始と終了 

通常、調査は記事の一番最初の年度で始めます。

 

 

▪ 途中の特定の時期だけの調査も構いませんが、このツールは部分調査の継ぎ足しは不正確になります。 1ヵ月が複数ページになる月の部分は、常に加算に集計するためで、これは仕様です。(「Snap 💢 」は、その問題はありませんが )

従って、一気に調査する事を前提にしてください。

 

▪ 調査を開始前に「初期化」を押して、データをリセットすると間違いありません。

 

●「MAPの調査を開始」を押すと、俊足でスキャンが開始されます。

 

▪ コンソール上にマウスポインターを持って行くと、次のページで停止します。

 

▪ 現在の月まで進むと、自動的に調査が終了します。

 

 

ファイルの保存と読込み 

マップ表示は、調査したデータの一覧表示ですが、このデータはファイルに保存ができます。 そのファイルを読み込んで、過去のマップを別の時に表示ができます。

 

 

▪「Every Page Map 💢」が保存するファイルは、「blogMap(n).json」というファイル名(連番)で、通常はPCのダウンロードフォルダに保存されます。

 

▪ ファイルを読み込むと、そのファイルのデータがマップとして表示されます。

 

 

 

「Every Page Map 💢」を使用する時の注意 

このツールは、ファイル自体を変更する事がなく気軽に使えますが、「記事の編集・削除」は使い難くなり、一般のブログ操作と同時に使う事は適しません。 このツールを使用した処理が終了したら、ツールを忘れずに「OFF」にしてください。

 

▪「Quick EntryList」と同時に使用しても、問題は生じない様ですが、他のツールとの競合があれば、その場に応じて判断してください。

 

▪このツールを「ON」にすると「記事の編集・削除」の画面から出られなくなります。「Tampermonkey」でこのツールを「OFF」にしてページをリロードすると、本来の「記事の編集・削除」になって移動ができます。

 

 

 

「Every Page Map 💢」を利用するには

このツールは Chrome / Edge / Firefox版の拡張機能「Tampermonkey」上で動作します。 以下に、このツールの導入手順を簡単に説明します。

 

❶「Tampermonkey」を導入します

◎ 使用しているブラウザに拡張機能「Tampermonkey」を導入する事が必要です。

既に「Tampermonkey」を導入している場合は、この手順 ❶ は不要です。 

拡張機能の導入については、以下のページに簡単な説明があるので参照ください。

 

 

❷「Tampermonkey」にスクリプトを登録します

◎「Tampermonkey」の「」マークの「新規スクリプト」タブを開きます。

 

 

 

◎「新規スクリプト」には、最初からテンプレートが記入されています。 これは全て削除して、完全に空白の編集枠に 下のコードをコピー&ペーストします。

 

〔コピー方法〕 軽量シンプルなツール「PreBox Button   」を使うと

  コード枠内を「Ctrl+左Click」➔「Copy code 」を「左Click」

  の操作で、掲載コードのコピーが可能になります。

 

◎ 最後に「ファイル」メニューの「保存」を押すと、ツールが使用可能になります。

 

 

〔 Every Page Map 💢 〕 ver. 2.5m

 

// ==UserScript==
// @name         Every Page Map 💢
// @namespace  http://tampermonkey.net/
// @version       2.5m
// @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(); }}

function style_in(){
    let style=
        '<style id="EPS">'+
        'html { overflow-y: overlay !important }'+
        '#globalHeader, #ucsHeader, #ucsMainLeft h1, .l-ucs-sidemenu-area, #ucsMainRight,'+
        '#entryList .deleteCol, '+
        '#entryList dl, .selection-bar, #footerAd, #globalFooter, .checkboxAllControl { display: none }'+

        '#ucsContent{ width: 840px; background: #fff; box-shadow: 0 0 0 100vh #c5d8e1 }'+
        '#ucsMain{ background: #fff } #ucsMainLeft { width: 810px; 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; padding: 4px; 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 }'+
        '#sorting select, #sorting ul { display: none }'+
        'input { font-family: meiryo; font-size: 14px }'+

        '#entryList li{ height: 24px; padding: 8px 5px 5px !important }'+
        '#entryList li:hover{ background-color: #e2eef0 }'+
        '#entryList li .entry-column { padding: 0; }'+

        '#entryList .leftCol, #entryList .titleCol h2{ width: 560px; line-height: 24px; }'+
        '#entryList .leftCol a { text-decoration: none !important; color: #3970b5 !important; }'+
        '#entryList .rightCol { flex-direction: row; align-items: center; width: 260px !important; '+
        'min-width: unset; margin: 0; }'+

        '#entryList .txtCol{ white-space: nowrap; font-size: 13px; margin-bottom: 2px; line-height: 16px }'+
        '#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 }'+

        '#div0 { color: #333; margin: 10px -10px 0 15px; }'+
        '#div1 { 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; }'+

        '#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; } '+
        '.m.y_index p { border: none !important; } '+
        '.m { display: flex; flex-direction: column; font: bold 14px Meiryo; width: 50px; text-align: right; } '+
        '.m:hover { outline: 1px solid #2196f3; outline-offset: -1px; 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: 0 10px; margin-top: -1px; border: 1px solid #ccc; } '+
        '</style>';

    if(!document.querySelector('#EPS')){
        document.documentElement.insertAdjacentHTML('beforeend', style); }

} // style_in()



window.addEventListener('load', function(){
    let drive_mode;
    let blogDB={}; //「アメンバー公開」の記事IDリスト
    let entry_id;
    let entry_id_DB;
    let publish_f;
    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 read_json=localStorage.getItem('blogDM_back'); // ローカルストレージ 保存名
    blogDB=JSON.parse(read_json);
    if(blogDB==null){
        blogDB=[['00000000000', 's']]; }



    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 blogMAP={}; // 公開情報の件数データMAP
    let read_map_json=sessionStorage.getItem('blogMAP_back'); // セッションストレージ 保存名
    blogMAP=JSON.parse(read_map_json);
    if(blogMAP==null){
        blogMAP=[[['blog_map', 2022, 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;
    for(let k=0; k<blogMAP.length; k++){
        if(year==blogMAP[k][0][1]){
            year_index=k; }}

    if(year_index==-1){
        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]; });

    for(let k=0; k<blogMAP.length; k++){
        if(year==blogMAP[k][0][1]){ // ソート後にyear_indexを再取得
            year_index=k; }}

    write_session(); // セッションストレージに保存



    drive_mode=blogDB[0][1]; // 起動時に動作フラグを取得
    if(drive_mode==0){ drive_mode='s'; } // 旧ファイルの救済

    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; }}}

    control_pannel(drive_mode);



    function control_pannel(d){
        let box=document.querySelector('#sorting');
        if(box){

            let insert_div=
                '<div id="div2"></div>'+
                '<div id="div0">'+
                '<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="div1">'+
                '<span id="snap_result"></span>'+
                '</div>';

            if(!box.querySelector('#div0')){
                box.insertAdjacentHTML('beforeend', insert_div); }

            now_year_disp(); // MAPを表示
            easy_go();



            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      連続動作はコントロール部にマウスに乗せると停止します'].join(' ');
                    let ok=confirm(conf_str);
                    if(ok){
                        blogDB[0][1]='c'; // 連続動作フラグをセット
                        write_local(); // ローカルストレージ 保存
                        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.pointerEvents='none';
                button1.style.width='760px';
                box.addEventListener('mouseover', function(e){
                    e.preventDefault();
                    box.style.background='#96b6d2';
                    stop(); }, false);

                function stop(){
                    blogDB[0][1]='s'; // 連続動作フラグをリセット
                    write_local(); } // ローカルストレージ 保存

                setTimeout(next, 400); } // 連続実行のぺージ遷移のタイミング 0.4sec ⭕


            else if(d=='e'){ // 「e」は終了
                button1.value='🔵 MAP調査が終了しました';
                button1.style.pointerEvents='none';
                box.addEventListener('mouseover', function(e){
                    e.preventDefault();
                    box.style.background='#ddedf3'; }, false); }


            if(d=='s' || d=='e'){
                button2.onclick=function(e){ // 全データをリセット
                    e.preventDefault();
                    blogDB=[['00000000000', 's']];
                    write_local(); // ローカルストレージ 保存
                    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_session(); // セッションストレージ保存
                    now_year_disp(); // MAPを表示
                    easy_go(); }

                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_session(); // セッションストレージ保存

                            button2.value='初期化'; // 初期化後なら読み込んだ事を示す
                            snap_disp();
                            span5.textContent=file.name;
                            now_year_disp(); // MAPを表示
                            easy_go(); }
                        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_local(); // ローカルストレージ 保存
            document.querySelector('#div0').remove();
            document.querySelector('#div1').remove();
            control_pannel('e'); } // SNAP終了時の表示をさせる

    } // next()



    function snap(){ // ページ内の「公開設定」をSNAPする

        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]); } // 公開設定の登録を追加
            else{ // IDがblogDBに記録されていた場合
                blogDB[index]=[entry_id[k].value, publish_f[k].value]; }} // 公開設定の登録を更新


        let open=0;
        let close=0;
        let amem=0;

        for(let k=0; k< entry_id.length; k++){
            if(publish_f[k].value==0){
                open+=1; }
            if(publish_f[k].value==1){
                close+=1; }
            if(publish_f[k].value==2){
                amem+=1; }}

        let query=location.search;
        if(query.includes('pageID')){ // ページャーがある場合は結果を加算して更新
            blogMAP[year_index][month][0]=blogMAP[year_index][month][0] + open;
            blogMAP[year_index][month][1]=blogMAP[year_index][month][1] + close;
            blogMAP[year_index][month][2]=blogMAP[year_index][month][2] + amem; }
        else{ // ページャーがない場合は結果を更新
            blogMAP[year_index][month][0]=open;
            blogMAP[year_index][month][1]=close;
            blogMAP[year_index][month][2]=amem; }

        setTimeout(write_local, 10);
        setTimeout(write_session, 10);

    } // snap()



    function write_session(){ // セッションストレージ 保存
        let write_map_json=JSON.stringify(blogMAP);
        sessionStorage.setItem('blogMAP_back', write_map_json); }


    function write_local(){ // ローカルストレージ 保存
        let write_json=JSON.stringify(blogDB);
        localStorage.setItem('blogDM_back', write_json); }



    let div2=document.querySelector('#div2');
    div2.onclick=function(e){
        e.preventDefault();
        let div_add=div2.querySelectorAll('.div_add');
        if(div_add.length>1){
            now_year_disp();
            easy_go();
        }
        else{
            all_year_disp();
            easy_go();
        }}


    function now_year_disp(){
        let box=document.querySelector('#sorting');
        if(box){
            let now_year_snap=
                '<div class="div_add">'+
                arr_disp(year_index) +
                '</div>'+
                '<style>#sorting { height: auto !important; }</style>';

            let div2=box.querySelector('#div2');
            if(div2){
                div2.innerHTML=now_year_snap; }

            let mt=box.querySelectorAll('.m .mt');
            mt[month-1].style.outline='2px solid #0066cc';
            mt[month-1].style.outlineOffset='-4px';
            p_color(); }}


    function all_year_disp(){
        let box=document.querySelector('#sorting');
        if(box){
            let all_year_snap='';
            for(let k=0; k<blogMAP.length; k++){
                all_year_snap+=
                    '<div class="div_add">'+
                    arr_disp(k) +
                    '</div>'; }
            all_year_snap+=
                '<style>#sorting { height: auto !important; }</style>';

            let div2=box.querySelector('#div2');
            if(div2){
                div2.innerHTML=all_year_snap; }

            p_color(); }}


    function arr_disp(y){
        let arr=
            '<div class="m y_index"><p>'+blogMAP[y][0][1]+'</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; }


    function p_color(){
        let box=document.querySelector('#sorting');
        if(box){
            let open=box.querySelectorAll('.div_add .m p:nth-child(2)');
            for(let k=0; k<open.length; k++){
                if(open[k].textContent=='0'){
                    open[k].style.color='transparent'; }}

            let close=box.querySelectorAll('.div_add .m p:nth-child(3)');
            for(let k=0; k<close.length; k++){
                if(close[k].textContent=='0'){
                    close[k].style.color='transparent'; }
                else{
                    close[k].style.background='#d7ecfd'; }}

            let amem=box.querySelectorAll('.div_add .m p:nth-child(4)');
            for(let k=0; k<amem.length; k++){
                if(amem[k].textContent=='0'){
                    amem[k].style.color='transparent'; }
                else{
                    amem[k].style.background='#a3d8d4'; }}

        }} // p_color()



    function easy_go(){
        let add_m=document.querySelectorAll('.div_add .m');
        for(let k=0; k<add_m.length; k++){
            add_m[k].addEventListener('click', function(e){
                if(!add_m[k].classList.contains('y_index')){
                    e.preventDefault();
                    e.stopImmediatePropagation();
                    jump_year(add_m[k]); }
            }); }

        function jump_year(m_map){
            let div_add=m_map.closest('.div_add');
            let to_year=div_add.querySelector('.y_index p').textContent;

            let to_month=m_map.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 to_url=
                'https://blog.ameba.jp/ucs/entry/srventrylist.do?entry_ym='+ to_year + to_month;
            location.href=to_url; }

    } // easy_go()

});






 

〔追記〕 2022.05.05

ローカルストレージのデータ保存名に「blogDB_back」を使っていたので、「Every Page Snap 💢」の「Snap」データを、このツールの「初期化」操作で失ってしまう可能性があるので、このツールのデータ保存名を「blogDM_back」に変更しました。

上記コードとバージョン名は変更済です。

 

但し、「Every Page Map 💢」ver. 2.7 以降のバージョンでは、データ保存をセッションストレージに変更し、この心配はなくなりました。

 

 

 

「Every Page Map 💢」最新版について 

旧いバージョンの JavaScriptツールは、アメーバのページ構成の変更で動作しない場合があり、導入する場合は最新バージョンをお勧めします。

 

●「Every Page Map 💢」の最新バージョンへのリンクは、以下のページのリンクリストから探せます。