Greasy Fork

ニコニコ除ニコレポEx

ニコレポをフィルタリングします

当前为 2018-03-20 提交的版本,查看 最新版本

// ==UserScript==
// @name         ニコニコ除ニコレポEx
// @namespace    https://greasyfork.org/users/175598
// @description  ニコレポをフィルタリングします
// @match        http://www.nicovideo.jp/my/top
// @match        http://www.nicovideo.jp/my/top/*
// @match        http://www.nicovideo.jp/user/*
// @grant        none
// @author       Original by Fushihara,Modded by Boyu
// @license      Creative Commons Zero 1.0 Universal
// @version      2018.03.20.3
// ==/UserScript==
// Original by Fushihara:https://github.com/fushihara/nico-repo

(function(){
    var localStorageKey="niconicoRemoveNicorepo_modBoyu";
    // cssに付ける接頭語
    var classPrefix="niconicoRemoveNicorepo_modBoyu";
    //切り替え出来る要素
    var contents=[];
    // バージョン数
    var nowVersion = 180320;
    //userType:1=ユーザーが 2=コミュニティが 3=チャンネルが
    var contentsAdd=function({contentId,userType,buttonLabel,normalizeText}){
        // contentIdが重複してる場合はアラートを出す
        let qequalIdContents = contents.filter((content)=>{
            return content.contentId === contentId;
        });
        if( 0 < qequalIdContents.length){
            alert(`contentsIdが重複しています ${contentId}`);
        }
        contents.push({
            "contentId"    :contentId,
            "userType"     :userType,
            "buttonLabel"  :buttonLabel,
            "normalizeText":normalizeText
        });
    };
    //追加出来るかどうか
    //参考:http://nicovideo.cdn.nimg.jp/uni/scripts/pages/my/nicorepo/message/ja-jp.js
    var init=function(){
        var initState;
        load();
        contentsAdd({contentId:"user-video-add"       ,userType:1,buttonLabel:"動画を投稿"            ,normalizeText:"[LINK USER]さんが動画を投稿しました。"});
        contentsAdd({contentId:"user-video-played"    ,userType:1,buttonLabel:"再生数達成"            ,normalizeText:"[LINK USER]さんの動画が[NUMBER]再生を達成しました。"});
        contentsAdd({contentId:"user-video-rank"      ,userType:1,buttonLabel:"ランキング達成"          ,normalizeText:"[LINK USER]さんの動画が[NUMBER]位を達成しました。"});
        contentsAdd({contentId:"user-video-live-ad"   ,userType:1,buttonLabel:"生放送で紹介"           ,normalizeText:"[LINK USER]さんの動画が 生放送[LINK LIVE]で紹介されました。"});
        contentsAdd({contentId:"user-video-added"     ,userType:1,buttonLabel:"広告された"            ,normalizeText:"[LINK USER]さんの動画が[LINK USER]さんにニコニ広告されました。[LINK NICOAD]"});
        contentsAdd({contentId:"user-video-ad"        ,userType:1,buttonLabel:"広告した"             ,normalizeText:"[LINK USER]さんがニコニ広告しました。[LINK NICOAD]"});
        contentsAdd({contentId:"user-comm-video-add"  ,userType:1,buttonLabel:"コミュニティ専用動画を投稿"    ,normalizeText:"[LINK USER]さんがコミュニティ専用動画を投稿しました。"});
        contentsAdd({contentId:"user-seiga-add"       ,userType:1,buttonLabel:"イラストを投稿"          ,normalizeText:"[LINK USER]さんがイラストを投稿しました。"});
        contentsAdd({contentId:"user-seiga-fav"       ,userType:1,buttonLabel:"イラストをクリップ"        ,normalizeText:"[LINK USER]さんが イラストをクリップしました。"});
        contentsAdd({contentId:"user-manga-add"       ,userType:1,buttonLabel:"マンガを投稿"           ,normalizeText:"[LINK USER]さんがマンガ[LINK MANGA]を投稿しました。"});
        contentsAdd({contentId:"user-manga-fav"       ,userType:1,buttonLabel:"マンガをお気に入り登録"      ,normalizeText:"[LINK USER]さんがマンガをお気に入りしました。"});
        contentsAdd({contentId:"user-game-add"        ,userType:1,buttonLabel:"ゲームを投稿"           ,normalizeText:"[LINK USER]さんがゲームを投稿しました。"});
        contentsAdd({contentId:"user-game-update"     ,userType:1,buttonLabel:"ゲームを更新"           ,normalizeText:"[LINK USER]さんがゲームを更新しました。"});
        contentsAdd({contentId:"user-blog-add"        ,userType:1,buttonLabel:"記事を投稿"            ,normalizeText:"[LINK USER]さんが記事を投稿しました。"});
        contentsAdd({contentId:"user-solid-add"       ,userType:1,buttonLabel:"立体を投稿"            ,normalizeText:"[LINK USER]さんが立体を投稿しました。"});
        contentsAdd({contentId:"user-solid-open"      ,userType:1,buttonLabel:"立体の配布データを公開"      ,normalizeText:"[LINK USER]さんが立体の配布データを公開しました。"});
        contentsAdd({contentId:"user-solid-update"    ,userType:1,buttonLabel:"立体の配布データを更新"      ,normalizeText:"[LINK USER]さんが立体の配布データを更新しました。"});
        contentsAdd({contentId:"user-solid-fav"       ,userType:1,buttonLabel:"立体をお気に入り登録"       ,normalizeText:"[LINK USER]さんが立体をお気に入り登録しました。"});
        contentsAdd({contentId:"user-know-add"        ,userType:1,buttonLabel:"ナレッジを投稿"          ,normalizeText:"[LINK USER]さんが ナレッジを投稿しました。"});
        contentsAdd({contentId:"user-app-add"         ,userType:1,buttonLabel:"アプリを開始"           ,normalizeText:"[LINK USER]さんが アプリを遊びはじめました。"});
        contentsAdd({contentId:"user-stamp-get"       ,userType:1,buttonLabel:"スタンプを取得"          ,normalizeText:"[LINK USER]さんがスタンプを取得しました。"});
        contentsAdd({contentId:"user-fav"             ,userType:1,buttonLabel:"あなたをフォロー"         ,normalizeText:"あなたを[LINK USER]さんがフォローしました。"});
        contentsAdd({contentId:"user-list-fav"        ,userType:1,buttonLabel:"あなたのマイリストをフォロー"   ,normalizeText:"あなたの マイリスト[LINK MYLIST]を[LINK USER]さんがフォローしました。"});
        contentsAdd({contentId:"user-list-video-add"  ,userType:1,buttonLabel:"動画をマイリスト登録"       ,normalizeText:"[LINK USER]さんが マイリスト[LINK MYLIST]に動画を登録しました。"});
        contentsAdd({contentId:"user-list-manga-add"  ,userType:1,buttonLabel:"マンガをマイリスト登録"      ,normalizeText:"[LINK USER]さんが マイリスト[LINK MYLIST]にマンガ[LINK MANGA]を登録しました。"});
        contentsAdd({contentId:"user-list-book-add"   ,userType:1,buttonLabel:"書籍をマイリスト登録"       ,normalizeText:"[LINK USER]さんが マイリスト[LINK MYLIST]に書籍を登録しました。"});
        contentsAdd({contentId:"user-list-blog-add"   ,userType:1,buttonLabel:"ブロマガをマイリスト登録"     ,normalizeText:"[LINK USER]さんが マイリスト[LINK MYLIST]にブロマガを登録しました。"});
        contentsAdd({contentId:"user-temp-video-add"  ,userType:1,buttonLabel:"動画をとりあえずマイリスト登録"  ,normalizeText:"[LINK USER]さんが とりあえずマイリスト に動画を登録しました。"});
        contentsAdd({contentId:"user-temp-manga-add"  ,userType:1,buttonLabel:"マンガをとりあえずマイリスト登録" ,normalizeText:"[LINK USER]さんが とりあえずマイリスト にマンガ[LINK MANGA]を登録しました。"});
        contentsAdd({contentId:"user-temp-book-add"   ,userType:1,buttonLabel:"書籍をとりあえずマイリスト登録"  ,normalizeText:"[LINK USER]さんが とりあえずマイリスト に書籍を登録しました。"});
        contentsAdd({contentId:"user-temp-blog-add"   ,userType:1,buttonLabel:"ブロマガをとりあえずマイリスト登録",normalizeText:"[LINK USER]さんが とりあえずマイリスト にブロマガを登録しました。"});
      //contentsAdd({contentId:"user-live-cas-onairs" ,userType:1,buttonLabel:"nicocasを開始"           ,normalizeText:"[LINK USER]さんが nicocas番組を開始しました。"});
      //contentsAdd({contentId:"user-video-ad-old"    ,userType:1,buttonLabel:"広告した(旧式)"          ,normalizeText:"[LINK USER]さんが ニコニ広告で宣伝しました。[LINK UAD]"});
      //contentsAdd({contentId:"user-video-added-old" ,userType:1,buttonLabel:"広告された(旧式)"         ,normalizeText:"[LINK USER]さんの動画が[LINK USER]さんにニコニ広告で宣伝されました。[LINK UAD]"});
        contentsAdd({contentId:"comm-live-onairs"     ,userType:2,buttonLabel:"生放送を開始"           ,normalizeText:"[LINK USER]さんが コミュニティ[LINK COMMUNITY]で生放送を開始しました。"});
        contentsAdd({contentId:"comm-live-reserve"    ,userType:2,buttonLabel:"生放送を予約"           ,normalizeText:"[LINK USER]さんが コミュニティ[LINK COMMUNITY]で[DATE]に生放送を予約しました。"});
        contentsAdd({contentId:"comm-level-up"        ,userType:2,buttonLabel:"レベル上昇"            ,normalizeText:"[LINK COMMUNITY]の コミュニティレベルが[NUMBER]になりました。"});
        contentsAdd({contentId:"comm-info-add"        ,userType:2,buttonLabel:"お知らせを追加"          ,normalizeText:"[LINK USER]さんが コミュニティ[LINK COMMUNITY]にお知らせを追加しました。"});
        contentsAdd({contentId:"comm-video-add"       ,userType:2,buttonLabel:"動画を追加"            ,normalizeText:"[LINK USER]さんが コミュニティ[LINK COMMUNITY]に動画を追加しました。"});
        contentsAdd({contentId:"chan-live-onairs"     ,userType:3,buttonLabel:"生放送を開始"           ,normalizeText:"チャンネル[LINK CHANNEL]で生放送が開始されました。"});
        contentsAdd({contentId:"chan-live-reserve"    ,userType:3,buttonLabel:"生放送を予約"           ,normalizeText:"チャンネル[LINK CHANNEL]で[DATE]に生放送が予約されました。"});
        contentsAdd({contentId:"chan-blog-add"        ,userType:3,buttonLabel:"記事が追加"            ,normalizeText:"チャンネル[LINK CHANNEL]に記事が追加されました。"});
        contentsAdd({contentId:"chan-info-add"        ,userType:3,buttonLabel:"お知らせを追加"          ,normalizeText:"チャンネル[LINK CHANNEL]にお知らせが追加されました。"});
        contentsAdd({contentId:"chan-video-add"       ,userType:3,buttonLabel:"動画を追加"            ,normalizeText:"チャンネル[LINK CHANNEL]に動画が追加されました。"});
        if(document.querySelector("#nicorepo") ){
            addToggleQ();
            initQ();
            setToggleArea(document.querySelector("#nicorepo>h3"));
            addStyle();
        }
    };
    //styleタグを追加。ここにどんどん追加していく
    var thisStyle;
    var addStyle=function(){
        var addElement;
        addElement=document.createElement("style");
        document.body.appendChild(addElement);
        thisStyle=document.styleSheets[document.styleSheets.length-1];
        //セーブされてるスタイル情報を適用する
        //最初に、定義されているコンテンツ情報を読み込む
        var contentStyles={};
        for (let content of contents) {
            contentStyles[ content.contentId ]=true;
        }
        //次に、セーブされているスタイル情報を上書きする
        for (let checkSaveI of checkSave) {
            contentStyles[ checkSaveI.contentId ]=checkSaveI.checked;
        }
        //最後に、スタイル情報を適用する
        for(let contentId in contentStyles){
            updateStyle(contentId, contentStyles[contentId] );
        }
    };
    var updateStyle=function(contentId,flag){
        if(flag==true){
            thisStyle.insertRule("."+classPrefix+contentId+"{display:block;}",thisStyle.rules.length);
        }else{
            thisStyle.insertRule("."+classPrefix+contentId+"{display:none;}",thisStyle.rules.length);
        }
    };
    //-----各ニコレポにクラス名を追加
    var initQ=function(){
        // ノードが追加された時にイベントを仕込む
        const observeTarget = document.querySelector("#MyPageNicorepoApp") || document.querySelector("#UserPageNicorepoApp");
        (new MutationObserver((mutationRecords, observer) => {
            mutationRecords.forEach((n)=>{
                console.log("addedNodes:%o removedNodes:%o",n.addedNodes,n.removedNodes);
                n.addedNodes.forEach((n)=>{
                    if(n.nodeName!=="SPAN"){return;}
                    const baseElement   = n.parentNode.parentNode.parentNode;
                    initializeOneLog(baseElement);
                });
            });
          //observer.disconnect();//切断するチャンスは無い
        })).observe(observeTarget, {childList:true,subtree:true});
    };
    var initializeOneLog = function(baseElement){
        const bodyElement   = baseElement.querySelector(".log-body>span");
        if(bodyElement===null){return;}
        // bodyからリンクを取り除いてノーマライズする
        const bodyNormalizeText = Array.from(bodyElement.childNodes).map((e)=>{
            if(e.nodeType===Node.TEXT_NODE){
                return e.nodeValue.trim();
            }else if(e.nodeType===Node.ELEMENT_NODE){
                const nodeName = e.nodeName;
                if(nodeName==="STRONG"){
                    return e.innerText.trim();
                }else if(nodeName==="SPAN"){
                    // <span>17年0月00日 00:00</span> に生放送が予約されました。
                    return "[DATE]";
                }else if(nodeName==="A"){
                    const linkTarget = new URL(e.href);
                    if(linkTarget.hostname==="www.nicovideo.jp" && linkTarget.pathname.indexOf("/user/")===0){
                        return "[LINK USER]";
                    }else if(linkTarget.hostname==="com.nicovideo.jp" && linkTarget.pathname.indexOf("/community/")===0){
                        // http://com.nicovideo.jp/community/co1234?zeromypage_nicorepo
                        return "[LINK COMMUNITY]";
                    }else if(linkTarget.hostname==="ch.nicovideo.jp" ){
                        // http://ch.nicovideo.jp/xxxx?zeromypage_nicorepo
                        return "[LINK CHANNEL]";
                    }else if(linkTarget.hostname==="www.nicovideo.jp" && linkTarget.pathname.indexOf("/mylist/")===0){
                        // http://www.nicovideo.jp/mylist/1234?zeromypage_nicorepo
                        return "[LINK MYLIST]";
                    }else if(linkTarget.hostname==="live.nicovideo.jp" && linkTarget.pathname.indexOf("/watch/")===0){
                        // http://live.nicovideo.jp/watch/lv1234?zeromypage_nicorepo
                        return "[LINK LIVE]";
                    }else if(linkTarget.hostname==="uad.nicovideo.jp" && linkTarget.pathname.indexOf("/ads/")===0){
                        // http://uad.nicovideo.jp/ads/?vid=sm1234
                        return "[LINK UAD]";
                    }else if(linkTarget.hostname==="nicoad.nicovideo.jp"){
                        // https://nicoad.nicovideo.jp/video/publish/sm1234
                        return "[LINK NICOAD]";
                    }else{
                        return `[LINK ${linkTarget.href}]`.trim();
                    }
                }
            }
            return "";
        }).map((e)=>{
            //  10,000 再生 を [NUMBER]再生 に変換
            return e.replace(/\s*[0-9,]+ 再生\s*/g,"[NUMBER]再生");
        }).map((e)=>{
            //  実況プレイ動画 24時間 総合 ランキングで 2 位
            return e.replace(/さんの動画が .+? \d+ 位を達成/g,"さんの動画が[NUMBER]位を達成");
        }).map((e)=>{
            //  マンガ "タイトル" を投稿しました。
            return e.replace(/マンガ .+ (を投稿しました。|を登録しました。)$/g,"マンガ[LINK MANGA]$1");
        }).map((e)=>{
            //  コミュニティレベルが 5 になりました。
            return e.replace(/コミュニティレベルが \d+ .+$/g,"コミュニティレベルが[NUMBER]になりました。");
        }).join("");
        // userTypeを決定する
        let userType;
        if(bodyNormalizeText.includes("[LINK CHANNEL]")){
            userType = 3;
        }else if(bodyNormalizeText.includes("[LINK COMMUNITY]")){
            userType = 2;
        }else{
            userType = 1;
        }
        let matchContents = false;
        for(var i=0;i<contents.length;i++){
            const contentsI = contents[i] ;
            if(contentsI.userType!==userType){continue;}
            if(contentsI.normalizeText!==bodyNormalizeText){continue;}
            baseElement.classList.add(classPrefix+contentsI.contentId);
            matchContents = true;
            break;
        }
        if(matchContents===false){
            console.log("ニコニコ除ニコレポ:新パターン:",{bodyElement:bodyElement.innerHTML,bodyNormalizeText:bodyNormalizeText,userType:userType});
        }
    };
    //ローカルストレージ
    var checkSave=[];
    var saveUpdateTemp=function(contentId,flag){
        //checkSaveの中身を書きかけるけどセーブはしない
        //checkSave [] = {contentId:xxxxx,checked:true}
        for (let checkSaveI of checkSave) {
            if(checkSaveI.contentId === contentId){
                checkSaveI.checked=flag;
                return;
            }
        }
        //無かった。新規追加
        checkSave.push({"contentId":contentId,"checked":flag});
    };
    var save=function(){
        var savePat=JSON.stringify(checkSave);
        localStorage.setItem(localStorageKey,savePat);
    };
    var load=function(){
        var savePat={};
        savePat=localStorage.getItem(localStorageKey);
        savePat=JSON.parse(savePat);
        if(savePat!==null){
            checkSave=savePat;
        }
    };
    //トグルボタンで表示されるフィルタリング対象切り替えボタンのエレメントを返す
    var toggleArea;
    var setToggleArea=function(addTarget){
        toggleArea=document.createElement("div");
        setToggleButtons(toggleArea);
        setToggleSaveButton(toggleArea);
        toggleArea.style.setProperty("display","none");
        toggleArea.style.setProperty("font-weight","normal");
        toggleArea.style.setProperty("overflow","hidden");
        addTarget.appendChild(toggleArea);
    };
    var addElementArea1,addElementArea2,addElementArea3,addElementArea4;
    var setToggleButtons=function(toggleArea){
        var addElement="";
        var toggleUserType;
        //ユーザーが…
        addElementArea1=document.createElement("div");
        addElementArea1.innerHTML="ユーザーが… or ユーザーが投稿した動画が…";
        addElementArea1.style.setProperty("overflow","hidden");
        toggleArea.appendChild(addElementArea1);

        toggleUserType=document.createElement("button");
        toggleUserType.style.setProperty("float","right");
        toggleUserType.innerHTML="全て表示/非表示";
        toggleUserType.addEventListener("click",toggleUserTypeEventCreate(1));
        addElementArea1.appendChild(toggleUserType);

        addElementArea1=toggleArea.appendChild(document.createElement("div"));
        addElementArea1.style.setProperty("overflow","hidden");

        //コミュニティに…
        addElementArea2=document.createElement("div");
        addElementArea2.innerHTML="コミュニティが…";
        addElementArea2.style.setProperty("overflow","hidden");
        toggleArea.appendChild(addElementArea2);

        toggleUserType=document.createElement("button");
        toggleUserType.style.setProperty("float","right");
        toggleUserType.innerHTML="全て表示/非表示";
        toggleUserType.addEventListener("click",toggleUserTypeEventCreate(2));
        addElementArea2.appendChild(toggleUserType);

        addElementArea2=toggleArea.appendChild(document.createElement("div"));
        addElementArea2.style.setProperty("overflow","hidden");

        //チャンネルに…
        addElementArea3=document.createElement("div");
        addElementArea3.innerHTML="チャンネルが…";
        addElementArea3.style.setProperty("overflow","hidden");
        toggleArea.appendChild(addElementArea3);

        toggleUserType=document.createElement("button");
        toggleUserType.style.setProperty("float","right");
        toggleUserType.innerHTML="全て表示/非表示";
        toggleUserType.addEventListener("click",toggleUserTypeEventCreate(3));
        addElementArea3.appendChild(toggleUserType);

        addElementArea3=toggleArea.appendChild(document.createElement("div"));
        addElementArea3.style.setProperty("overflow","hidden");

        //それ以外の…(トグルボタンは無し)
        addElementArea4=document.createElement("div");
        addElementArea4.innerHTML="それ以外の…";
        addElementArea4.style.setProperty("overflow","hidden");
      //toggleArea.appendChild(addElementArea4);

        addElementArea4=toggleArea.appendChild(document.createElement("div"));
        addElementArea4.style.setProperty("overflow","hidden");

        //~が…のチェックボックスを作る
        for(var i=0;i<contents.length;i++){
            addElement=document.createElement("label");
            //今のcontentがチェック済みかどうかを調べる
            let isChecked = checkSave.filter((e)=>{
                return e.contentId===contents[i].contentId;
            }).map((e)=>{
                return e.checked;
            });
            isChecked = isChecked.length === 0 ? true : isChecked[0];

            addElement.innerHTML=`<input type=checkbox ${isChecked?"checked":""}>${contents[i].buttonLabel}`;
            labelStyle(addElement,isChecked);
            //userType1~3は通常
            //userType4は非表示/非表示切り替え
            addElement.dataset.userType =contents[i].userType;
            addElement.dataset.contentId=contents[i].contentId;
            addElement.addEventListener("click",(function(key){
                return function(e){
                    if(e.target.nodeName!="INPUT"){return;}
                    var userType  = e.target.parentNode.dataset.userType;
                    var contentId = e.target.parentNode.dataset.contentId;
                    if(e.target.checked==true){
                        saveUpdateTemp(contentId,true);//セーブ時の為の変数を更新する
                        updateStyle(contentId,true);
                        labelStyle(e.target.parentNode,true);//ラベルの外見を変える
                      //console.log("on %s %s",userType,userClass,thisStyle);
                    }else{
                        saveUpdateTemp(contentId,false);
                        updateStyle(contentId,false);
                        labelStyle(e.target.parentNode,false);
                      //console.log("of %s %s",userType,userClass,thisStyle);
                    }
                    toggleSaveButton.disabled=false;
                };
            })(i));
            if(contents[i].userType==1){
                addElementArea1.appendChild(addElement);
            }else if(contents[i].userType==2){
                addElementArea2.appendChild(addElement);
            }else if(contents[i].userType==3){
                addElementArea3.appendChild(addElement);
            }else if(contents[i].userType==4){
                addElementArea4.appendChild(addElement);
            }
        }
    };
    var toggleUserTypeEventCreate=function(userType){
  //var addElementArea1,addElementArea2,addElementArea3;
        return function(e){
            var clickTargets;
            if(false){
            }else if(userType==1){
                clickTargets=addElementArea1;
            }else if(userType==2){
                clickTargets=addElementArea2;
            }else if(userType==3){
                clickTargets=addElementArea3;
            }
            clickTargets=clickTargets.querySelectorAll("label");
            if(clickTargets.length==0){return;}//無いとは思うけど、要素が無い時はそのまま返す
            var nextChecked=!clickTargets[0].querySelector("input").checked;
            for(var i=0;i<clickTargets.length;i++){
                //次の状態と今の状態が違う=クリックする
                if(clickTargets[i].querySelector("input").checked!==nextChecked){
                    //クリエイトイベント
                    var customEvent = document.createEvent("MouseEvents");
                    customEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                    clickTargets[i].dispatchEvent(customEvent);
                }
            }
          //console.log(clickTargets);
        };
    };
    var labelStyle=function(target,flag){
        if(flag==true){
            target.style.setProperty("background","-webkit-gradient(linear, 0% 25%, 0% 100%, from(white), to(#1DFFFF))");
        }else{
            target.style.setProperty("background","-webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255, 255, 255, 1)), color-stop(100%,rgba(143, 143, 143, 1)))");
        }
        target.style.setProperty("line-height","2.0em");
        target.style.setProperty("color","black");
        target.style.setProperty("padding","1px 8px 1px 5px");
        target.style.setProperty("border-radius","10px");
        target.style.setProperty("display","block");
        target.style.setProperty("float","left");
        target.style.setProperty("margin","5px 3px");
        target.style.setProperty("","");
    };
    var toggleSaveButton;
    var setToggleSaveButton=function(toggleArea){
        toggleSaveButton=document.createElement("button");
        toggleSaveButton.innerHTML="設定保存";
        toggleSaveButton.style.setProperty("float","right");
        toggleSaveButton.addEventListener("click",function(){
            save();
            toggleSaveButton.disabled=true;
        });
        toggleSaveButton.disabled=true;
        toggleArea.appendChild(toggleSaveButton);
    };
    //トグルボタンそのものを作る
    var toggleButton;
    var addToggleQ=function(){
        //updateボタンを表示するかどうか
        let updateButton = `<span style="    display: inline;
    background: rgba(0, 0, 0, 0);
    width: auto;
    font-size: 11px;
    color: #f00;
    background-color: #fff;
    border-radius: 6px;
    padding: 0px 3px;
    font-weight: bold;">更新</span>`;
        toggleButton=document.createElement("a");
        toggleButton.href="";
        toggleButton.innerHTML=`<span></span>表示フィルタリング切り替え${checkShowUpdate()?updateButton:""}`;
        toggleButton.dataset.nowOpen="no";
        toggleButton.addEventListener("click",(e)=>{
            e.preventDefault();
            updateShowUpdate();
            if(toggleButton.dataset.nowOpen=="no"){//今は閉じてる
                toggleArea.style.setProperty("display","block");
                toggleButton.dataset.nowOpen="yes";
            }else{//今は開いてる
                toggleArea.style.setProperty("display","none");
                toggleButton.dataset.nowOpen="no";
            }
        });
        document.querySelector("#nicorepo>h3").appendChild(toggleButton);
    };
    var checkShowUpdate = function(){
        const version = localStorage.getItem(`${localStorageKey}-last-click-version`) || 1;
        if( version < nowVersion ){
            // 最後にクリックしたバージョンが、今のバージョンより前だったら表示する
            return true;
        }else{
            return false;
        }
    };
    var updateShowUpdate = function(){
        localStorage.setItem(`${localStorageKey}-last-click-version`,nowVersion);
    };
    init();
})();