// ==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 *://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 *://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/* // @match *://search.bilibili.com/* // @match *://www.mcdonalds.co.jp/menu/* // @match *://*.2chan.net/b/futaba.php* // @version 0.5.79 // @noframes // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_addStyle // @grant GM.addStyle // @grant GM.setClipboard // @grant GM.openInTab // @run-at document-idle // @namespace https://greasyfork.org/users/181558 // @require https://code.jquery.com/jquery-3.6.4.min.js // @require https://code.jquery.com/ui/1.13.2/jquery-ui.min.js // @downloadURL none // ==/UserScript== (function() { const FUTAPO_AUTO_RELOAD_DEFAULT = 0; // 1:futapoで最初から無操作時自動更新ON(推奨) 2:1+下まで読み込む 0:無効 const FUTAPO_CRAM_TITLE = 1; // 1:futapoでboxの横幅が狭いときでもタイトルを詰め込む const FUTAPO_UJ_NOTIFY = "notify sound" // futapoでU/j登録がヒットした時にどう通知するか "notify"でnotification API、"sound"で効果音。"notify sound"で両方、""で通知しない const FUTABA_SET_56MEMO_TO_ANCHORED = 3; // 1:ふたばで自分のレスに自動的に5メモを付ける 2:1に加え5メモへのレスに6メモを付ける 3:1+2に加え遠くても5メモに連鎖するレスには6メモをつける 4:1+2+3に加え遠くても6メモに連鎖するレスにも6メモをつける const FUTABA_RELOAD_AND_NOTIFY_NEWRES_DEFAULT = 0; // ふたばでnキー(自動リロードとNotification通知)のデフォルト状態 0:オフ、1:自動リロード、2:自動リロード+新着を通知(全て)、3:自動リロード+新着を通知(画像かurlかメモ付きレスを引用したレスのみ) const FUTABA_NOTIFY_NEWRES_SOUND_MEMO_QUOTED = "5 6"; // ふたばで新着レスのNotification通知でメモのついたレスが引用された時に音で知らせるか "5"で○メモに鳴らす、"6"で×メモに鳴らす、"5 6"で両方に鳴らす、""で鳴らさない const FUTABA_Z_TO_COPY_TO_CLIPBOARD_AS_TEXT_TOO = "${num1} ${name1} ${name2} ${time} ${num2} ${soudane}\n${text}\n"; // ふたばでzキーかレス右上の□のクリック時についでに内容をテキストとしてクリップボードにコピーする、その書式 "":コピーしない const FUTABA_FLOAT_RELOAD_BUTTON = 1; // 1:ふたばでリロードボタンを浮遊させる const FUTABA_HOVER_POPUP_REPLACE = 1; // 1:ふたばで>引用ポップアップを置き換える const FUTABA_HOVER_POPUP_DELAY = 1; // ふたばで>引用の上に静止してn/60秒間後にポップアップを表示する -1:瞬間&低負荷(mousemove) 1:瞬間(interval) 2~:n/60秒(interval) 0:無効 const FUTABA_QUOTE_LEAD_FOR_NUMBER_ONLY = 1; // 1:ふたばで>no.○○や>○○.jpgや>fu○○.jpgといった引用にも本文のバルーン引用を追加する(要「5chサムネイル表示他」併用) const FUTABA_EXPERIMENTAL_DISPLAY_CHAINED = 1; // 1:ふたばでレス右上の□に引用連鎖数を書き入れていく ※現状重い処理 const FUTABA_AUTO_RELOAD_INTERVAL = 1; // 1-10:ふたばでnキーオン時の自動リロードする最短間隔(分) ※新着がなく無操作だと自動的に10分まで伸びる const FUTABA_ALTZ_FILENAME_SUFFIX = "●"; // ふたばでAlt+Z時にファイル名の末尾に付ける文字 const FUTABA_DEBUG = 0; // 1-2:ふたばで開発用情報を表示 1:最下行ログ 2:1+タブタイトル const DEBUG_CATCH = 0; // 1:catchしたエラーをalert const KEYCHANGE_DEBUG = "disable"; // 押す度にdebugを0~3に切り替えるキー "Shift+D","disable"等 const ENABLE_HELP = 1; // 1:操作ガイドを表示 0:無効 const ENABLE_AUTOMEMO = 7; // 0:自動メモを無効 1でオン 2~7:大きくするほど一時的に表示が崩れる代わりに確実 const REPLACE_LINK_IN_YOUTUBE = 1; // 1:YouTubeで投稿者のチャンネルのホームタブへのリンクをチャンネルの動画タブへのリンクに置き換える const ENABLE_EXCEPT_YAJ = 1; // 1:ヤフオク以外でも有効 0:ヤフオクでのみ動作 var debug = 0; // 1~だとデバッグモード V&&dc(text) 1:非対応ページでその旨表示など/コンソールにverbose表示 2:verboseをポップアップ(速度測定して表示 debug&&sw("項目"))&非表示にした原因に枠追加 3:Q/1/2等の対象要素を目立たせる const ENABLE_MEASURE_TIME_SPENT = 0; // 1で速度測定して表示 debug&&sw("項目") const fasttest = 1; // 1:高速モードを試用 const FUTABA_BGC = 0 ? "#f0e0d6" : "#ffffee" const ISCHROME = window.navigator.userAgent.toLowerCase().indexOf('chrome') != -1 var futabapopupscale; const futabapicksizeDefault = 84 var futabapicksizeL = futabapicksizeDefault; var futabapicksize = 100; var hovertimer = 0; var swb = new Date(); var prefCache = [] GM_addStyle("span.yhmMyMemo{all:initial; word-wrap:break-word;cursor:pointer; font-size:14px; font-weight:bold; margin:0px 1px; text-align:center; padding:0px 6px 0px 6px; border-radius:12px; color:white;font-family:sans-serif;}") debug && 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フラグ不可 //String.prototype.nfd = function() { return SITE.nfd ? this?.normalize("NFD") : String(this) } // 文字列をNFDエンコードにまとめる String.prototype.sanit = function() { return this.replace(//g, ">").replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/`/g, '`') } function adja(place = document.body, pos, html) { return place ? (place.insertAdjacentHTML(pos, html), place) : null; } let addstyle = { added: [], add: function(str) { if (this.added.includes(str)) return; end(document.head, ``); this.added.push(str); }, } var SITE = {} 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 = {} var memofast = false; // 上が優先 const SITEINFO = [{ id: 'futaba_catalog', urlRE: /https?:\/\/[^\.]+\.2chan\.net\/[^/]+\/futaba\.php\?mode=cat/, title: '.tdDiv small', box: '#cattable tbody tr td', isHidePartialMatch: 1, titleSubstr: true, hideSelectedWord: 1, disableKeyB: 0, listTitleXPIgnoreNotExist: 1, funcOnlyFirst: () => { $('#cattable td').wrapInner('
') // レス数とvボタンを下の帯に固定 elegeta('.pdmc').forEach(e => e.closest('td')?.appendChild(e)) addstyle.add(`.pdmc { margin-top:auto; margin-bottom:auto; right: 0em; bottom:0.2em; position:absolute; z-index:99; opacity:1; padding:0.15em; background-color:#ffffee; }`) GF.imgw = Math.max(eleget0('#cattable img')?.offsetWidth, eleget0('#cattable img')?.offsetHeight) || 40 GF.boxw = eleget0('#cattable td')?.offsetWidth || 40 setSlider(eleget0('//body/span[1]'), 0, 320, 0, "画像サイズ:***px", "futaba_catalog_imagesize", (val) => { eleget0('#imagesizecss')?.remove() $("#boxs").remove(); GF.imgw = val if (val) end(document.head, ``) if (val) { end(document.head, ``) } }, 0, '') setSlider(eleget0('#setSliderfutaba_catalog_imagesize'), 0, 300, 0, "box高さ:***px", "futaba_catalog_boxheight", (val) => { eleget0('#futaba_catalog_imagesize')?.remove() if (val) end(document.head, ``) // レス数とvボタンを下の帯に固定 if (val) addstyle.add(`#cattable img{border:black solid 1px;}`); //$("#cattable img").wrap('
') eleget0('#futaba_catalog_imagesize')?.remove() }, 0, '') setSlider(eleget0('#setSliderfutaba_catalog_imagesize'), 0, 300, 0, "box横幅:***px", "futaba_catalog_boxwidth", (val) => { eleget0('#boxwidthcss')?.remove() $("#boxs").remove(); $('#cattable td a+br').remove() GF.boxw = val - 5 if (val) end(document.head, ``) if (val) { end(document.head, ``) } }, 0, '') setSlider(eleget0('#setSliderfutaba_catalog_imagesize'), 0, 24 * 3, 0, "文字サイズ:***/3px", "futaba_catalog_fontsize", (val) => { eleget0('#textsizecss')?.remove() if (val) end(document.head, ``) }, 0, '') }, }, { id: 'search.bilibili.com', urlRE: '//search.bilibili.com/', listTitleXP: '//h3[@class="bili-video-card__info--tit"]', listTitleSearchXP: '//h3[@class="bili-video-card__info--tit"][**title**]/ancestor::div[contains(@class,"video-list-item")]', listTitleMemoSearchXP: '//h3[@class="bili-video-card__info--tit"][**title**]', listGen: 7, observe: 999, useText: 1, }, { id: 'mcdonaldsmenu', urlRE: '//www.mcdonalds.co.jp/menu/', keyFunc: [{ key: 'a', // a:: func: () => { var sorttype = GF.yhmSortType || 0 let menu = [ { t: "安い順", f: () => { sortdom(elegeta('//span[@class="product-list-card-price-number text-2xl font-extrabold"]/../../..'), v => eleget0('//span[@class="product-list-card-price-number text-2xl font-extrabold"]', v)?.textContent) } }, { t: "高い順", f: () => { sortdom(elegeta('//span[@class="product-list-card-price-number text-2xl font-extrabold"]/../../..'), v => eleget0('//span[@class="product-list-card-price-number text-2xl font-extrabold"]', v)?.textContent, 1) } }, { t: "タイトル", f: () => { sortdom(elegeta('//span[@class="product-list-card-price-number text-2xl font-extrabold"]/../../..'), v => eleget0('.product-list-card-name', v)?.textContent) } }, ] popup2("A:ソート\n" + (menu.map((c, i) => " " + c.t + (i == sorttype ? " ←\n" : "\n")).join("")), 6, `min-width:${menu.reduce((p,c)=>Math.max(p,c.t.length+2),0)}em;`); menu[sorttype].f() GF.yhmSortType = (++sorttype) % menu.length return } }], func: () => popup3("A:ソート", 5), }, { 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|\/\/kakaku.com\/pc\/gaming-pc\/itemlist.aspx|\/\/kakaku.com\/pc\/gaming-note\/itemlist.aspx|\/\/kakaku.com\/pc\/stick-pc\/itemlist.aspx/, WhateverFirstAndEveryAPFunc: () => { if (!elegeta('//th[@class="sub thHeader" and contains(text(),"CPUスコア(PassMark) ")]')[0]) return popup3("A:CPUスコア単価で絞り込み", 4) //$(".cps").remove() // let arr = lh("gaming") ? elegeta('//table/tbody/tr[@class="tr-border"]/td[11]') : elegeta('//table/tbody/tr[@class="tr-border"]/td[10]') let arr = lh("gaming") ? elegeta('table tbody tr.tr-border td:nth-child(11):not([data-scorecost])') : elegeta('table tbody tr.tr-border td:nth-child(10):not([data-scorecost])') arr.forEach(e => { e.dataset.scorecost = 1 // let p = elegeta('//td[2]/ul/li[@class="pryen"]/a', e?.closest("tr"))[0] let p = elegeta('td:nth-child(2) ul li.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, "")) if (e.textContent.match(/\d/)) { e.insertAdjacentHTML("beforeend", `
価格/スコア
${((price/cpu).toFixed(2))}
`) } else { end(e, '') } }) }, keyFunc: [{ key: 'a', // a:: func: () => { if (!elegeta('//th[@class="sub thHeader" and contains(text(),"CPUスコア(PassMark) ")]')[0]) return GF.base = proInput("CPUスコア単価上限を入力してください", $('#CPS').data("cps") || 10) || 0; autoPagerized(() => { $('#CPS').remove(); $(document.body).append(``) // $(elegeta('//table/tbody/tr[@class="tr-border"]')).show(100) $(elegeta('table tbody tr.tr-border')).show() if (GF.base <= 0) return elegeta('.cputanka').forEach(e => { let cps = Number(e?.innerText || 0) let b = e.closest("tr.tr-border") if (!cps || cps > GF.base) { $(b.previousSibling.previousSibling).add(b).hide() } }) }) } }, ], }, { urlRE: /\/\/www.ftbucket.info\/scrapshot\/ftb\/index\.php|\/\/www.ftbucket.info\/scrapshot\/ftb\/?$|\/\/www.ftbucket.info\/scrapshot\/ftb\/\?favo=/, id: 'FUTACHAN_CATALOG', listTitleXP: '//div[@class="tdDiv"]/span/div', listTitleSearchXP: '//div[@class="tdDiv"]/span/div[***]/../..', listTitleMemoSearchXP: '//td/div[@class="tdDiv"]/span/div[***]', listGen: 5, listTitleXPIgnoreNotExist: 1, 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() }, }], // memoStyle:'display:inline-block;', //listTitleMemoSearchXPSameGen: 1, delay: 333, funcOnlyFirst: () => { //if (!lh("mode=c")) return; eleget0('//html/body/table[2]')?.setAttribute("id", "cattable") $('#cattable td').wrapInner('
') begin(document.body, `




`) $('#cattable td>a>img').css({ "border": "black solid 1px" }).wrap('
') // $('#cattable td').wrapInner('
') setSlider(eleget0('#sliders4'), 0, 300, 0, "box高さ:***px", "futabucket_catalog_boxheight", (val) => { eleget0('#boxheightcss')?.remove() if (val) end(document.head, ``) }, 0, '') setSlider(eleget0('#sliders3'), 0, 500, 0, "box横幅:***px", "futabucket_catalog_boxwidth", (val) => { eleget0('#boxwidthcss')?.remove() $('#cattable td a+br').remove() if (val) end(document.head, ``) if (val) elegeta('td div span[title] div').forEach(e => e.textContent = e.parentNode.title) }, 0, '') //setSlider(eleget0('#sliders'), 1, 24 * 3, 12 * 3, "文字サイズ:***/3px", "futabucket_catalog_fontsize", (val) => { // eleget0('#textsizecss')?.remove() // end(document.head, ``) //}, 0, '') setSlider(eleget0('#sliders2'), 0, 320, 0, "画像サイズ:***px", "futabucket_catalog_imagesize", (val) => { eleget0('#imagesizecss')?.remove() if (val) end(document.head, ``) }, 0, '') setSlider(eleget0('#sliders1'), 0, 20, 0, "タイトル行数:***行", "futabucket_catalog_titlerow", (val) => { eleget0('#catalogrowscss')?.remove() if (val) end(document.head, ``) if (val) elegeta('td div span[title] div').forEach(e => e.textContent = e.parentNode.title) }, 0, '') /*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, memoStyle: 'word-break:break-all; font-size:10px !important; line-height:130%; padding:0px 4px 0px 4px; line-break:anywhere;', preventMemo: m => ["★", "◎", "○"].includes(m), QRule: "\n\n非表示化に関しては正規表現は使えませんが\nこのサイトではここで登録した内容でU/jメモの追加動作の抑制ができ、\nその抑制に関してだけは正規表現が使え、全角/半角、大文字/小文字も区別しません\n", listTitleXPIgnoreNotExist: 1, observe: 666, observeClass: ["box", "box ", "yhmMyMemo"], //2022年07月12日 WhateverFirstAndEveryAPFunc: () => { popup3("Shift+F:FTBucket検索\nu:左上優先配置タイトルを設定\nU:左上優先配置(+通知)タイトルを設定\nj:左上優先配置(+開く)タイトルを設定\nJ:メモ削除画面\nE:更新 D:下まで読み込む", 8, 5000) // ↻ }, listTitleMemoSearchXPSameGen: 1, funcOnlyFirst: () => { GF.latestReload = Date.now() - 3000 GM_addStyle('.graybutton{ cursor:pointer; position: fixed; z-index:100; opacity:1; font-size:12px; margin:0px 1px; padding:1px 6px 1px 6px; word-break: break-all !important; border-radius:12px; border:solid 1px #888; background-color:#fff; color:#888;}') 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; } }") document.querySelector(`head`).insertAdjacentHTML('beforeend', ``) if (FUTAPO_CRAM_TITLE) GM_addStyle("div.thread-contents { padding-left: 0px !important;} div.thumbnailContainer { min-width:3em; position:inherit !important; margin-left: 0px !important;}") // boxの横幅が狭いときでもタイトルを詰め込む var lastope = Date.now() var cdID //if (eleget0('#reload') && !cdID) { function waitAndDo(checkFunc, func) { // checkFuncがtrueになったらfuncを実行 if (!checkFunc()) setTimeout(waitAndDo, 500, checkFunc, func) func() } waitAndDo(() => eleget0('#reload'), () => { document.body.insertAdjacentHTML("beforeend", `⏻無操作
自動更新
`) $(document).on("click", `#cdsw`, () => { $('#cdsw').fadeOut(222); var lastope = Date.now() $(document).on("mousemove mousedown keydown", () => { lastope = Date.now() }) var cdID = setInterval(() => { $('#cd,#cdsw').remove(); document.body.insertAdjacentHTML("beforeend", `${Math.max(0,~~(60.9-(Date.now()-lastope)/1000))}`) //⏽ if (Date.now() - lastope > 60 * 1000 && !eleget0('.blinkingOL')) { // 開き待ちのが1つでもあれば押さない lastope = Date.now(); eleget0('//li[1]/a[@id="reload"]')?.click() } }, 333) $(document).on("click", `#cd`, () => { clearInterval(cdID); $('#cd').remove() //text("停止")//.hide(999); document.body.insertAdjacentHTML("beforeend", `⏻無操作
自動更新
`) }) }) if (FUTAPO_AUTO_RELOAD_DEFAULT >= 1) $("#cdsw").click() if (FUTAPO_AUTO_RELOAD_DEFAULT >= 2) scr(0) }) setTimeout(() => { /* document.body.insertAdjacentHTML("beforeend", `⏻無操作
自動更新
`) $(document).on("click", `#cdsw`, () => { $('#cdsw').fadeOut(222); var lastope = Date.now() $(document).on("mousemove mousedown keydown", () => { lastope = Date.now() }) var cdID = setInterval(() => { $('#cd,#cdsw').remove(); document.body.insertAdjacentHTML("beforeend", `${Math.max(0,~~(60.9-(Date.now()-lastope)/1000))}`) //⏽ if (Date.now() - lastope > 60 * 1000 && !eleget0('.blinkingOL')) { // 開き待ちのが1つでもあれば押さない lastope = Date.now(); eleget0('//li[1]/a[@id="reload"]')?.click() } }, 333) $(document).on("click", `#cd`, () => { clearInterval(cdID); $('#cd').remove() //text("停止")//.hide(999); document.body.insertAdjacentHTML("beforeend", `⏻無操作
自動更新
`) }) }) } */ // }, 500) function 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) } // setTimeout(() => { elegeta("#reload,#logo,#cdsw").forEach(e => e.title = e?.title + "\nE:更新\nD/右クリック:更新+下まで読み込み") // ↻ $(document).on("contextmenu", '#reload,#logo,#cdsw,#cd', () => { // d:: let r = eleget0('//a[@id="reload"]'); if (r) { if (!GF.latestReload || new Date().getTime() - GF.latestReload > 5000) { r.click(); scr(0) GF.latestReload = 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 }) $('a#mode.pulldown').on("contextmenu", () => { let url = lh(/\&mode=6_0/) ? location.href.replace("&mode=6_0", "&mode=4_0") : lh(/\&mode=4_0/) ? location.href.replace("&mode=4_0", "&mode=6_0") : `https://futapo.futakuro.com/?server=may_b&mode=4_0&search=&searchMode=0&kako=0` location.href = url; return false }) /* if (FUTAPO_AUTO_RELOAD_DEFAULT >= 1) $("#cdsw").click() if (FUTAPO_AUTO_RELOAD_DEFAULT >= 2) scr(0) */ }, 500) GM_addStyle("div.thread-text{display:inline;line-break: anywhere;} .thread-text{word-break:break-all;}") // html{line-height:1.2;} setTimeout(() => { setSlider(eleget0('//div[@id="boxArea"]'), 54, 300, 54, "box高さ:***", "boxheight", (val) => { eleget0('#boxheightcss')?.remove() end(document.head, ``) }, 0, 'style="width:7em;height:0.5em;"') setSlider(eleget0('//div[@id="boxArea"]'), 0, 10, 5, "タイトル行間:***", "lineheight", (val) => { eleget0('#boxlineheightcss')?.remove() end(document.head, ``) }, 0, 'style="width:7em;height:0.5em;"') }, 999) }, funcMemo: () => { SITE.funcFinally() }, funcFinally: (disableHide) => { setTimeout(() => { let found = 0; // u::U::j:: メモが付いたものを左上に優先整列 // ここのu/U/j動作は正規表現対応や大文字小文字全角半角非区別のために標準のメモが付く動作(正規表現非対応)や非表示動作(正規表現非対応)とは一致しない点に注意 try { // メモをクリックで消す&ESC/パネル外をクリックでパネルを消す動作を登録 if (!GF.yhmMemoDeleteButton) { GF.yhmMemoDeleteButton = 1 $(document).on("keydown", e => { if (e.key === "Escape") $('#yhmMemoDeletePanel').hide(200).queue(function() { $(this).remove() }) }) // $(document).on("mousedown", e => { if (e?.target === document.body || e?.target?.matches("*:not(#yhmMemoDeletePanel,.yhmMemoDeleteButton,.yhmNoSelect)")) $('#yhmMemoDeletePanel').hide(200).queue(function() { $(this).remove() }) }) $(document).on("mousedown", e => { if (!e?.target?.closest("#yhmMemoDeletePanel") || e?.target?.matches("#yhmMemoDeletePanelClose")) $('#yhmMemoDeletePanel').hide(200).queue(function() { $(this).remove() }) }) $(document).on("click", ".yhmMemoDeleteButton,.yhmNoSelect", e => { // クリックで削除 let ele = e.target?.closest(".yhmMemoDeleteButton") if (!ele) return var str = pref(SITE.id + ' : SearchMyMemo') || []; let memo = str.find(v => escape(v.t + v.m + v.c) === ele.id) if (memo) { $(ele).hide(200).queue(function() { $(this).remove() }); // これは削除パネル用の動作 elegeta('.yhmMyMemo').filter(e => e.id === escape(memo.t + memo.m + memo.c)).forEach(e => { $(e).hide(200).queue(function() { $(this).remove() }) }) adja(document.body, "afterbegin", ""); eleget0('yhmmymemoremoved')?.remove(); // 学園祭用に消去を告知 GM.setClipboard(memo.t) pref(SITE.id + ' : SearchMyMemo', (pref(SITE.id + ' : SearchMyMemo') || []).filter(n => JS(n) !== JS(memo))) } e.preventDefault() return false }) } let memoa = pref(SITE.id + ' : SearchMyMemo') || []; // memoa = memoa.map(v => { memoa = memoa.filter(v => SITE?.preventMemo(v.m)).map(v => { v.than = han(v.t); if (isValidRE(v.t)) v.re = new RegExp(v.t, "mi"); return v }) // 重いので計算を1回で済ます let hide = disableHide ? [] : pref(SITE.id + ' : SearchHideTitle') || [] hide = hide.map(v => { return { word: v, re: isValidRE(v) ? new RegExp(v, "mi") : null } }) // 重いので計算を1回で済ます var hit = [] for (let e of elegeta('.box:not([relocatedByMemo])')) { let tt = eleget0('.thread-text', e)?.textContent for (let v of memoa) { if (v.re && v.re.test(han(tt)) || tt?.indexOf(v.t) !== -1) { // u/U/jメモ登録ワードが正規表現として有効なら正規表現としてチェック、また単純文字列としてヒットしてもヒットとする if (!hit.includes(e)) hit.push(e) e.dataset.vip = Math.max("○◎★".indexOf(v.m), e.dataset?.vip || 0) // j>U>uの順で強い結果を残す e.title = `${e.title?e.title+" ":""}${v.m}${v.t}` e.dataset.hitwords = `${e.dataset.hitwords?e.dataset.hitwords+" ":""}${v.m}${v.t}`; if (v?.t?.length > 3) { if (!eleget0(`*[id="${escape(v.t+v.m+v.c)}"]`, e)) after(eleget0('.thread-text', e), `${sani(v.m)}${sani(v.t)?.substr(0,25)+(v?.t?.length>25?"…":"")}`) } else { if (!eleget0(`*[id="${escape(v.t+v.m+v.c)}"]`, e)) after(eleget0('.thread-text', e), `${sani(v.m)}${sani(v.t)?.substr(0,25)+(v?.t?.length>25?"…":"")}`) } } } eleget0('.thumbnail', e)?.setAttribute("title", `${tt}\n${e.title}`) } GF.opened = GF.opened || [] GF.opened1 = GF.opened1 || [] GF.opened2 = GF.opened2 || [] while (1) { var b = elegeta('.box:not([relocatedByMemo])') var e = b.find(v => hit.find(w => w === v)) if (!e) break; GF.opened.push(e.href) let vip = Number(e.dataset.vip) e.setAttribute("relocatedByMemo", "") let memoEle = e let firstBox = elegeta('.box:not(.boxpri,.boxpri2)').filter(e => e.style.backgroundColor !== "rgb(255, 255, 0)")[0] if (vip == 1) { firstBox = elegeta('.box:not(.boxpri2,.boxpri3)').filter(e => e.style.backgroundColor !== "rgb(255, 255, 0)")[0] eleget0('.thread-text', memoEle).style.color = "#12e"; memoEle.style.boxShadow = "4px 4px 4px 0px #0006"; memoEle.style.zIndex = 2; memoEle.style.fontWeight = "bold" memoEle.classList.add("boxpri2") } else if (vip == 2) { firstBox = elegeta('.box:not(.boxpri3)').filter(e => e.style.backgroundColor !== "rgb(255, 255, 0)")[0] eleget0('.thread-text', memoEle).style.color = "#12e"; memoEle.style.boxShadow = "4px 4px 4px 0px #0006"; memoEle.style.zIndex = 3; memoEle.style.fontWeight = "bold" memoEle.classList.add("boxpri3") } else { memoEle.style.boxShadow = "4px 4px 4px #0006"; memoEle.style.zIndex = 1; } memoEle.classList.add("boxpri") firstBox.parentNode.insertBefore(memoEle, firstBox) // Qの非表示にヒットしたものは除外、正規表現対応・全角半角非区別・大文字小文字非区別 let tt = eleget0('.thread-text', e)?.textContent; if (disableHide || !hide.some(q => { return (q.re && q.re.test(han(tt))) || tt?.indexOf(q.word) !== -1 })) { // Q非表示登録ワードが正規表現として有効なら正規表現としてもチェック、また単純文字列としてヒットしてもヒットとする if (vip == 1 && e.offsetHeight && !GF.opened1.includes(e.href)) { GF.opened1.push(e.href) found = memoEle.cloneNode(true); if (FUTAPO_UJ_NOTIFY.split(" ").includes("notify")) notifyMe(eleget0(".thread-text", found)?.innerText, e.dataset.hitwords, e => { e.preventDefault(); //`${"\n\n"+eleget0('//a[@id="server"]')?.innerText||""}` window.open(memoEle.href) }, eleget0('img', found)?.src) } if (vip == 2 && e.offsetHeight && !GF.opened2.includes(e.href)) { GF.opened2.push(e.href) GF.open = GF.open || [] found = memoEle.cloneNode(true); if (FUTAPO_UJ_NOTIFY.split(" ").includes("notify")) notifyMe(eleget0(".thread-text", found)?.innerText, e.dataset.hitwords, e => { e.preventDefault(); window.open(memoEle.href) }, eleget0('img', found)?.src) memoEle.classList.add('blinkingOL') addstyle.add('@keyframes outline { 0% { outline: 2px solid #f0f; } 100% { outline: 2px solid #c8f; } } .blinkingOL{ animation: outline 1s ease infinite alternate; }') function opentab(href) { if (Date.now() - (GF.latest || 0) > (ISCHROME ? 7000 : 5000)) { GF.latest = Date.now() GM.openInTab(href, true) memoEle.classList.remove('blinkingOL') } else { setTimeout(() => { opentab(href) }, 333) } } opentab(memoEle.href) //} } } } if (found) { //if (FUTAPO_SOUND_NOTIFY) sound("sine", 0.1); if (FUTAPO_UJ_NOTIFY.split(" ").includes("sound")) sound("sine", 0.1); } } catch (e) { if (DEBUG_CATCH) alert(e) } }, 200) }, keyFunc: [{ key: 'd', // d:: func: (e) => { let r = eleget0('//a[@id="reload"]'); if (r) { 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 < 150) setTimeout(() => { scr(++i) }, 100) // 15秒まで } scr(0) //} // 要5秒インターバル } }, }, { key: 'e', // e::リロード func: () => { let r = eleget0('//a[@id="reload"]'); if (r) { if (!GF.latestReload || new Date().getTime() - GF.latestReload > 4000) { r.click(); GF.latestReload = 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=***', "|") }, }, { key: /^u$|^Shift\+U$|^j$/, // u::U::j:: func: (e) => { var str = pref(SITE.id + ' : SearchMyMemo') || []; let memostr = e == "j" ? "★" : e == "u" ? "○" : "◎" var newstr = str.filter(e => e.m === memostr).map(e => e.t) GF.sorttype = ((GF.sorttype || 0) % 3 + 1) var [order, finstrfunc] = [ ["登録順", a => a.join(" ")], ["abc順", a => a.sort(new Intl.Collator("ja", { numeric: true, sensitivity: 'base' }).compare).join(" ")], ["長さ→abc順", a => a.sort((a, b) => a.length === b.length ? (new Intl.Collator("ja", { numeric: true, sensitivity: 'base' }).compare)(a, b) : a.length > b.length ? 1 : -1).join(" ")] ][GF.sorttype - 1] var target = (window.getSelection() && window.getSelection().toString().trim()) || (prompt(`${memostr}メモを付けるキーワードを入力してください\n\nこのサイトではここで設定した項目、メモが付く項目を左上に優先配置します\n(部分一致、正規表現使用可)\n\n${"◎メモではさらに音声とNotificationで通知します\n★メモでは更に自動的に新しいタブで開きます"}\n\nすでに登録されている文字列を入力するとそれを削除します\n複数の単語をスペースで区切って入力するとまとめて登録できます\n\n現在登録済み(${newstr.length}): (${order})\n${finstrfunc(newstr)}\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}』(${str.find(e=>e.t==targetc)?.m})は既に存在します\n削除しますか?`)) { if (debug) V && dc(`『${targetc}』をメモから削除しました`) pref(SITE.id + ' : SearchMyMemo', JSON.stringify(str2)); dele = 1; elegeta('[relocatedByMemo]').forEach(v => v.removeAttribute("relocatedByMemo")) $(".yhmMyMemo").remove() run("returned") } } else { storeMemo(targetc.trim(), memostr, COLOR1) elegeta('[relocatedByMemo]').forEach(v => v.removeAttribute("relocatedByMemo")) run("returned") } }) if (dele) run(document.body, "returned") }, }, { key: /^Shift\+J$/, // Shift+J::メモ一覧一括削除画面 func: (e) => { var str = pref(SITE.id + ' : SearchMyMemo') || []; var newstr = str GF.sorttype = eleget0("#yhmMemoDeletePanel") ? ((GF.sorttype) % 6 + 1) : 1 var [order, finstrfunc] = [ ["登録順", a => a.reverse()], ["abc順→種別", a => a.sort((a, b) => a.m == b.m ? 0 : a.m < b.m ? 1 : -1).sort((a, b) => (new Intl.Collator("ja", { numeric: true, sensitivity: 'base' }).compare)(a.t, b.t))], ["長さ→abc順→種別", a => a.sort((a, b) => a.m == b.m ? 0 : a.m < b.m ? 1 : -1).sort((a, b) => a.t.length === b.t.length ? (new Intl.Collator("ja", { numeric: true, sensitivity: 'base' }).compare)(a.t, b.t) : a.t.length > b.t.length ? 1 : -1)], ["種別→登録順", a => a.reverse().sort((a, b) => a.m == b.m ? 0 : a.m < b.m ? 1 : -1)], ["種別→abc順", a => a.sort((a, b) => (new Intl.Collator("ja", { numeric: true, sensitivity: 'base' }).compare)(a.t, b.t)).sort((a, b) => a.m == b.m ? 0 : a.m < b.m ? 1 : -1)], ["種別→長さ→abc順", a => a.sort((a, b) => a.t.length === b.t.length ? (new Intl.Collator("ja", { numeric: true, sensitivity: 'base' }).compare)(a.t, b.t) : a.t.length > b.t.length ? 1 : -1).sort((a, b) => a.m == b.m ? 0 : a.m < b.m ? 1 : -1)] ][GF.sorttype - 1] let words = finstrfunc(newstr) $("#yhmMemoDeletePanel").remove() end(document.body, `
×(Esc)Shift+J:(${order})
メモ(${words.length})をクリックすると削除してクリップボードにコピーします
`) let dup = [] // 重複しているものは暗い色にする words.forEach(w => { end(eleget0("#yhmMemoDeletePanel"), `${sani(w.m)}${sani(w.t)} `) dup.push(w.t) }) }, }, { key: 'a', // a::ソート func: () => { 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;") sorttype == 1 && sortdom(elegeta('.box:not(#kako-search)'), v => Number(eleget0('.rescnt', v)?.textContent), 1) sorttype == 2 && sortdom(elegeta('.box:not(#kako-search)'), v => Number(0 + eleget0('.ikioi-icon', v)?.textContent) + Number((eleget0('span.red', v)?.textContent + 0 || 0)) * 10, 1) sorttype == 3 && sortdom(elegeta('.box:not(#kako-search)'), v => (eleget0('.thread-text', v)?.textContent)) sorttype == 4 && sortdom(elegeta('.box:not(#kako-search)'), v => v?.dataset?.idx) } }, ], wholeHelp: [() => 1, " A:ソート"], hideSelectedWord: 1, selectedHelp: { help: [KEYHIDE + ":NGワードに追加", "u/U/j:左上に優先配置(U:+通知/j:+開く)"] }, //, 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=***', "|") }, }], }, { 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', // futaba:: urlRE: '//.*.ftbucket.info/|//kuzure.but.jp/f/b/|//[^.]+.2chan.net\/|//anige.horigiri.net|//kako.futakuro.com/futa/', title: '.thre table .cno', box: '.thre table', disableKeyB: 0, redoWhenRefocused: 1, // isMemoPartialMatch:1, isHidePartialMatch: 1, memoFunc: titleEle => eleget0('.memo', titleEle.closest('tr')), memoPosition: "afterbegin", listHelpJQS: '.thre table', delay: 333, memoStyle: 'display:table !important; margin-bottom:2px;', detailURLRE: /$^/, detailTitleXP: '', hideSelectedWord: 1, selectedHelp: { help: [KEYHIDE + ":NGワードに追加"] }, //, multi: "複数行に渡る文字列は NG に入れられません" }, detailTitleSearchXP: '', listTitleSearchFunc: (title) => { // q::レス中キーワードNG // todo:リロードで追加されたレスにも非表示を適用 let resHit = []; if (typeof title === "string" && !/^No\.\d+$/gmi.test(title)) { // textContentでサーチする for (let res of elegeta('.thre table:not(.ftbpu table,#respopup_area table)')) { // レス全体(ID:~も対象) 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:新着チェック\nD:新着チェック+新着に移動":""}`, 7, 5000) }, //WhateverFirstAndEveryAPFunc: () => { popup3(`Shift+F:FTBucket検索\na:画像順/そうだね順/引用順でソート${location.href.match0(/^https?:\/\/[^.]+\.2chan\.net\//)?"\ne:新着チェック\nd:新着チェック+新着に移動\nc:ホバー中レスにそうだね\nn:自動更新&通知":""}`, 7, 5000) }, WhateverFirstAndEveryAPFunc: () => { popup3(`Shift+F:FTBucket検索\nA:画像順/そうだね順/引用順でソート${location.href.match0(/^https?:\/\/[^.]+\.2chan\.net\//)?"\nE:新着チェック\nD:新着チェック+新着に移動\nC:ホバー下にそうだね\nN:自動リロード&新着通知":""}`, 7, 5000) }, funcD: () => { // d:: // let r = eleget0("#contres>a,#fvw_loading"); let r = eleget0("#contres>a,#fvw_loading,a#akahuku_reload_button"); if (r) { if (!GF.latestReload || new Date().getTime() - GF.latestReload > 4000) { r.click(); GF.latestReload = new Date().getTime(); } // 要4秒インターバル setTimeout(() => { eleget0('.reloadline')?.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" }) }, 200); } }, keyFunc: [{ key: /^(?:Shift\+)?(?:Alt\+)?(?:z|Z)$/, // z::ポップアップを画像として「名前を付けて保存」 Shift+で高画質、Alt+でメモを反映 id: "z", func: (e) => { if (document.elementFromPoint(mousex, mousey)?.matches("video,img")) return; let isZ = e.indexOf("Shift+") != -1; let target = eleget0('.ftbpu') ? ".ftbpu" : eleget0('#pickbox') ? "#presentPick" : "" let orgtarget = eleget0('.ftbpu') ? ".ftbpu" : eleget0('#pickbox') ? "#pickbox" : "" if (!target || !orgtarget) return; if (target == "#presentPick") { let p = end(document.body, `
`) if (GF.presentPick) GF.presentPick.forEach(v => p.append(v.cloneNode(true))) sortdom(elegeta('#presentPick table[data-rsc]'), v => v.getAttribute("data-rsc")) } else { let p = eleget0(target).cloneNode(true); p.id = "presentPick"; p.className = "ignoreMe" target = "#presentPick" document.body.appendChild(p) // end(document.body, `
`) } if (elegeta(`${target} img:not(.quoteSpeechBalloonImg)`).length) { // 画像が1つでもあったら if (1 || !eleget0("#contdisp font:text*=スレッドがありません")) { let imgs = ld('kuzure.but.jp') ? elegeta(`${target} a>img[src*="s."]:not([data-rep-lar])`).filter(e => e.src.match(/s\./)) : elegeta(`${target} a>img[src*="thumb/"]:not([data-rep-lar])`).filter(e => e.src.match(/thumb\/\d+s\./)) imgs.forEach(img => { let orgHref = img?.parentNode?.href if (orgHref?.match(/\.(jpe?g|png|bmp|gif|webp)/)) { cldt("head"); img.dataset.repLar = 2; $.ajax({ url: orgHref, type: 'HEAD', error: (function(img) { return function() { img.dataset.repLar = 0; cldt(`404`); } })(img), success: (function(img) { return function() { img.src = orgHref; img.dataset.repLar = 1 cldt(`replace`); } })(img), }); } }) } let zwait = () => { cldt("compele?"); if (!eleget0(`${target} table a>img[data-rep-lar="2"]`) && elegeta(`${target} table a>img[data-rep-lar="1"]`).every(e => e.complete)) { z(e, isZ ? 3 : 2, isZ ? 3 : 2) } else { setTimeout(zwait, 50) } } setTimeout(zwait, 100 + elegeta(`${target} img:not(.quoteSpeechBalloonImg)`)?.length * 10) } else { z(e, isZ ? 2 : 1.5, isZ ? 2 : 1.5) } if (FUTABA_Z_TO_COPY_TO_CLIPBOARD_AS_TEXT_TOO) { // 文字としてもクリップボードにコピー let txt = elegeta('table[data-rsc]', eleget0(orgtarget)).map(t => FUTABA_Z_TO_COPY_TO_CLIPBOARD_AS_TEXT_TOO.replace("${num1}", eleget0('.rsc', t)?.innerText || "").replace("${name1}", eleget0('.csb', t)?.innerText || "").replace("${name2}", eleget0('.cnm', t)?.innerText || "").replace("${time}", eleget0('.cnw', t)?.innerText || "").replace("${num2}", eleget0('.cno', t)?.innerText || "").replace("${soudane}", eleget0('.sod', t)?.innerText || "").replace("${text}", eleget0('blockquote', t)?.innerText || "")) GM.setClipboard(txt.join("\n")) popup3(elegeta('table[data-rsc]', eleget0(orgtarget)).map(t => `${eleget0('.rsc',t)?.innerText}`).join(","), 0, 5000, "top") } return; function z(key, SCALE_MIN = 1, SCALE_MAX = 2) { //var SCALE_MIN = 1 // 保存最低倍率 //var SCALE_MAX = scaleLimit || 2 // 保存最大倍率 //var D_FILENAME_MAXLENGTH = 87 // ファイル名の最大長 var D_FILENAME_MAXLENGTH = 83 // ファイル名の最大長 if (!eleget0(target)) return; let filenameSuffix = (key.indexOf("Alt+") != -1) ? FUTABA_ALTZ_FILENAME_SUFFIX : "" GF?.zFunc && GF?.zFunc() let honbun = elegeta(`${target} blockquote`).map(e => e.innerText)?.join(" ")?.replace(/\s+|\n+/gm, " ")?.trim() honbun = honbun?.replace(/\s*\>+[^\s]+/gm, "")?.trim() || res honbun = honbun?.slice(0, 100); // ?.replace(/キタ━+\(゚\∀゚\)━+\!+/gm,""); if (key.indexOf("Alt+") == -1) { $(`${target} .yhmMyMemo,${target} .relallArea,${target} .adddel`).remove() $(`${target} .sod`).css({ "font-size": "100%" }).removeClass("sodmypush") //,"float":"right" }) } $(`${target} .relallArea`).remove() $(`${target}`).css({ "box-shadow": "none", "transform": "scale(1)" }) if (orgtarget == "#pickbox") { $(`${target} table`).css({ "margin-right": "auto", "margin-left": "0" }) $(`${target} a img`).css({ "max-height": "" }) // pickの画像縦圧縮を解放する } $(`${target} .revQuote`).after("
"); //css({ "display": "inline-block" }) addstyle.add(`.yendotsaveElement .GM_FRRS_Counter,.yendotsaveElement .GM_FRRS_own_res{display:none}`) elegeta(`${target} .rsc`).forEach(e => e.style = "") var hrefName = "" // var fn = `${signzen(document.title?.replace(/\s+|\n+/gm," ")?.trim()+" "+location.href).substr(0, D_FILENAME_MAXLENGTH-hrefName.length-1)} ${hrefName}`?.trim() var fn = `${signzen(document.title?.replace(/\s+|\n+/gm," ")?.trim()+" "+location.href).substr(0, D_FILENAME_MAXLENGTH-hrefName.length)}`?.trim() var res = honbun res = res?.replace(/^\s*\>.*\s*$/gm, "")?.replace(/キタ━+\(゚\∀゚\)━+\!+/gm, "")?.trim() || res; // if (res) fn = `${signzen(document.title+" "+location.href).substr(0, D_FILENAME_MAXLENGTH/2-hrefName.length-1)} ${signzen(res).substr(0, D_FILENAME_MAXLENGTH/2-1)} ${hrefName}`.trim() if (res) fn = `${signzen(document.title+" "+location.href).substr(0, D_FILENAME_MAXLENGTH/2-hrefName.length)} ${signzen(res).substr(0, D_FILENAME_MAXLENGTH/2)}`.trim() //if(filenameSuffix&&fn.length>D_FILENAME_MAXLENGTH)fn=fn.slice(-1,1) fn += filenameSuffix function signzen(str) { return str.replace(/^\s+/, "").replace(/\\|\/|\:|\;|\,|\+|\&|\=|\*|\?|\"|\'|\>|\<|\./g, c => { return String.fromCharCode(c.charCodeAt(0) + 0xFEE0) }) } let puele = eleget0(`${target}`) puele.classList.add('yendotsaveElement') let scale = Math.max(1, Math.min(SCALE_MAX, SCALE_MIN + (elegeta('img:not(.quoteSpeechBalloonImg)', puele).length * 0.5))) popup3(`z:ポップアップ(ピックアップ)を保存\n(Shift+で高画質、Alt+でメモを維持)\nScale = ${scale}`, 12) // document.dispatchEvent(new CustomEvent('saveDOMAsImage', { detail: { element: puele, filename: fn, scale: scale, hd: (key.indexOf("Shift+") != -1) ? 1 : 0, eleToFlash: target == ".ftbpu" ? eleget0(".ftbpu") : eleget0("#pickbox") } })) document.dispatchEvent(new CustomEvent('saveDOMAsImage', { detail: { element: puele, filename: fn, scale: scale, hd: (key.indexOf("Shift+") != -1) ? 1 : 0, eleToFlash: orgtarget == ".ftbpu" ? eleget0(".ftbpu") : eleget0("#pickbox") } })) $('#presentPick').remove() //if (orgtarget == "#pickbox") setTimeout(() => window.dispatchEvent(new Event('resize')), 1000) } }, }, { key: 'e', // e::リロード func: () => { let r = eleget0("#contres>a,#fvw_loading,a#akahuku_reload_button"); if (r) { if (!GF.latestReload || new Date().getTime() - GF.latestReload > 4000) { r.click(); GF.latestReload = 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: 'n', // n::Notificationで新着レスを通知on/off func: (key, opt = null) => { GF.reloadAndNotifyNewArrival = ((GF.reloadAndNotifyNewArrival || 0) + 1) % 4; $('#notiApiOn').remove(); let mess = `N:自動リロードと新着通知…${GF.reloadAndNotifyNewArrival}\n${["オフ","自動リロード","自動リロード+新着レスをNotificationで通知(全て)","自動リロード+新着レスをNotificationで通知(画像かメモ付きのみ)"][GF.reloadAndNotifyNewArrival]}` if (opt != "automation") popup2(`${mess}`, 8); if (opt != "automation") popup2(`N:自動リロードと新着通知\n${["オフ","自動リロード","自動リロード+新着レスをNotificationで通知(全て)","自動リロード+新着レスをNotificationで通知(画像かメモ付きのみ)"].map((c, i) => " " + c + (i == GF.reloadAndNotifyNewArrival ? " ←\n" : "\n")).join("")}`, 9, "min-width:31em;") if (GF.reloadAndNotifyNewArrival && ld("2chan.net")) { // $(`通知`).click(e => keyFuncDispatch("n")).appendTo('body'); $(`${["オフ","更新","通知","通知"][GF.reloadAndNotifyNewArrival]}`).click(e => keyFuncDispatch("n")).appendTo('body'); } }, }, { key: 'a', // a:: func: () => { GF.stopmoq = 1 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(); GF.sort = (GF?.sort || 0) % 4 + 1 //var sorttype = GF.sort||0//Number($('.yhmSortType')?.attr("id") || 0); let sorttype = GF.sort popup2("A:ソート\n" + (["画像", "そうだね", "引用", "古い順"].map((c, i) => " " + c + (i + 1 == sorttype ? " ←\n" : "\n")).join("")), 6, "min-width:6em;") sorttype == 1 && sortdom(elegeta('.rtd:not(#pickbox .rtd,.ftbpu .rtd)').map(v => v?.closest('table')), (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|(?)fu?\d+\.(jpg|jpeg|png|gif|bmp|webp|webm|mp4)/gmi) ? 1 : 0) * 1000000) || ((v.textContent.match(/ttps?\:\/\//gmi) ? 1 : 0) * 1000)) }, 1) // リンクも加点 sorttype == 2 && sortdom(elegeta('.rtd:not(#pickbox .rtd,.ftbpu .rtd)').map(v => v?.closest('table')), (v) => { return (((v.querySelector('.sod') || v).innerText?.match0(/そうだねx(\d+)/) || 0) * 1000000000) + (v.querySelectorAll(".revQuote").length * 1000000) + (((v.textContent.match(/\d\d\d\sB\)|youtube\.|youtu\.be|nicovideo|(?)fu?\d+\.(jpg|jpeg|png|gif|bmp|webp|webm|mp4)/gmi) || []).length * 1000) || ((v.textContent.match(/ttps?\:\/\//gmi) || []).length * 1)) }, 1) // リンクも加点 sorttype == 3 && sortdom(elegeta('.rtd:not(#pickbox .rtd,.ftbpu .rtd)').map(v => v?.closest('table')), (v) => { return (((v.querySelector('.sod') || v).innerText?.match0(/そうだねx(\d+)/) || 0) * 1000000) + (v.querySelectorAll(".revQuote").length * 1000000000) + (((v.textContent.match(/\d\d\d\sB\)|youtube\.|youtu\.be|nicovideo|(?)fu?\d+\.(jpg|jpeg|png|gif|bmp|webp|webm|mp4)/gmi) || []).length * 1000) || ((v.textContent.match(/ttps?\:\/\//gmi) || []).length * 1)) }, 1) // リンクも加点 sorttype == 4 && sortdom(elegeta('.rtd:not(#pickbox .rtd,.ftbpu .rtd)').map(v => v?.closest('table')), v => v.getAttribute("rsc")) //, setTimeout(() => { GF.stopmoq = 0 }, 500) }, }], funcOnlyFirst: () => { GF.latestReload = Date.now() - 3000 GF.newarticle = 1000 GF.latestInterval = FUTABA_AUTO_RELOAD_INTERVAL * 60 * 1000 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} #v0z{display:none;}") } if (is2chan || isftchan) GM_addStyle(".rtd{vertical-align:top} #pdm{z-index:2000000021}") GM_addStyle("#pickbox .yhmMyMemo{white-space: nowrap;} .quo{vertical-align:top} a:visited{color:#800080;}") let fivechthumbnailetc = (!lh(/\.2chan\.net\//) || eleget0('#fivechthumbnailetc')) && 1 GM_addStyle(".quoteSpeechBalloon{font-size:14px; position:relative; bottom:1px; color:#484; background-color:#ffffee;border-radius:1em; user-select:none; cursor:pointer;}") // qsb:: GM_addStyle(".quoteSpeechBalloonImg{float:right; clear:right; max-height:2.8em !important; padding:4px; user-select:none; background-color:#ffffee; border-radius:6px; cursor:pointer;") GM_addStyle(".revQuote{cursor:pointer;color:#789922; margin:0.19em; }") addstyle.add('.waiting{ display: inline-block; vertical-align: middle; color: #666; line-height: 1; width: 1em; height: 1em; border: 0.12em solid currentColor; border-top-color: rgba(102, 102, 102, 0.3); border-radius: 50%; box-sizing: border-box; -webkit-animation: rotate 1s linear infinite; animation: rotate 1s linear infinite; } @-webkit-keyframes rotate { 0% { transform: rotate(0); } 100% { transform: rotate(360deg); } } @keyframes rotate { 0% { transform: rotate(0); } 100% { transform: rotate(360deg); } }') addstyle.add('.relallArea{text-align:center; display:inline-block; line-height:1.5em; color:#789922c0; min-width:1.5em; height:1.5em; margin:1px 0 1px 3px; margin-top:0.3em; } .memo:empty+.backlink:empty+.relallArea{margin-top:3px; } .backlink:empty+.relallArea{margin-top:7px; } ') //background-color:#eed; addstyle.add('.relallAreaon{outline:2px dotted #789922f0; cursor:pointer;}') //background-color:#eed; addstyle.add('.sodmypush{color:#f00;}') if (location.href.match0("anige.horigiri")) GM_addStyle(`blockquote{color:#800000;line-height:1.2em;font-style:normal;`) addstyle.add('.GM_FRRS_Counter{display:none !important;}') GF.originalDocTitle = eleget0('//div[@class="thre"]/blockquote')?.textContent || document.title; GF.anchor = new Array(1000).fill("") //let favi=eleget0('.thre>a>img')?.src; if(favi)end(document.head,``) // ファビコンを最初の画像にする let isfvw = eleget0('#fvw_menu') let replaceMainPopup = (FUTABA_HOVER_POPUP_REPLACE) || !is2chan if (is2chan && replaceMainPopup) { GM_addStyle("#slp{z-index:1001} .qtd{display:none !important;} .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:18em; left:auto; bottom:3px; height:auto; padding:0.1em 0.2em; border:2px solid #dddddd; background-color:#ffffff;}`) } pick2title(1) GF.myRes = []; eleget0('input[value="返信する"]')?.addEventListener("click", e => { let ysend = window.scrollY; // スクロールを戻す GF.myRes.push(eleget0("#ftxa")?.value?.trim()) function revscr(i) { if (window.scrollY != ysend) window.scrollTo(0, ysend); else if (i--) setTimeout(revscr, 17, i); } revscr(1000) }, true) $(document).on("click", ".relallAreaon", e => SITE?.keyFunc?.find(v => v.id === "z")?.func(e.ctrlKey ? "Shift+Z" : "z")) //$(document).on("click","div.thre",e=>{e.preventDefault();if(e?.target?.matches("div.thre"))leadFocus();}) document.addEventListener("focus", e => { if (!elegeta('.thre img:not(img.quoteSpeechBalloonImg):inscreen').length) leadFocus() }) document.addEventListener("blur", e => { $(".leadFocus").remove() }) function leadFocus(e) { // フォーカスが戻った時に0を表示 if (!lh("/res/") || eleget0('//div[@class="thre"]/a/img|//div[@class="thre"]/a[2]/img:inscreen') || eleget0('//div[@class="thre"]/blockquote:inscreen') || eleget0('#pickbox,.leadFocus')) return; let img = eleget0('//div[@class="thre"]/a/img')?.cloneNode(true) let desc = elegeta('//div[@class="thre"]/span[1]|//div[@class="thre"]/span[2]|//div[@class="thre"]/span[3]|//div[@class="thre"]/span[4]|//div[@class="thre"]/span[5]|//div[@class="thre"]/a[@class="sod"]')?.map(e => e.cloneNode(true)) let honbun = eleget0('//div[@class="thre"]/blockquote')?.cloneNode(true) if (!img || !honbun) return; honbun.style.minWidth = "800px" let lead = end(document.body, `
`) desc.forEach(e => eleget0(".rtd", lead).appendChild(e)) eleget0(".rtd", lead).appendChild(img) eleget0(".rtd", lead).appendChild(honbun) $(lead).animate2({ "transform": "translate(0,0)" }, 333) //, (function(e) { return function() { setTimeout(() => { $(e).animate({"transform":"translate(0,-100%)"},333, () => $(e).remove()) }, 999) } })(lead)) setTimeout(lead => { $(document).one("click wheel mousemove keydown", "body", (function(lead) { return function() { $(lead).animate2({ "transform": "translate(0,-150%)" }, 333); setTimeout(lead => lead.remove(), 333, lead); } }(lead))) }, 1333, lead) } // 自動リロード:: if (1 || FUTABA_AUTO_RELOAD_INTERVAL >= 1) { var musousa = { last: Date.now(), elapsed: () => { return Date.now() - this.last }, init: () => { this.last = Date.now(); $('body').on('keydown mousedown mousemove', () => this.last = Date.now()); }, } musousa.init() setInterval(() => { if (document.body.textContent.match("スレッドがありません|上限\d+レスに達しました") && !GF?.stopThre) { GF.stopThre = 1 document.title = `🐾${document.title}` } if (!GF?.reloadAndNotifyNewArrival) return; if ((musousa.elapsed() < 30000 && document.activeElement.tagName.match(/textarea|input/i)) || eleget0('//span[@id="thread_down"]') || GF?.stopThre) return; let r = eleget0('#contres>a,#fvw_loading') if (!r) return let inter = Math.max(60 * 1000, Math.min(Math.max(600000, (FUTABA_AUTO_RELOAD_INTERVAL * 60 * 1000)), (FUTABA_AUTO_RELOAD_INTERVAL * 60 * 1000) + (musousa.elapsed() >= 59000 && GF?.newarticle == 0 && GF.latestInterval / 1))) // 1分以上無操作の時リロードして新着がないと更新間隔を広げていく、最低1分最大10分 if (!GF.latestReload || Date.now() - GF.latestReload >= inter) { if (FUTABA_DEBUG >= 1) end(document.body, `
update : ${gettime()} / 現在更新間隔:${~~(inter/1000)} / 新着:${GF?.newarticle} / リロード後経過秒:${~~((Date.now()-GF.latestReload)/1000)} / 無操作秒:${~~(musousa.elapsed()/1000)} / 前回:${GF.latestInterval/1000}
`) GF.latestReload = Date.now() GF.latestInterval = inter r?.click() } if (FUTABA_DEBUG >= 2) document.title = `${~~(inter/1000)}/${GF?.newarticle}/${~~((Date.now()-GF.latestReload)/1000)}/${~~(musousa.elapsed()/1000)} 現在更新間隔:${~~(inter/1000)} / 新着:${GF?.newarticle} / リロード後経過秒:${~~((Date.now()-GF.latestReload)/1000)} / 無操作秒:${~~(musousa.elapsed()/1000)} / 前回:${GF.latestInterval/1000}` }, 1000) } // c::ホバー下にそうだね var xTarget = [] var cnoPushed = [] var sodTarget = [] var lastc = 0 document.addEventListener('keypress', e => { if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA' || e.target.isContentEditable || ((e.target.closest('#chat-messages,ytd-comments-header-renderer') || document.activeElement.closest('#chat-messages,ytd-comments-header-renderer')))) return; var key = (e.shiftKey ? "Shift+" : "") + (e.altKey ? "Alt+" : "") + (e.ctrlKey ? "Ctrl+" : "") + e.key; var ele = document.elementFromPoint(mousex, mousey); var cno = eleget0('.cno', ele?.closest('table'))?.textContent?.replace(/\D/g, "") if (key == "c") $(ele?.closest('td')).effect("highlight") if (key == "c" && cno && !cnoPushed.includes(cno)) { cnoPushed.push(cno) xTarget.push({ key: key, cno: cno }); xTarget = (Array.from(new Set(xTarget.map(v => JSON.stringify(v))))).map(v => JSON.parse(v)) // uniq:オブジェクトの配列→JSON文字列配列→uniq→オブジェクトの配列 //end(eleget0('.sod', ele?.closest('td')), `?`) // くるくるを表示 } }) setInterval(() => { if (Date.now() - lastc < 3500) return var a = xTarget.shift() if (!a) return let [key, cno] = [a.key, a.cno] let t = eleget0(`.cno:text*=${cno}`)?.closest('table') if (!t) return if (key == "c" && !t?.dataset?.soddone) { $('.waiting', t).remove() $('.sod', t).click().effect("highlight") lastc = Date.now() t.dataset.soddone = 1; } }, 200) // そうだねを改行しないようにする //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);`) }) } // $(document).on("click", "a.sod", (e) => { e.target.style.color = "#f00" }) //$(document).on("click","a.sod",(e)=>{e.target.style.textDecoration="underline"}) $(document).on("click", "a.sod", (e) => { e.target.classList.add("sodmypush") }) //$(document).on("click","a.sod",(e)=>{e.target.style.textDecoration="underline"}) $("#contres>a,#fvw_loading").on("click", (e => { GF.newarticle = 0 let latestEle = eleget0('//*[@class="thre"]/table[last()]'); //setTimeout(() => { document.body.dispatchEvent(new Event('2chanReloaded')) }, 1500) document.body.dispatchEvent(new Event('2chanReloadedNodelay')) })); // リロード再実行 //moq(eleget0('.thre:not(#pickbox .thre'), ".thre>table,.thre>div:not(#pickbox .thre>div,#pickbox,.qtd,.slp)", v => { // 新しいレスが追加されたら // moq(eleget0('.thre:not(#pickbox .thre'), "table", v => { moq(eleget0('.thre:not(#pickbox .thre'), "table,div:not(#pickbox,.qtd)", v => { // ,divはfutakuro共存用 //moq(eleget0('.thre:not(#pickbox .thre'), "table,div", v => { // ,divはfutakuro共存用 if (!GF.stopmoq) { //let newarticle = elegeta('.thre table .rtd .rsc:not([data-basec]),.thre table .res_no:not([data-basec])') let newarticle = elegeta('.thre table .rsc:not([data-basec]),.thre table .res_no:not([data-basec])') GF.newarticle = newarticle.length || 0 setTimeout(() => { document.body.dispatchEvent(new Event('2chanReloaded')) }, 1) } }) // document.addEventListener("focus", () => { // firefox window.addEventListener("focus", () => { // firefox/chrome document.title = document.title.replace(/^🐾/g, ""); if (GF?.arrival) { document.title = document.title.replace(/^[🐾🔴🔵■]+/g, ""); GF.arrival = 0 } }) function moq(observeNode, targetCSSSelector, cb) { new MutationObserver((m) => { let eles = [...m.filter(v => v.addedNodes).map(v => [...v.addedNodes]).filter(v => v.length)].flat().find(v => v.nodeType === 1 && v?.matches(targetCSSSelector)); if (eles) cb(eles) })?.observe(observeNode || document.body, { attributes: false, childList: true, subtree: false }); } 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(); }) } }) /* $(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); */ $(elegeta('//table[@class="deleted"]')).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"]')).attr("title", "").animate2({ "opacity": "0.7", "transform": "scale(1)", "transform-origin": "right", "float": "none" }, 500); $(this)[0].scrollIntoView({ block: "nearest", behavior: "smooth" }) }) // 隔離を薄くして右に $(document.body).append(``) // ニコ動埋め込み(PrivacyBadger等は要Disable) var embednv = () => { var elea = elegeta('a[href*="nicovideo"]:not([nde]),a[href*="//nico.ms/sm"]:not([nde])') for (let ele of elea.filter(e => eleget0('.yhmMyMemo', e.closest("table"))).concat(elea.filter(e => isinscreen(e)))) { // リロード回避のためpickされるものは先に読み込む 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?.closest("td,div.thre>blockquote:not([nde])")).append(`

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