// ==UserScript== // @name コミックDAYS&くらげバンチ&マガポケ&ジャンプ+&となりのヤングジャンプ&WEBヒーローズ&Pixivコミック 左キーだけでどんどん読む // @description 「次の話を読む」や「この作品の無料公開中の話へ」ボタンが出た時に左キーでそれをクリックします Enterで最新話に移動 fや[で全画面化 // @match *://comic-days.com/episode/* // @match *://kuragebunch.com/episode/* // @match *://pocket.shonenmagazine.com/episode/* // @match *://shonenjumpplus.com/episode/* // @match *://tonarinoyj.jp/episode/* // @match *://viewer.heros-web.com/episode/* // @match *://comic.pixiv.net/viewer/* // @match *://mangacross.jp/comics/* // @match *://comic-action.com/episode/* // @match *://ashitano.tonarinoyj.jp/series/* // @match *://daysneo.com/works/* // @match *://rookie.shonenjump.com/series/* // @match *://kodansha-cc.co.jp/comic/* // @match *://viewer.ganganonline.com/manga/* // @match *://www.mangabox.me/reader/* // @match *://r-cbs.mangafactory.jp/* // @match *://comic-gardo.com/episode/* // @match *://comic-zenon.com/episode/* // @match *://magcomi.com/episode/* // @match *://www.alphapolis.co.jp/manga/* // @match *://curazy.com/manga/viewer* // @match *://comic-trail.jp/pt/* // @match *://www.sukima.me/* // @run-at document-idle // @grant GM_addStyle // @version 0.6.3 // @namespace https://greasyfork.org/users/181558 // @require https://code.jquery.com/jquery-3.4.1.min.js // @require https://code.jquery.com/ui/1.12.1/jquery-ui.min.js // @downloadURL none // ==/UserScript== (function() { const KeyNextReadableEpisode = "ArrowLeft"; const KeyLatestReadableEpisode = "Enter"; const KeyFullScreen1 = "["; const KeyFullScreen2 = "f"; setInterval(() => { var ele = eleget0('//section[@class="read-more-container"]/button|//button[@class="js-read-more-button"]|//div[@class="series-comment-contents-box"]/button|//ul[@class="backnumber-list"]/li/a/span'); if (isinscreen(ele, "wait")) $(ele).click().effect("highlight"); }, 1500); // アコーディオンを開く // 次の話に←表示 var nextl = '//div[@class="viewer-colophon-info-wrapper"]/div[@class="viewer-colophon-info"]/p[@class="viewer-colophon-next-episode"]/a[@class="next-link test-back-matter-next-link"]|//a[@class="next-episode-free-link common-button"]|//a[@class="next-open-link"]|//a[contains(text(),"次の話")]|//div[@class="end-page__box"]/div[2]/a[contains(text(),"次のエピソードを読む")]|//li/a[@class="ui-button-colophon js-next-episode"]|//div[@id="end_page"]/p/a/span[contains(text(),"次の話へ")]|//a[@class="button next-episode-button"]|//a[@class="btn btn-next" and text()="次の話を読む"]|//div/button[contains(text(),"次の話へ")]|//a[@class="lastSlider_nextButton"]|//div[@id="rc_next"]|//a[@class="viewer_commonButton viewer_commonButton-gotoNext jsViewer_commonButton"]|//div[@class="r-linkbutton_orange r-main"]/a[contains(text(),"次の話を読む")]|//a[@class="js-ripple chaptEndNavi__page__next--free"]|//div[@class="container"]/div[@class="chaptEndNavi__page"]/a[1]'; var leftArrowTimer = setInterval(() => { var ele = eleget0(nextl); if (isinscreen(ele) && !ele.innerText.match(/ \(←\)/)) { ele.innerText += " (←)"; } }, 500); // 最新話にEnter表示 var lastl = '//div[@class="js-readable-product-list"]/div[1]/ul[1]/li[1]/a/div/h4|//div[@class="js-readable-product-list"]/ul[1]/li[1]/a/div/h4|//div[2]/ul[1]/li[1]/a/div[2]/h4[@class="series-episode-list-title"]'; var lastl2 = '//span[@class="test-readable-product-is-free series-episode-list-is-free"]' var writeEnter = setInterval(() => { var ele = eleget0(lastl2) || eleget0(lastl); if (!eleget0('//*[contains(text()," (Enter)")]|//section[@class="read-more-container"]/button|//button[@class="js-read-more-button"]') && isinscreen(ele, "wait")) ele.innerText += " (Enter)"; // clearInterval(writeEnter); }, 500); // 1,下にスクロールさせてエピソードリンクを読み込ませる setTimeout(() => { var ele = eleget0('//div[@class="episode-header-container"]'); // if (ele) ele.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" }); if (ele) { $("html,body").animate({ scrollTop: $(ele).offset().top }); } }, 500); // 2,一番上にスクロールを戻す setTimeout(() => { $("html,body").animate({ scrollTop: 0 }); }, 1600) document.addEventListener('keydown', function(e) { if (/input|textarea/i.test(e.target.tagName) == false) { if (!e.getModifierState("Alt") && !e.getModifierState("Control") && !e.getModifierState("Shift") && e.key === KeyNextReadableEpisode) { // 左キー var ele = eleget0(nextl); if (isinscreen(ele)) { lightup(); ele.click(); ele.focus(); ele.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" }); } } if (!e.getModifierState("Alt") && !e.getModifierState("Control") && !e.getModifierState("Shift") && e.key === KeyLatestReadableEpisode) { // Enterキー var ele = eleget0(lastl2) || eleget0(lastl); if (ele) { lightup(); ele.parentNode.parentNode.click(); ele.parentNode.parentNode.focus(); ele.parentNode.parentNode.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" }); } else eleget0('//div[@class="episode-header-container"]').scrollIntoView(); } if (!e.getModifierState("Alt") && !e.getModifierState("Control") && !e.getModifierState("Shift") && (e.key === KeyFullScreen1 || e.key === KeyFullScreen2)) { // f [ 全画面化 var y = window.pageYOffset; var doc = window.document; var docEl = doc.documentElement; var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen; var cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen; if (!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) { requestFullScreen.call(docEl); } else { cancelFullScreen.call(doc); } setTimeout(window.scroll, 100, 0, y); } } }, false); return function eleget0(xpath) { var ele = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); return ele.snapshotLength > 0 ? ele.snapshotItem(0) : ""; } function isinscreen(ele, wait = "nowait") { if (!ele || (wait == "wait" && $(eleget0('//span[@class="loading-text"]')).is(":visible"))) return 0; var eler = ele.getBoundingClientRect(); return (eler.top > 0 && eler.left > 0 && eler.left < window.parent.screen.width && eler.top < window.parent.screen.height); } function lightup() { GM_addStyle(":focus { box-shadow: 0px 0px 10px 10px rgba(0, 250, 0, 0.5), inset 0 0 100px rgba(0, 250, 0, 0.2) !important; outline: rgba(0, 250,0,0.7) solid 4px !important; outline-offset: 1px !important; }") setTimeout(() => GM_addStyle(":focus { box-shadow: 0px 0px 0px 0px rgba(0, 250, 0, 0.5),inset 0 0 0px rgba(0, 250, 0, 0.2) !important; outline: rgba(0, 0,0,0) solid 0px !important;}"), 1000); } })();