// ==UserScript== // @name ヤフオクで非表示とメモ // @description q:非表示 w:アンドゥ b:NGワード Shift+Q:NG編集 12:メモを追加 34:自由メモ 56:定型文をメモ Shift+!:メモを編集 Shift+":自動メモのみ全削除 Shift+#:メモを一時非表示 Shift+56:定型文を設定 .:上限価格 t:半透明モード // @match *://auctions.yahoo.co.jp/search/* // @match *://page.auctions.yahoo.co.jp/jp/auction/* // @match *://auctions.yahoo.co.jp/seller/* // @match *://auctions.yahoo.co.jp/category/list/* // @match *://cpu.userbenchmark.com/* // @match *://webcomics.jp/* // @match *://www.amazon.co.jp/* // @exclude *://www.amazon.co.jp/*/cart/* // @exclude *://www.amazon.co.jp/*/buy/* // @exclude *://www.amazon.co.jp/*/huc/* // @exclude *://www.amazon.co.jp/*/css/* // @exclude *://www.amazon.co.jp/ap/* // @exclude *://www.amazon.co.jp/gp/* // @exclude *://www.amazon.co.jp/auto-deliveries* // @match *://booklive.jp/index/no-charge* // @match *://ebookjapan.yahoo.co.jp/free* // @match *://ebookjapan.yahoo.co.jp/ranking/free/* // @match *://ebookjapan.yahoo.co.jp/ranking/details/free/* // @match *://ebookjapan.yahoo.co.jp/viewer* // @match *://sokuyomi.jp/* // @match *://csbs.shogakukan.co.jp/free* // @match *://www.rtings.com/*/tools/table* // @match *://www.rtings.com/*/reviews/* // @match *://www.nicovideo.jp/search/* // @match *://www.nicovideo.jp/tag/* // @match *://www.nicovideo.jp/user/* // @match *://www.nicovideo.jp/series/* // @match *://www.nicovideo.jp/my/* // @match *://www.nicovideo.jp/ranking/* // @match *://www.nicovideo.jp/watch/* // @match *://*.5ch.net/* // @match *://www.ebay.com/sch/* // @match *://www.ebay.com/itm/* // @match *://jmty.jp/* // @match *://greasyfork.org/*/scripts* // @match *://*.aliexpress.com/af/* // @match *://*.aliexpress.com/item/* // @match *://*.aliexpress.com/wholesale* // @match *://www.cmoa.jp/freecontents* // @match *://piccoma.com/* // @match *://www.mangaz.com/* // @match *://www.sukima.me/* // @match *://*.userbenchmark.com/* // @match *://www.hellowork.mhlw.go.jp/kensaku/* // @match *://kakaku.com/* // @match *://seiga.nicovideo.jp/* // @match *://seiga.nicovideo.jp // @match *://tsugimanga.jp/* // @match *://www.yodobashi.com/* // @match *://www.youtube.com/* // @match *://*.iherb.com/* // @match *://www.suruga-ya.jp/* // @match *://twitter.com/* // @match *://www.nicovideo.me/* // @match *://www.nicochart.jp/* // @match *://pubmed.ncbi.nlm.nih.gov/?term=* // @match *://pubmed.ncbi.nlm.nih.gov/?linkname=* // @match *://pubmed.ncbi.nlm.nih.gov/* // @match *://a-timesale.com/* // @match *://rrws.info/* // @match *://commons.nicovideo.jp/* // @match *://scholar.google.tld/* // @match *://hibiki-radio.jp/* // @match *://www.onsen.ag/ // @match *://www.freem.ne.jp/* // @match *://shopping.yahoo.co.jp/search* // @match *://360life.shinyusha.co.jp/* // @match *://omocoro.jp/* // @match *://minsoku.net/* // @match https://refind2ch.org/search* // @match *://chiebukuro.yahoo.co.jp/* // @match *://www.msdmanuals.com/* // @match *://ff5ch.syoboi.jp/?q=* // @match *://todo-ran.com/* // @match *://booth.pm/* // @match *://sakura-checker.jp/category/* // @match https://chrome.google.com/webstore/search/* // @match https://chrome.google.com/webstore/detail/* // @match *://twicomi.com/* // @match *://twiman.net/* // @match *://free.arinco.org/* // @match *://workman.jp/shop/* // @match *://www.uniqlo.com/* // @match *://*.shitaraba.net/bbs/read.cgi/* // @match *://*.shitaraba.net/bbs/read_archive.cgi/* // @match *://*.ftbucket.info/* // @match *://kuzure.but.jp/* // @match *://*.2chan.net/* // @match *://anige.horigiri.net/* // @match *://futapo.futakuro.com // @match *://futapo.futakuro.com/* // @match *://kako.futakuro.com/futa/* // @match https://kakaku.com/pc/note-pc/itemlist.aspx // @match https://kakaku.com/pc/desktop-pc/itemlist.aspx // @match *://btopc-minikan.com/* // @match *://pcfreebook.com/* // @version 0.5.55 // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_addStyle // @grant GM.setClipboard // @run-at document-idle // @namespace https://greasyfork.org/users/181558 // @require https://code.jquery.com/jquery-3.4.1.min.js // @downloadURL none // ==/UserScript== (function() { const REPLACE_LINK_IN_YOUTUBE = 1; // 1:YouTubeで投稿者のチャンネルのホームタブへのリンクをチャンネルの動画タブへのリンクに置き換える const FUTABA_FLOAT_RELOAD_BUTTON = 1; // 1:ふたばでリロードボタンを浮遊させる const FUTABA_REPLACE_POPUP_FUNCTION = 1; // 1:ふたばで本文の引用ポップアップを置き換える const FUTABA_HOVER_DELAY = 1; // ふたばで>引用の上に静止してn/60秒間後にポップアップを表示する -1:瞬間&低負荷(mousemove) 1~:n/60秒(interval) const ftbBGC = 0 ? "#f0e0d6" : "#ffffee" const ENABLE_HELP = 1; // 1:操作ガイドを表示 0:無効 const ENABLE_AUTOMEMO = 7; // 0:自動メモを無効 1でオン 2~7:大きくするほど一時的に表示が崩れる代わりに確実 const ENABLE_EXCEPT_YAJ = 1; // 1:ヤフオク以外でも有効 0:ヤフオクでのみ動作 var debug = 0; // 1~だとデバッグモード dc(text) 1:非対応ページでその旨表示など/コンソールにverbose表示 2:verboseをポップアップ(速度測定して表示 sw("項目"))&非表示にした原因に枠追加 3:Q/1/2等の対象要素を目立たせる const fasttest = 1; // 1:高速モードを試用 const KEYCHANGE_DEBUG = "disable"; // 押す度にdebugを0~3に切り替えるキー "Shift+D","disable"等 const WCA_HIDE_SOME_SITES = 0; // (Web漫画アンテナで)1:使いにくい又は遅いサイト(コミックライド、マンガPark、コミックファイア、コミックヴァルキリー、まんがライフSTORIA´、がうがうモンスター、Z、スポバトマンガ研究所、WEBコミックガンマ、COMICリュウ、新都社、COMIC FUZ、COMICフルール、comicグラスト)の項目を隠す 0:無効 const SITES_TO_BE_HIDDEN = ["マンガPark", "コミックファイア", "コミックヴァルキリー", "まんがライフSTORIA´", "COMICメテオ", "がうがうモンスター", "Z", "スポバトマンガ研究所", "WEBコミックガンマ", "COMICリュウ", "新都社", "COMIC FUZ", "COMICフルール", "コミックライド", "comicグラスト", "マンガ5"]; // Web漫画アンテナで使いにくい、遅い等非表示にしたいサイトを書く const ENABLE_MEASURE_TIME_SPENT = 0; // 1で速度測定して表示 sw("項目") var futabapopupscale; var futabapicksizeL = 50; var futabapicksize = 100; var hovertimer = 0; var swb = new Date(); sw("reset") String.prototype.match0 = function(re) { let tmp = this.match(re); if (!tmp) { return null } else if (tmp.length > 1) { return tmp[1] } else return tmp[0] } // gフラグ不可 let inYOUTUBE = location.hostname.match0(/^www\.youtube\.com|^youtu\.be/); $.fn.animate2 = function(properties, duration, ease) { ease = ease || 'ease'; var $this = this; var cssOrig = { transition: $this.css('transition') }; return $this.queue(next => { properties['transition'] = 'all ' + duration + 'ms ' + ease; $this.css(properties); setTimeout(function() { $this.css(cssOrig); next(); }, duration); }); }; if (window != parent) return; const WAIT = performance.now(); // ページ開始後のウエイト用 delayAutoWeightingをかける const COLOR1 = "#6080ff", COLOR2 = "#c03020", COLOR3 = "#808080", COLOR5 = "#6080ff", COLOR6 = "#c03020", COLORVIDEOTIME = "#204020", COLORCPUSCORE = "#a08000", KEYHIDE = "q", KEYUNDO = "w", KEYBW = "b", KEYEDIT = "Shift+Q", // KEYEDIT2 = "Shift+B", KEYMAXP = ".", KEYMEMO1 = "1", KEYMEMO2 = "2", KEYMEMO1S = "3", KEYMEMO2S = "4", KEYMEMO5 = "5", KEYMEMO6 = "6", KEYMEMO5EDIT = "Shift+%", KEYMEMO6EDIT = "Shift+&", KEYTOGGLEtranslucent = "t", KEYRESETMEMO = "Shift+!", KEYRESETMEMOAUTO = "Shift+\""; var MEMO5WORD = "", // 5キーの定型文初期値 ""なら現在年月日 MEMO6WORD = ""; // 6キーの定型文初期値 ""なら現在年月日 var pauseAll = 0; let kaisuuU = 0; var GF = {} // 上が優先 const SITEINFO = [{ id: 'pcfreebook.com', urlRE: '//pcfreebook.com/', listTitleXP: '//td[1]/a[@target="_blank" and @rel="noopener nofollow noreferrer"]', listTitleSearchXP: '//td[1]/a[@target="_blank" and @rel="noopener nofollow noreferrer"][+++]/ancestor::tr', listTitleMemoSearchXP: '//td[1]/a[@target="_blank" and @rel="noopener nofollow noreferrer"][+++]', listGen: 3, listTitleMemoSearchXPSameGen: 1, listTitleXPIgnoreNotExist: 1, observe: 2500, }, { id: 'btopc-minikan.com', urlRE: '//btopc-minikan.com/', titleProcessFunc: (title) => { return title.replace(/\n|\s/gmi, " ").trim() }, listTitleXP: '//span[@class="itemname"]', listTitleSearchXP: '//span[@class="itemname"][++title++]/ancestor::tr', listTitleMemoSearchXP: '//span[@class="itemname"][++title++]', listTitleMemoSearchXPSameGen: 1, useTitle: 1, listGen: 4, func: () => { elegeta('//td[1]/div[@class="notranslate"]|.//td[@class="CPUgrease-GraphCell-Maker"]').forEach(e => e.insertAdjacentHTML("beforeend", ` `)) }, listTitleXPIgnoreNotExist: 1, observe: 2500, }, { urlRE: /^https:\/\/kakaku.com\/pc\/note-pc\/itemlist\.aspx|https:\/\/kakaku\.com\/pc\/desktop-pc\/itemlist.aspx/, WhateverFirstAndEveryAPFunc: () => { if (!elegeta('//th[@class="sub thHeader" and contains(text(),"CPUスコア ")]')[0]) return popup3("A:CPUスコア単価で絞り込み", 4) $(".cps").remove() elegeta('//table/tbody/tr[@class="tr-border"]/td[10]').forEach(e => { let p = elegeta('//td[2]/ul/li[@class="pryen"]/a', e?.closest("tr"))[0] let b = e.parentNode let cpu = parseInt(e.innerText.replace(/\D/g, "")) let price = parseInt(p.innerText.replace(/\D/g, "")) e.insertAdjacentHTML("beforeend", `
価格/スコア
${((price/cpu).toFixed(2))}
`) }) }, keyFunc: [{ key: 'a', // a:: func: () => { if (!elegeta('//th[@class="sub thHeader" and contains(text(),"CPUスコア ")]')[0]) return let base = proInput("CPUスコア単価上限を入力してください", $('#CPS').data("cps") || 10) || 0; $('#CPS').remove(); $(document.body).append(``) $(elegeta('//table/tbody/tr[@class="tr-border"]')).show(100) if (base <= 0) return elegeta('.cputanka').forEach(e => { let cps = Number(e?.innerText || 0) let b = e.closest("tr.tr-border") if (!cps || cps > base) { $(b.previousSibling.previousSibling).add(b).hide(100) } }) } }, ], }, { urlRE: /\/\/www.ftbucket.info\/scrapshot\/ftb\/index\.php|\/\/www.ftbucket.info\/scrapshot\/ftb\/?$|\/\/www.ftbucket.info\/scrapshot\/ftb\/\?favo=/, id: 'FUTACHAN_CATALOG', listTitleXP: '//span', listTitleSearchXP: '//td/span[**title**]/..', listTitleMemoSearchXP: '//td/span[**title**]', listGen: 4, WhateverFirstAndEveryAPFunc: () => { popup3("Shift+F:FTBucket検索", 8, 5000) }, // WhateverFirstAndEveryAPFunc: () => { SITEINFO[SITEINFO.findIndex(c => c.id == "FUTACHAN")].WhateverFirstAndEveryAPFunc() }, keyFunc: [{ key: 'Shift+F', // Shift+F::FTBucketでキーワード検索 func: () => { searchWithHistory("FUTACHAN", "FTBucket", 'https://www.ftbucket.info/scrapshot/ftb/index.php?mode=c&favo=0&ord=1&s=***', "|") }, // func: () => { SITEINFO[SITEINFO.findIndex(c => c.id == "FUTACHAN")].keyFunc[0].func() }, }], listTitleMemoSearchXPSameGen: 1, delay: 333, func: () => { elegeta('//div/input[@type="search" and @id="searchword"]').forEach(e => e.style.width = "calc(100% - 4em)") // 検索フォームを大きく if (location.href.match0("//www.ftbucket.info/scrapshot/ftb/")) { setSlider(eleget0('//html/body/div[2]/a/img/..'), 4, 255, 16, "タイトル表示:***文字", "FTBTitleLength", (val) => elegeta('//td/span[@title]/div').forEach(e => e.textContent = e.parentNode.title.substr(0, val))) setSlider(eleget0('//html/body/div[2]/a/img/..'), 4, 30, 8, "セル幅:***em", "FTBcallWidth", (val) => elegeta('//td/span[@title]/div/../..').forEach(e => e.style.width = `${val}em`)) } }, }, { urlRE: "\/\/futapo.futakuro.com", // futapo:: id: 'FUTACHAN_CATALOG', listTitleXP: '//div[@class="thread-text"]', listTitleSearchXP: '//div[@class="thread-text"][***]/../..|.//span[@class="emph"][***]/../../..', listTitleMemoSearchXP: '//div[@class="thread-text"][***]|.//span[@class="emph"][***]/..', listGen: 5, listTitleXPIgnoreNotExist: 1, //delayAutoWeighting: 1, observe: 666, observeClass: ["box", "yhmMyMemo"], //WhateverFirstAndEveryAPFunc: () => { SITEINFO[SITEINFO.findIndex(c => c.id == "FUTACHAN_CATALOG")].WhateverFirstAndEveryAPFunc() }, WhateverFirstAndEveryAPFunc: () => { popup3("Shift+F:FTBucket検索\nu:左上優先配置タイトルを設定\nU:左上優先配置(+通知)タイトルを設定\nE:更新 ↻", 8, 5000) //$("#reload,#logo").attr("title", ($("#reload,#logo").attr("title") || "") + "\nE:更新 ↻") }, listTitleMemoSearchXPSameGen: 1, funcOnlyFirst: () => { GM_addStyle('.popuptext,.popuptext-back{z-index:1000000000000;}') GM_addStyle(".boxpri1{animation: pulse1 5s 1; } @keyframes pulse1 { 0% { outline:5px solid #0000ffff; } 40% { outline:5px solid #0000ffff; } 100% { outline:5px solid #0000ff00; } }") setTimeout(() => { $("#reload,#logo").attr("title", ($("#reload,#logo").attr("title") || "") + "\nE:更新\nD/右クリック:更新+スクロール") // ↻ $('#reload,#logo').on("contextmenu", () => { // d:: let r = eleget0('//a[@id="reload"]'); if (r) { if (!r.dataset.latestclickdate || new Date().getTime() - r.dataset.latestclickdate > 5000) { r.click(); let scr = (i) => { let last = eleget0('#kako-search') window.scroll({ left: 0, top: last ? 0 : 99999, behavior: i % 2 == 1 ? "instant" : "smooth" }) if (!last && i < 99) setTimeout(() => { scr(++i) }, 100) } scr(0) r.dataset.latestclickdate = new Date().getTime(); } // 要5秒インターバル } return false }) $('a#server.pulldown').attr("title", ($("a#server.pulldown").attr("title") || "") + "\n右クリック:may←→img") // ↻ $('a#server.pulldown').on("contextmenu", () => { let url = location.href == 'https://futapo.futakuro.com/?server=img_b' ? 'https://futapo.futakuro.com/?server=may_b' : 'https://futapo.futakuro.com/?server=img_b' location.href = url; return false }) }, 500) GM_addStyle("div.thread-text{display:inline;} .thread-text{word-break:break-all;}") // html{line-height:1.2;} setTimeout(() => { setSlider(eleget0('//div[@id="boxArea"]'), 54, 300, 54, "box高さ:***", "boxheight", (val) => { $('div.thread-contents').css({ "height": val - 2 + "px" }) $('a.box').css({ "height": 15 + val + "px" }) }, 2000, 'style="width:7em;height:0.5em;"') setSlider(eleget0('//div[@id="boxArea"]'), 0, 10, 5, "タイトル行間:***", "lineheight", (val) => { GM_addStyle(`html{line-height:${1+val/10}}`) }, 0, 'style="width:7em;height:0.5em;"') }, 999) var lastope = Date.now(), cdID setTimeout(() => { if (eleget0('#reload') && !cdID) { document.body.insertAdjacentHTML("beforeend", `⏼無操作
自動更新
`) $(`#cdsw`).on("click", () => { $('#cdsw').text("ON").hide(555); $(document).on("mousemove mousedown keydown", () => { lastope = Date.now() }) var lastope = Date.now(), cdID var cdID = setInterval(() => { $('#cd').remove(); document.body.insertAdjacentHTML("beforeend", `${~~(60-(Date.now()-lastope)/1000)}`) $(`#cd`).on("click", () => { clearInterval(cdID); $('#cd').text("OFF").hide(555); }) if (Date.now() - lastope > 60 * 1000) { lastope = Date.now(); eleget0('//li[1]/a[@id="reload"]')?.click() } }, 1000) }) } }, 500) }, funcMemo: () => { SITE.funcFinally() }, funcFinally: () => { let found = 0; try { // u:: メモが付いたものを左上に優先整列 //elegeta('//span[@class="emph"]').forEach(e => e.outerHTML = e.innerHTML); for (let i = 0; elegeta('.box:not([relocatedByMemo])').filter(e => eleget0(".yhmMyMemo", e)).length > 0; i++) { let e = elegeta('.box:not([relocatedByMemo])').filter(e => eleget0(".yhmMyMemo", e))[0] let memoeles = elegeta(".yhmMyMemo", e) let vip = memoeles.find(e => e.innerText == "◎") let memoFor = memoeles.map(e => e?.title?.match0(/『(.+)』についたメモ/)); // e.classList.add("relocatedByMemo") e.setAttribute("relocatedByMemo", "") let memoEle = e.closest(".box") let firstBox = elegeta('.box:not(.boxpri)').filter(e => e.style.backgroundColor !== "rgb(255, 255, 0)")[0] //memoEle.style.fontWeight = "bold" if (vip) { eleget0('.thread-text', memoEle).style.color = "#12e"; memoEle.style.boxShadow = "2px 2px 4px 2px #0006"; //memoEle.style.transform="translate(-1px,-1px)" memoEle.style.zIndex = 2; memoEle.style.fontWeight = "bold" memoEle.classList.add("boxpri1") } else { memoEle.style.boxShadow = "4px 4px 4px #0006"; memoEle.style.zIndex = 1; } if (!memoEle.title) memoEle.title = memoeles.map((e, i) => e.innerText + (e?.title?.match0(/『(.+)』についたメモ/))).join(" ") memoEle.classList.add("boxpri") firstBox.parentNode.insertBefore(memoEle, firstBox) if (vip) { found = memoEle.cloneNode(true); notifyMe(eleget0(".thread-text", found)?.innerText, eleget0(".yhmMyMemo", found)?.title.match0(/^『(.*)』/), () => { window.open(memoEle.href) }) } } if (found) { function sound(type, sec) { let ctx = new AudioContext(); let osc = ctx.createOscillator(); osc.type = type; osc.connect(ctx.destination); osc.start(); osc.stop(sec); } sound("sine", 0.2); } } catch (e) {} //domsort(eleget0('#data'), elegeta('.boxpri'), v => -Number(eleget0('//div[contains(@class,"ikioi-icon")]', v).textContent), 1) }, memoStyle: 'word-break:break-all; font-size:10px !important;', // wholeHelp: ' 7:左上優先整列ワードを登録', keyFunc: [{ key: 'd', // d:: func: (e) => { let r = eleget0('//a[@id="reload"]'); if (r) { if (!r.dataset.latestclickdate || new Date().getTime() - r.dataset.latestclickdate > 5000) { r.click(); let scr = (i) => { let last = eleget0('#kako-search') window.scroll({ left: 0, top: last ? 0 : 99999, behavior: i % 2 == 1 ? "instant" : "smooth" }) if (!last && i < 99) setTimeout(() => { scr(++i) }, 100) } scr(0) r.dataset.latestclickdate = new Date().getTime(); } // 要5秒インターバル } }, }, { key: 'e', // e::リロード func: () => { let r = eleget0('//a[@id="reload"]'); if (r) { if (!r.dataset.latestclickdate || new Date().getTime() - r.dataset.latestclickdate > 4000) { r.click(); r.dataset.latestclickdate = new Date().getTime(); } // 要4秒インターバル } }, }, { key: 'Shift+F', // Shift+F::FTBucketでキーワード検索 func: () => { searchWithHistory("FUTACHAN", "FTBucket", 'https://www.ftbucket.info/scrapshot/ftb/index.php?mode=c&favo=0&ord=1&s=***', "|") }, // func: () => { SITEINFO[SITEINFO.findIndex(c => c.id == "FUTACHAN_CATALOG")].keyFunc[0].func() }, }, { key: /^u$|^Shift\+U$/, // u:: func: (e) => { var str = pref(SITE.id + ' : SearchMyMemo') || []; let memostr = e == "u" ? "○" : "◎" var newstr = str.filter(e => e.m === memostr).map(e => e.t) var target = (window.getSelection() && window.getSelection().toString().trim()) || (prompt(`${memostr}メモを付けるキーワードを入力してください(部分一致)\nこのサイトではメモが付く項目を左上に優先配置します\n${memostr=="◎"?"◎メモではさらに音声とNotificationで通知します\n":""}\nすでに登録されている文字列を入力するとそれを削除します\n複数の単語をスペースで区切って入力するとまとめて登録できます\n\n現在登録済み(${newstr.length}):\n${((Math.random()>0.5?newstr:newstr.sort(new Intl.Collator("ja", {numeric: true, sensitivity: 'base'} ).compare ) ).join(" ") ) }\n\n`) || "").trim(); if (!target) return; var dele = 0; target.split(/\s| /).forEach(targetc => { targetc = targetc.trim() var str = pref(SITE.id + ' : SearchMyMemo') || []; var str2 = str.filter(e => { return e.t != targetc }) if (str.length != str2.length) { if (confirm(`『${targetc}』は既に存在します\n削除しますか?`)) { if (debug) dc(`『${targetc}』をメモから削除しました`) pref(SITE.id + ' : SearchMyMemo', JSON.stringify(str2)); dele = 1; } } else { storeMemo(targetc.trim(), memostr, COLOR1) SITE.funcMemo(); } }) if (dele) run(document.body, "returned") //if (dele) location.reload() }, } ], hideSelectedWord: 1, selectedHelp: { help: [KEYHIDE + ":NGワードに追加", "u:左上に優先配置(Shift+U:+通知)"] }, //, multi: "複数行に渡る文字列は NG に入れられません" }, }, { id: 'FUTACHAN_CATALOG', urlRE: /\/\/anige\.horigiri\.net\/?$|\/\/anige\.horigiri\.net\/\?cat=|\/\/anige\.horigiri\.net\/\?paged=/, listTitleXP: '//div/h3[@class="entry-title"]/a', listTitleSearchXP: '//div/h3[@class="entry-title"]/a[+++]/../../../..', hideSelectedWord: 1, listTitleMemoSearchXP: '//div/h3[@class="entry-title"]/a[+++]', listGen: 5, delat: 500, listTitleMemoSearchXPSameGen: 1, WhateverFirstAndEveryAPFunc: () => { SITEINFO[SITEINFO.findIndex(c => c.id == "FUTACHAN_CATALOG")].WhateverFirstAndEveryAPFunc() }, keyFunc: [{ key: 'Shift+F', // Shift+F::FTBucketでキーワード検索 func: () => { searchWithHistory("FUTACHAN", "FTBucket", 'https://www.ftbucket.info/scrapshot/ftb/index.php?mode=c&favo=0&ord=1&s=***', "|") }, // func: () => { SITEINFO[SITEINFO.findIndex(c => c.id == "FUTACHAN")].keyFunc[0].func() }, }], }, { id: 'FUTACHAN', urlRE: '//kuzure.but.jp/f/$', WhateverFirstAndEveryAPFunc: () => { popup3(`Shift+F:FTBucket検索`, 8, 5000) }, keyFunc: [{ key: 'Shift+F', // Shift+F::FTBucketでキーワード検索 func: () => { searchWithHistory("FUTACHAN", "FTBucket", 'https://www.ftbucket.info/scrapshot/ftb/index.php?mode=c&favo=0&ord=1&s=***', "|") }, }], }, { id: 'FUTACHAN', urlRE: '//.*.ftbucket.info/|//kuzure.but.jp/f/b/|//[^.]+.2chan.net\/|//anige.horigiri.net|//kako.futakuro.com/futa/', listTitleXP: '//span[@class="cno"]', listTitleSearchXP: '//span[@class="cno"][+++]/../../../..', listTitleMemoSearchXP: '//span[@class="cno"][+++]/../../td[@class="quo"]/span[@class="memo"]', listTitleMemoSearchXPSameGen: 1, listGen: 5, delay: 1, //delayAutoWeighting: 0.33, memoStyle: 'display:table;', detailURLRE: /$^/, detailTitleXP: '', hideSelectedWord: 1, // selectedHelp: { help: [KEYHIDE + ":NGワードに追加"], multi: "複数行に渡る文字列は NG に入れられません" }, selectedHelp: { help: [KEYHIDE + ":NGワードに追加"] }, //, multi: "複数行に渡る文字列は NG に入れられません" }, detailTitleSearchXP: '', listTitleSearchFunc: (title) => { // レス中キーワードNG let resHit = []; if (typeof title === "string" && !/^No\.\d+$/gmi.test(title)) { // textContentでサーチする for (let res of elegeta('.thre table blockquote:not(#pickbox table,.ftbpu table,#respopup_area table,[floated] table)')) { // レス本文 if (res.textContent.indexOf(title) !== -1) resHit.push(res?.closest('table')); } } return resHit; }, WhateverFirstAndEveryAPFunc: () => { popup3(`Shift+F:FTBucket検索\nA:そうだね順/引用順/画像順でソート${location.href.match0(/^https?:\/\/[^.]+\.2chan\.net\//)?"\nE:リロード(D:+新着までスクロール)":""}`, 6, 5000) }, //wholeHelp:[()=>1,`\n A:ソート Shift+F:FTBucket検索 ${location.href.match0(/^https?:\/\/[^.]+\.2chan\.net\//)?" D:リロード+新着までスクロール":""}`], funcD: () => { // d:: let r = eleget0("#contres>a,#fvw_loading"); if (r) { if (!r.dataset.latestclickdate || new Date().getTime() - r.dataset.latestclickdate > 4000) { $(r).click(); setTimeout(() => { eleget0('.reloadline')?.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" }) }, 200); r.dataset.latestclickdate = new Date().getTime(); } // 要4秒インターバル } }, keyFunc: [{ key: 'e', // e::リロード func: () => { let r = eleget0("#contres>a,#fvw_loading"); if (r) { if (!r.dataset.latestclickdate || new Date().getTime() - r.dataset.latestclickdate > 4000) { r.click(); r.dataset.latestclickdate = new Date().getTime(); } // 要4秒インターバル } } }, { key: 'd', // d:: func: (e) => { if (eleget0("a:hover,video:hover,img:hover")) return SITE.funcD() }, }, { key: 'Shift+F', // Shift+F::FTBucketでキーワード検索 func: () => { searchWithHistory("FUTACHAN", "FTBucket", 'https://www.ftbucket.info/scrapshot/ftb/index.php?mode=c&favo=0&ord=1&s=***', "|") }, }, { key: 'a', // a:: func: () => { let isftchan = /^https?:\/\/kuzure\.but\.jp\/f\/b\//.test(location.href); let isanigeaki = /\/\/anige\.horigiri\.net\/\?p/.test(location.href); if (isanigeaki || isftchan) $(elegeta('.thre .rtd').filter(e => !e.closest("#pickbox,.ftbpu"))[0]).closest("table").before($('
')) $('.reloadline').remove(); var sorttype = Number($('.yhmSortType')?.attr("id") || 0); $('.yhmSortType').remove(); $(document.body).append(``) popup2("A:ソート\n" + (["そうだね", "引用", "画像", "古い順"].map((c, i) => " " + c + (i + 1 == sorttype ? " ←\n" : "\n")).join("")), 6, "min-width:6em;") switch (sorttype) { case 1: domsort(elegeta((isanigeaki || isftchan) ? '#thre0' : '.thre').filter(e => !e.closest("#pickbox,.ftbpu"))[0], elegeta('//td[@class="rtd"]/ancestor::table').filter(e => !e.closest("#pickbox,.ftbpu")), (v) => { return (((v.querySelector('.sod') || v).innerText?.match0(/そうだねx(\d+)/) || 0) * 1000000) + (v.querySelectorAll(".revQuote").length * 1000) + ((v.textContent.match(/\d\d\d\sB\)|youtube\.|youtu\.be|nicovideo/gmi) || []).length * 1) }) break; case 2: domsort(elegeta((isanigeaki || isftchan) ? '#thre0' : '.thre').filter(e => !e.closest("#pickbox,.ftbpu"))[0], elegeta('//td[@class="rtd"]/ancestor::table').filter(e => !e.closest("#pickbox,.ftbpu")), (v) => { return (((v.querySelector('.sod') || v).innerText?.match0(/そうだねx(\d+)/) || 0) * 1000) + (v.querySelectorAll(".revQuote").length * 1000000) + ((v.textContent.match(/\d\d\d\sB\)|youtube\.|youtu\.be|nicovideo/gmi) || []).length * 1) }) break; case 3: domsort(elegeta((isanigeaki || isftchan) ? '#thre0' : '.thre').filter(e => !e.closest("#pickbox,.ftbpu"))[0], elegeta('//td[@class="rtd"]/ancestor::table').filter(e => !e.closest("#pickbox,.ftbpu")), (v) => { return (((v.querySelector('.sod') || v).innerText?.match0(/そうだねx(\d+)/) || 0) * 1) + (v.querySelectorAll(".revQuote").length * 1) + ((v.textContent.match(/\d\d\d\sB\)|youtube\.|youtu\.be|nicovideo/gmi) || []).length * 1000000) }) break; case 4: domsort(elegeta((isanigeaki || isftchan) ? '#thre0' : '.thre').filter(e => !e.closest("#pickbox,.ftbpu"))[0], elegeta('//td[@class="rtd"]/ancestor::table').filter(e => !e.closest("#pickbox,.ftbpu")), v => -v.getAttribute("rsc")); $('.yhmSortType').remove(); break; } }, }], funcOnlyFirst: () => { let is2chan = /^https?:\/\/[^.]+\.2chan\.net\//.test(location.href); let isftb = /^https?:\/\/www\.ftbucket\.info\//.test(location.href); if (is2chan && !location.href.match0(/\.2chan\..+\/res\//)) return; let iskurokako = /\/\/kako\.futakuro\.com\/futa\//.test(location.href); let isftchan = /^https?:\/\/kuzure\.but\.jp\/f\/b\//.test(location.href); let isanigeaki = /\/\/anige\.horigiri\.net\/\?p/.test(location.href); if (isanigeaki) GM_addStyle('table, th, td{border:0;}'); if (isftchan || isanigeaki) { document.body.innerHTML = "
" + document.body.innerHTML + "
" } if (isftchan) { GM_addStyle("body{min-width:95%} .thre table{margin-right:0}") } // if (is2chan || isftchan) GM_addStyle(".rtd{vertical-align:top}") if (is2chan || isftchan) GM_addStyle(".rtd{vertical-align:top} #pdm{z-index:2000000021}") GM_addStyle("#pickbox .yhmMyMemo{white-space: nowrap;} .quo{vertical-align:top}") let isfvw = eleget0('#fvw_menu') let replaceMainPopup = (FUTABA_REPLACE_POPUP_FUNCTION) || !is2chan if (is2chan && replaceMainPopup) { GM_addStyle("#slp{z-index:1001} .qtd{display:none} .fvw_respop,#respopup_area{display:none;opacity:0}"); } $("#contres>a,#fvw_loading").attr("title", ($("#contres>a,#fvw_loading").attr("title") || "新着レスを読み込みます") + "\nE:リロード\nD/右クリック:リロード+新着にスクロール").on("contextmenu", (e) => { SITE.funcD(); return false; }) if (FUTABA_FLOAT_RELOAD_BUTTON) { $('#contres').attr("floated", ""); GM_addStyle(`#contres{z-index:999; position:fixed; right:9.5em; left:auto; top:0.1em; height:auto; padding:0.2em; border:2px solid #dddddd; background-color:#ffffff;}`) } pick2title(1) // そうだねを改行しないようにする //document.body.addEventListener('copy', (event) => { $("#pickbox .sod:contains('x')").css({ "font-size": "125%", "float": "none" }); setTimeout(() => { $("#pickbox .sod:contains('x')").css({ "font-size": "125%", "float": "right" }) }, 1) }); var sdset = () => { if (is2chan) elegeta('#pickbox .sod:not([onclick]),.ftbpu .sod:not([onclick])').forEach(e => { e.setAttribute("onclick", `sd(${e?.id.replace(/\D/g,"")});return(false);`) }) } $("#contres>a,#fvw_loading").on("click", (e => { let latestEle = eleget0('//*[@class="thre"]/table[last()]'); setTimeout(() => { document.body.dispatchEvent(new Event('2chanReloaded')) }, 1500) document.body.dispatchEvent(new Event('2chanReloadedNodelay')) })); // リロード再実行 document.body.addEventListener('2chanReloadedNodelay', function() { $(`
`).fadeIn("slow", function() { $(this).hide(0).fadeIn("slow") }).insertAfter($(elegeta('.thre table:not(#pickbox table,.ftbpu table,#respopup_area table,[floated] table)').pop())) }, false); $(document).on("scroll", () => { if (elegeta('.reloadline:not([found])').filter(e => isinscreen(e)).length) { $(elegeta('.reloadline')).attr("found", 1).delay(2000).hide("slow").delay(3000, function() { $(this).remove(); }) } }) if (location.href.match0("anige.horigiri")) GM_addStyle(`blockquote{color:#800000;line-height:1.2em;font-style:normal;`) $(elegeta('//table[@class="deleted"]|//tr/td[@class="rtd"]/blockquote[contains(text(),"del")]/../../../..')).attr("title", "クリックで復帰").attr("floated", "1").animate2({ "opacity": "0.3", "transform": "scale(0.8)", "transform-origin": "right", "float": "right" }, 500).one("click", function() { $(elegeta('//table[@class="deleted"]|//tr/td[@class="rtd"]/blockquote[contains(text(),"del")]/../../../..')).attr("title", "").animate2({ "opacity": "0.7", "transform": "scale(1)", "transform-origin": "right", "float": "none" }, 500); $(this)[0].scrollIntoView({ block: "nearest", behavior: "smooth" }) }) // 隔離を薄くして右に // 引用文をクリックでスクロール document.addEventListener("click", c => { let e = c.target.closest("font"); // if (e && !e.dataset.rsc && e.textContent.match0(/^〉+|^》+|^>+|^>+/gm)) { if (e && !e.dataset.rsc && e.textContent.match0(/^〉+|^》+|^>+|^>+/gm) && !e.textContent.match0(/h?ttps?:\/\//gmi)) { let t = elegeta('//table[@data-rsc]').filter(f => !f.closest("#pickbox,#respopup_area")).find(c => c.textContent.indexOf(e.textContent.replace(/^〉+|^》+|^>+|^>+/gm, "").trim()) !== -1); if ($(t).is(":hidden")) $(t.closest(".post")).show(1).css({ "display": "table" }) // 学園祭で消していたら出す t.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" }); //$(t.closest(".post")).effect("highlight", 750); } }) // ニコ動埋め込み(PrivacyBadger等は要Disable) var embednv = () => { var elea = elegeta('//a[contains(@href,"nicovideo")][not(@nde)]|//a[contains(@href,"//nico.ms/sm")][not(@nde)]') for (let ele of elea.filter(e => isinscreen(e) || eleget0('.yhmMyMemo', e.closest("table")))) { // リロード回避のためpickされるものは先に読み込む //for (let ele of elea.filter(e => isinscreen(e))) { let url = ele.href; //innerText.replace(/^ttp/i, "http"); ele.setAttribute("nde", "nde"); var nico = url.match(/h?ttps?:\/\/www.nicovideo.jp\/watch\/(.*)/i); if (!nico) var nico = url.match(/h?https:\/\/nico\.ms\/(.*)/i); if (!nico) continue // $(ele.parentNode).after(`

`) // 埋め込み外部プレイヤー版 $(ele?.closest("td")).append(`

`) // 埋め込み外部プレイヤー版 break; // 一度に1つずつしかやらない } if (elea.length) setTimeout(() => embednv(), 2000 + elea.length * 10); } autoPagerized(() => { embednv() }) // youtube埋め込み var embedyt = () => { var elea = elegeta('//a[contains(@href,"youtube.com")][not(@yte)]|//a[contains(@href,"youtu.be")][not(@yte)]') for (let ele of elea.filter(e => isinscreen(e) || eleget0('.yhmMyMemo', e.closest("table")))) { // リロード回避のためpickされるものは先に読み込む //for (let ele of elea.filter(e => isinscreen(e))) { let url = ele.href //innerText; ele.setAttribute("yte", "yte"); var sm = (url.match(/h?ttps?:\/\/youtu\.be\/([^&?]+.*)\?t=(\d*).*$/i) || url.match(/h?ttps?:\/\/w?w?w?m?\.youtube\.com\/watch\?v=([^&]+.*)&t=(\d*).*$/i)) || url.match(/h?ttps?:\/\/youtu\.be\/([^&?]+)/i) || url.match(/h?ttps?:\/\/w?w?w?m?\.youtube\.com\/watch\?v=([^&]+)/i); if (!sm) continue $(ele?.closest("td")).append('