ほぼ完全自動アク禁ブックマークレット2

    @@ -26,6 +26,55 @@ } } + class AkukinAgent { + constructor(MESSAGE, FROM, mail) { + let fd = new FormData(); + fd.set("bbs", bbs); + fd.set("key", key); + fd.set("submit", "書き込む"); + this.fd = fd; + + this.update(MESSAGE, FROM, mail); + + let xhr = new XMLHttpRequest(); + xhr.addEventListener("loadend", this.f_xhr); + this.xhr = xhr; + } + + update(MESSAGE = "", FROM = "", mail = "") { + let fd = this.fd; + fd.set("FROM", FROM); + fd.set("mail", mail); + this.fd = fd; + + this.MESSAGE = MESSAGE; + } + + set(target) { + let fd = this.fd; + fd.set("MESSAGE", this.MESSAGE + "\n" + target); + fd.set("time", Math.floor(Date.now() / 1000)); + this.fd = fd; + } + + f_xhr(result) { + let response = result.target.response; + if (response.includes("<title>書きこみました。</title>")) { + console.log("success"); + } else { + console.log("error"); + console.log(response); + } + } + + exec() { + let xhr = this.xhr; + let fd = this.fd; + xhr.open("POST", "/test/bbs.cgi?guid=ON"); + xhr.send(fd); + } + } + class ResHead { set(dts) { this.dts = dts; @@ -72,21 +121,19 @@ nodeName = node.nodeName.toLowerCase(); //note: 通常の目に見えるテキスト,いわゆる本文の各一行 if (nodeName === "#text") { - arr.push(node.textContent); + arr.push(node.textContent.trim()); } //note: 文末改行および空行 if (nodeName === "br") { - //arr.push("<br>"); arr.push("\n"); - //arr.push("↵"); } //note: リンク if (nodeName === "a") { //note: 安価参照の場合はリンクではなく安価テキスト(e.g. >>243-256 )を取得する if (/^\/test\/read\.cgi\/.*/.test(node.pathname)) { - arr.push(node.textContent); + arr.push(node.textContent.trim()); } else { arr.push(node.href); } @@ -101,7 +148,7 @@ } if (nodeName === "font") { - arr.push(node.textContent); + arr.push(node.textContent.trim()); } } @@ -116,14 +163,32 @@ } } + class Res { + set(reshead, resbody) { + let data = []; + for (let ix = 0, len = reshead.length; ix < len; ix++) { + reshead[ix].text = resbody[ix]; + } + this.data = reshead; + } + get() { + return this.data; + } + } //member - let _mo; let _form = {}; let _idList = {}; + + + //instances + let _mo; + let _agent; let _reshead; let _resbody; + let _res; + //initializer _init(); @@ -132,7 +197,21 @@ //function function _init() { _embedForm(); - _setupForm(); + + let enableAkukin = _getStorage("enableAkukin"); + let MESSAGE = _getStorage("autoAku_defaultText"); + let FROM = _getStorage("autoAku_defaultName"); + let mail = _getStorage("autoAku_defaultMail"); + _agent = new AkukinAgent(MESSAGE, FROM, mail); + _mo = new MutationListener(_MutationCallback); + + if (enableAkukin) { + _setupForm(); + if (enableAkukin === "ON") { + _mo.start(); + } + } + _assignEventListener(); _createInstances(); } @@ -145,12 +224,9 @@ } function _createInstances() { + _res = new Res(); _reshead = new ResHead(); _resbody = new ResBody(); - _mo = new MutationListener(_execAkukin); - if (_form["enableAkukin"] === "ON") { - _mo.start(); - } } function _embedForm() { @@ -169,48 +245,74 @@ return; } - /* - //note: この関数必要? - function _getForm() { - let fd = new FormData(document.forms["fm_autoAku"]); - let obj = {}; - for (let [key, value] of fd) { - obj[key] = value; - } - return obj; - } - */ - function _setupForm() { let form = document.forms["fm_autoAku"]; let fd = new FormData(form); - let temp; + let temp = {}; + let storage; for (let [key, value] of fd) { - temp = _getStorage(key); - _form[key] = temp; - form[key].value = temp; - } - - if (_form["enableSpeedLimit"] === "ON") { - let target = document.querySelector("#field_speedLimit"); - target.setAttribute("style", "display:inline;"); + storage = _getStorage(key); + temp[key] = storage; + form[key].value = storage; } + _validateForm(temp) + .then(_setInternalValue); + console.dir(_form); } - function _execAkukin(record) { + function _MutationCallback(record) { let dl = record[0].addedNodes[0]; //note: dlの中にdt, ddは1組以上含まれる可能性がある _reshead.set(dl.querySelectorAll("dt")); _resbody.set(dl.querySelectorAll("dd")); + _res.set(_reshead.parse(), _resbody.parse()); + + let res = _res.get(); + //res.forEach((elm) => { _idList[elm.id] = Date.now(); }); + + let judge = []; + let isTarget = false; + let target = []; + let limit = _form["limit"] * 1000; + let enableSpeedLimit = _form["enableSpeedLimit"] === "ON" ? true : false; + for (let value of res) { + judge = []; + isTarget = false; + if (!value.nusi) { + judge.push(_form["word"].some((elm) => elm.test(value.text))); + judge.push(_form["name"].some((elm) => elm.test(value.name))); + judge.push(_form["mail"].some((elm) => elm.test(value.mail))); + judge.push(_form["id"].some((elm) => elm.test(value.id))); + isTarget = judge.some((elm) => elm); + if (isTarget) { + target.push(value.resnum); + } + if (enableSpeedLimit) { + if (Date.now() - _idList[value.id] < limit) { + target.push(value.resnum); + } + _idList[value.id] = Date.now(); + } + } + } + target = target.filter((elm, ind, ary) => ary.indexOf(elm) === ind); + target = target.map((elm) => "!aku" + elm); + console.log(target); - console.dir(_reshead.parse()); - console.dir(_resbody.parse()); + if (target.length) { + _agent.set(target); + _agent.exec(); + } + // console.dir(res); + console.dir(_idList); console.dir(_form); return; } + + /* Event Listener */ function ShowBtnEventListener() { let elm = document.querySelector("#b_autoAkuShow"); @@ -232,24 +334,114 @@ elm.addEventListener("click", function(ev) { let form = ev.target.form; let fd = new FormData(form); + let temp = {}; for (let [key, value] of fd) { - _form[key] = value; - _setStorage(key, value); + temp[key] = value; } + let message = document.querySelector("#autoAku_message"); + _validateForm(temp) + .then(function(result) { + _setInternalValue(result); + + fd.set("autoAku_speedLimit", result[5]); + for (let [key, val] of fd) { + _setStorage(key, val); + } - if (_form["enableAkukin"] === "ON") { - _mo.start(); + if (temp["enableAkukin"] === "ON") { + _mo.start(); + } else { + _mo.stop(); + } + + _agent.update(_form["autoAku_defaultText"], _form["autoAku_defaultName"], _form["autoAku_defaultMail"]); + + message.textContent = "保存しますた!"; + setTimeout(() => { message.textContent = "" }, 1000); + + return; + }, function(reason) { + alert(reason); + message.textContent = "保存してません!"; + setTimeout(() => { message.textContent = "" }, 1000); + return; + }); + }); + } + + function _validateForm(data) { + return new Promise(function(resolve, reject) { + let word, name, mail, id, limit; + + let words = data["autoAku_words"]; + let names = data["autoAku_names"]; + let mails = data["autoAku_mails"]; + let ids = data["autoAku_ids"]; + + let arr_words = _splitt(words).filter((elm) => elm !== ""); + let arr_names = _splitt(names).filter((elm) => elm !== ""); + let arr_mails = _splitt(mails).filter((elm) => elm !== ""); + let arr_ids = _splitt(ids).filter((elm) => elm !== ""); + + if (data["enableRegexp"] === "ON") { + try { + word = arr_words.map((elm) => new RegExp(elm, "g")); + name = arr_names.map((elm) => new RegExp(elm, "g")); + mail = arr_mails.map((elm) => new RegExp(elm, "g")); + id = arr_ids.map((elm) => new RegExp(elm, "g")); + } catch (e) { + let message = "正規表現の指定がおかしいみたいです。。\n↓\n↓\n" + e.message; + reject(message); + return; + } } else { - _mo.stop(); + word = arr_words.map((elm) => new RegExp(_escapeRegexp(elm), "g")); + name = arr_names.map((elm) => new RegExp(_escapeRegexp(elm), "g")); + mail = arr_mails.map((elm) => new RegExp(_escapeRegexp(elm), "g")); + id = arr_ids.map((elm) => new RegExp(_escapeRegexp(elm), "g")); } - let message = document.querySelector("#autoAku_message"); - message.textContent = "保存しますた!"; - setTimeout(() => { message.textContent = "" }, 1000); + if (data["enableSpeedLimit"] === "ON") { + limit = data["autoAku_speedLimit"] - 0; + limit = isNaN(limit) ? 1 : limit; + limit = limit >= 1 ? limit : 1; + } else { + limit = 1; + } + resolve([data, word, name, mail, id, limit]); + return; }); } + function _setInternalValue([temp, word, name, mail, id, limit]) { + _form["word"] = word; + _form["name"] = name; + _form["mail"] = mail; + _form["id"] = id; + _form["limit"] = limit; + _form["enableAkukin"] = temp["enableAkukin"]; + _form["enableRegexp"] = temp["enableRegexp"]; + _form["enableSpeedLimit"] = temp["enableSpeedLimit"]; + _form["autoAku_defaultName"] = temp["autoAku_defaultName"]; + _form["autoAku_defaultMail"] = temp["autoAku_defaultMail"]; + _form["autoAku_defaultText"] = temp["autoAku_defaultText"]; + + if (_form["enableSpeedLimit"] === "ON") { + let target = document.querySelector("#field_speedLimit"); + target.setAttribute("style", "display:inline;"); + } + + } + + function _splitt(value) { + return value.split("\r\n"); + } + + function _escapeRegexp(str) { + return str.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1"); + } + function DeleteBtnEventListener() { let elm = document.querySelector("#b_autoAkuDelete"); elm.addEventListener("click", function(ev) {
  • /*
     * @title ほぼ完全自動アク禁ブックマークレット2
     * @include http://*.open2ch.net
     * @license MIT License
     */
    //作った人: Awn
    
    let osirase = "【ほぼ完全自動アク禁ブックマークレット2】\n\nまだ完成していません><";
    alert(osirase);
    
    (function() {
        //class
        class MutationListener {
            constructor(f) {
                this.target = document.querySelector("div.thread");
                this.option = { childList: true };
                this.mo = new MutationObserver(f);
            }
    
            start() {
                this.mo.observe(this.target, this.option);
            }
    
            stop() {
                this.mo.disconnect();
            }
        }
    
        class AkukinAgent {
            constructor(MESSAGE, FROM, mail) {
                let fd = new FormData();
                fd.set("bbs", bbs);
                fd.set("key", key);
                fd.set("submit", "書き込む");
                this.fd = fd;
    
                this.update(MESSAGE, FROM, mail);
    
                let xhr = new XMLHttpRequest();
                xhr.addEventListener("loadend", this.f_xhr);
                this.xhr = xhr;
            }
    
            update(MESSAGE = "", FROM = "", mail = "") {
                let fd = this.fd;
                fd.set("FROM", FROM);
                fd.set("mail", mail);
                this.fd = fd;
    
                this.MESSAGE = MESSAGE;
            }
    
            set(target) {
                let fd = this.fd;
                fd.set("MESSAGE", this.MESSAGE + "\n" + target);
                fd.set("time", Math.floor(Date.now() / 1000));
                this.fd = fd;
            }
    
            f_xhr(result) {
                let response = result.target.response;
                if (response.includes("<title>書きこみました。</title>")) {
                    console.log("success");
                } else {
                    console.log("error");
                    console.log(response);
                }
            }
    
            exec() {
                let xhr = this.xhr;
                let fd = this.fd;
                xhr.open("POST", "/test/bbs.cgi?guid=ON");
                xhr.send(fd);
            }
        }
    
        class ResHead {
            set(dts) {
                this.dts = dts;
            }
    
            parse() {
                let reshead = [];
                let main, mail;
                const REGEXP_MAIN = new RegExp(/^([0-9]{1,4}) :(.*?) ?:.* ID:(.*$)/);
                const REGEXP_MAIL = new RegExp(/<a href="mailto:(.*?)">/);
                for (let value of this.dts) {
                    main = value.innerText.match(REGEXP_MAIN);
                    mail = value.outerHTML.match(REGEXP_MAIL);
                    reshead.push({
                        resnum: main[1] - 0,
                        name: main[2],
                        id: main[3].replace("(主)", "").replace(" ", "").replace("×", ""),
                        nusi: main[3].includes("(主)"),
                        mail: mail === null ? null : mail[1]
                    });
                }
                this.data = reshead;
                return reshead;
            }
    
            get() {
                return this.data;
            }
        }
    
        class ResBody {
            set(dds) {
                this.dds = dds;
            }
    
            parse() {
                let nodes, nodeName, node, imgurs, arr;
                let resbody = [];
                for (let value of this.dds) {
                    nodes = value.childNodes;
                    arr = [];
                    for (let ix = 0, len = nodes.length - 3; ix < len; ix++) {
                        node = nodes[ix];
                        nodeName = node.nodeName.toLowerCase();
                        //note: 通常の目に見えるテキスト,いわゆる本文の各一行
                        if (nodeName === "#text") {
                            arr.push(node.textContent.trim());
                        }
    
                        //note: 文末改行および空行
                        if (nodeName === "br") {
                            arr.push("\n");
                        }
    
                        //note: リンク
                        if (nodeName === "a") {
                            //note: 安価参照の場合はリンクではなく安価テキスト(e.g. >>243-256 )を取得する
                            if (/^\/test\/read\.cgi\/.*/.test(node.pathname)) {
                                arr.push(node.textContent.trim());
                            } else {
                                arr.push(node.href);
                            }
                        }
    
                        //note: imgur画像は複数毎がグループ化されているので、それを取り出す
                        if (nodeName === "div" && node.className === "group" && node.firstChild.className === "imgur") {
                            imgurs = node.querySelectorAll("a");
                            for (let imgur of imgurs) {
                                arr.push(imgur.href);
                            }
                        }
    
                        if (nodeName === "font") {
                            arr.push(node.textContent.trim());
                        }
    
                    }
                    resbody.push(arr.join(""));
                }
                this.data = resbody;
                return resbody;
            }
    
            get() {
                return this.data;
            }
        }
    
        class Res {
            set(reshead, resbody) {
                let data = [];
                for (let ix = 0, len = reshead.length; ix < len; ix++) {
                    reshead[ix].text = resbody[ix];
                }
                this.data = reshead;
            }
    
            get() {
                return this.data;
            }
        }
    
        //member
        let _form = {};
        let _idList = {};
    
    
        //instances
        let _mo;
        let _agent;
        let _reshead;
        let _resbody;
        let _res;
    
    
        //initializer
        _init();
    
    
        //function
        function _init() {
            _embedForm();
    
            let enableAkukin = _getStorage("enableAkukin");
            let MESSAGE = _getStorage("autoAku_defaultText");
            let FROM = _getStorage("autoAku_defaultName");
            let mail = _getStorage("autoAku_defaultMail");
            _agent = new AkukinAgent(MESSAGE, FROM, mail);
            _mo = new MutationListener(_MutationCallback);
    
            if (enableAkukin) {
                _setupForm();
                if (enableAkukin === "ON") {
                    _mo.start();
                }
            }
    
            _assignEventListener();
            _createInstances();
        }
    
        function _assignEventListener() {
            ShowBtnEventListener();
            SaveBtnEventListener();
            DeleteBtnEventListener();
            SpeedLimitRadioBtnEventListener();
        }
    
        function _createInstances() {
            _res = new Res();
            _reshead = new ResHead();
            _resbody = new ResBody();
        }
    
        function _embedForm() {
            let section = document.createElement("section");
            section.setAttribute("id", "autoAkuSection");
            section.innerHTML = '<hr><h2 style="color:red;">自動アク禁設定</h2><input type="button" name="b_autoAkuShow" id="b_autoAkuShow" value="開く"> <input type="button" name="b_autoAkuDelete" id="b_autoAkuDelete" value="データを全て消す">';
    
            let form = document.createElement("form");
            form.setAttribute("name", "fm_autoAku");
            form.setAttribute("id", "fm_autoAku");
            form.setAttribute("style", "display:none;");
            form.innerHTML = '<fieldset><legend>自動アク禁投稿で使用する名前とmailと本文</legend><label>名前:<input type="text" size="40" name="autoAku_defaultName" placeholder="(省略化)自動アク禁用の名前"></label><br><label>mail:<input type="text" size="40" name="autoAku_defaultMail" placeholder="(省略化)自動アク禁用のmail"></label><br><textarea rows="5" cols="56" name="autoAku_defaultText" placeholder="(省略可)ここに書いたメッセージに!aku42といったアク禁コマンドが自動で足されます。"></textarea></fieldset><fieldset><legend>自動アク禁キーワード設定</legend><label>アク禁ワード↓<br><textarea rows="5" cols="56" name="autoAku_words" placeholder="改行区切りで入力"></textarea><br></label><label>アク禁ネーム↓<br><textarea rows="5" cols="56" name="autoAku_names" placeholder="改行区切りで入力"></textarea><br></label><label>アク禁メール↓<br><textarea rows="5" cols="56" name="autoAku_mails" placeholder="改行区切りで入力"></textarea><br></label><label>アク禁id↓<br><textarea rows="5" cols="56" name="autoAku_ids" placeholder="改行区切りで入力"></textarea><br></label></fieldset><fieldset><legend>その他の設定</legend>投稿間隔でアク禁:<input type="radio" name="enableSpeedLimit" value="OFF" checked>OFF<input type="radio" name="enableSpeedLimit" value="ON">ON<span id="field_speedLimit" style="display:none;"><input type="number" size="10" min="1" max="3600" name="autoAku_speedLimit" value="1">秒未満の間隔で投稿するidをアク禁する</span><br>正規表現を利用する:<input type="radio" name="enableRegexp" value="OFF" checked>OFF<input type="radio" name="enableRegexp" value="ON">ON<br>アク禁を実行する :<input type="radio" name="enableAkukin" value="OFF" checked>OFF<input type="radio" name="enableAkukin" value="ON">ON</fieldset><input type="button" id="b_autoAkuSave" name="b_autoAkuSave" value="アク禁設定を保存する"><span id="autoAku_message" style="color:red;"></span>';
            document.body.appendChild(section);
            section.appendChild(form);
    
            return;
        }
    
        function _setupForm() {
            let form = document.forms["fm_autoAku"];
            let fd = new FormData(form);
            let temp = {};
            let storage;
            for (let [key, value] of fd) {
                storage = _getStorage(key);
                temp[key] = storage;
                form[key].value = storage;
            }
            _validateForm(temp)
                .then(_setInternalValue);
            console.dir(_form);
        }
    
        function _MutationCallback(record) {
            let dl = record[0].addedNodes[0];
            //note: dlの中にdt, ddは1組以上含まれる可能性がある
            _reshead.set(dl.querySelectorAll("dt"));
            _resbody.set(dl.querySelectorAll("dd"));
            _res.set(_reshead.parse(), _resbody.parse());
    
            let res = _res.get();
            //res.forEach((elm) => { _idList[elm.id] = Date.now(); });
    
            let judge = [];
            let isTarget = false;
            let target = [];
            let limit = _form["limit"] * 1000;
            let enableSpeedLimit = _form["enableSpeedLimit"] === "ON" ? true : false;
            for (let value of res) {
                judge = [];
                isTarget = false;
                if (!value.nusi) {
                    judge.push(_form["word"].some((elm) => elm.test(value.text)));
                    judge.push(_form["name"].some((elm) => elm.test(value.name)));
                    judge.push(_form["mail"].some((elm) => elm.test(value.mail)));
                    judge.push(_form["id"].some((elm) => elm.test(value.id)));
                    isTarget = judge.some((elm) => elm);
                    if (isTarget) {
                        target.push(value.resnum);
                    }
                    if (enableSpeedLimit) {
                        if (Date.now() - _idList[value.id] < limit) {
                            target.push(value.resnum);
                        }
                        _idList[value.id] = Date.now();
                    }
                }
            }
            target = target.filter((elm, ind, ary) => ary.indexOf(elm) === ind);
            target = target.map((elm) => "!aku" + elm);
            console.log(target);
    
            if (target.length) {
                _agent.set(target);
                _agent.exec();
            }
    
            //        console.dir(res);
            console.dir(_idList);
            console.dir(_form);
            return;
        }
    
    
    
    
        /* Event Listener */
        function ShowBtnEventListener() {
            let elm = document.querySelector("#b_autoAkuShow");
            elm.addEventListener("click", function(ev) {
                let form = document.forms["fm_autoAku"];
                let style = form.getAttribute("style");
                if (style.includes("none")) {
                    form.setAttribute("style", "display:block;");
                    elm.value = "開じる";
                } else {
                    form.setAttribute("style", "display:none;");
                    elm.value = "開く";
                }
            });
        }
    
        function SaveBtnEventListener() {
            let elm = document.querySelector("#b_autoAkuSave");
            elm.addEventListener("click", function(ev) {
                let form = ev.target.form;
                let fd = new FormData(form);
                let temp = {};
                for (let [key, value] of fd) {
                    temp[key] = value;
                }
                let message = document.querySelector("#autoAku_message");
                _validateForm(temp)
                    .then(function(result) {
                        _setInternalValue(result);
    
                        fd.set("autoAku_speedLimit", result[5]);
                        for (let [key, val] of fd) {
                            _setStorage(key, val);
                        }
    
                        if (temp["enableAkukin"] === "ON") {
                            _mo.start();
                        } else {
                            _mo.stop();
                        }
    
                        _agent.update(_form["autoAku_defaultText"], _form["autoAku_defaultName"], _form["autoAku_defaultMail"]);
    
                        message.textContent = "保存しますた!";
                        setTimeout(() => { message.textContent = "" }, 1000);
    
                        return;
                    }, function(reason) {
                        alert(reason);
                        message.textContent = "保存してません!";
                        setTimeout(() => { message.textContent = "" }, 1000);
                        return;
                    });
            });
        }
    
        function _validateForm(data) {
            return new Promise(function(resolve, reject) {
                let word, name, mail, id, limit;
    
                let words = data["autoAku_words"];
                let names = data["autoAku_names"];
                let mails = data["autoAku_mails"];
                let ids = data["autoAku_ids"];
    
                let arr_words = _splitt(words).filter((elm) => elm !== "");
                let arr_names = _splitt(names).filter((elm) => elm !== "");
                let arr_mails = _splitt(mails).filter((elm) => elm !== "");
                let arr_ids = _splitt(ids).filter((elm) => elm !== "");
    
                if (data["enableRegexp"] === "ON") {
                    try {
                        word = arr_words.map((elm) => new RegExp(elm, "g"));
                        name = arr_names.map((elm) => new RegExp(elm, "g"));
                        mail = arr_mails.map((elm) => new RegExp(elm, "g"));
                        id = arr_ids.map((elm) => new RegExp(elm, "g"));
                    } catch (e) {
                        let message = "正規表現の指定がおかしいみたいです。。\n↓\n↓\n" + e.message;
                        reject(message);
                        return;
                    }
                } else {
                    word = arr_words.map((elm) => new RegExp(_escapeRegexp(elm), "g"));
                    name = arr_names.map((elm) => new RegExp(_escapeRegexp(elm), "g"));
                    mail = arr_mails.map((elm) => new RegExp(_escapeRegexp(elm), "g"));
                    id = arr_ids.map((elm) => new RegExp(_escapeRegexp(elm), "g"));
                }
    
                if (data["enableSpeedLimit"] === "ON") {
                    limit = data["autoAku_speedLimit"] - 0;
                    limit = isNaN(limit) ? 1 : limit;
                    limit = limit >= 1 ? limit : 1;
                } else {
                    limit = 1;
                }
    
                resolve([data, word, name, mail, id, limit]);
                return;
            });
        }
    
        function _setInternalValue([temp, word, name, mail, id, limit]) {
            _form["word"] = word;
            _form["name"] = name;
            _form["mail"] = mail;
            _form["id"] = id;
            _form["limit"] = limit;
            _form["enableAkukin"] = temp["enableAkukin"];
            _form["enableRegexp"] = temp["enableRegexp"];
            _form["enableSpeedLimit"] = temp["enableSpeedLimit"];
            _form["autoAku_defaultName"] = temp["autoAku_defaultName"];
            _form["autoAku_defaultMail"] = temp["autoAku_defaultMail"];
            _form["autoAku_defaultText"] = temp["autoAku_defaultText"];
    
            if (_form["enableSpeedLimit"] === "ON") {
                let target = document.querySelector("#field_speedLimit");
                target.setAttribute("style", "display:inline;");
            }
    
        }
    
        function _splitt(value) {
            return value.split("\r\n");
        }
    
        function _escapeRegexp(str) {
            return str.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
        }
    
        function DeleteBtnEventListener() {
            let elm = document.querySelector("#b_autoAkuDelete");
            elm.addEventListener("click", function(ev) {
                if (confirm("消しますか?")) {
                    let form = document.forms["fm_autoAku"];
                    let fd = new FormData(form);
                    for (let [key, value] of fd) {
                        _removeStorage(key);
                    }
    
                    form.reset();
                    _mo.stop();
    
                    let target = document.querySelector("#field_speedLimit");
                    target.setAttribute("style", "display:none;");
                }
            });
        }
    
        function SpeedLimitRadioBtnEventListener() {
            let limit_on = document.querySelector("input[type='radio'][name='enableSpeedLimit'][value='ON']");
            let limit_off = document.querySelector("input[type='radio'][name='enableSpeedLimit'][value='OFF']");
            let target = document.querySelector("#field_speedLimit");
            limit_on.addEventListener("click", function(ev) {
                target.setAttribute("style", "display:inline;");
            });
            limit_off.addEventListener("click", function(ev) {
                target.setAttribute("style", "display:none;");
            });
        }
    
    
        /* wrapper function */
        function _getStorage(key) {
            return localStorage.getItem(key);
        }
    
        function _setStorage(key, val) {
            localStorage.setItem(key, val);
        }
    
        function _removeStorage(key) {
            return localStorage.removeItem(key);
        }
    
        return;
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2017/01/07 19:39:10 - 2017-01-07
  2. 2017/01/07 19:36:41 - 2017-01-07
  3. 2017/01/07 19:19:23 - 2017-01-07
  4. 2017/01/07 19:05:51 - 2017-01-07
  5. 2017/01/07 18:56:24 - 2017-01-07
  6. 2017/01/07 05:45:10 - 2017-01-07
  7. 2017/01/06 03:07:29 - 2017-01-06
  8. 2017/01/06 02:55:51 - 2017-01-06
  9. 2017/01/06 00:26:19 - 2017-01-06
  10. 2017/01/05 23:46:52 - 2017-01-05
  11. 2017/01/05 00:04:58 - 2017-01-05
  12. 2017/01/04 04:07:48 - 2017-01-04
  13. 2017/01/03 23:47:17 - 2017-01-03