Greasy Fork

Greasy Fork is available in English.

コミックDAYS&くらげバンチ&マガポケ&ジャンプ+&となりのヤングジャンプ&WEBヒーローズ&Pixivコミック 左キーだけでどんどん読む

「次の話を読む」や「この作品の無料公開中の話へ」ボタンが出た時に左キーでそれをクリックします Enterで最新話に移動 fや[で全画面化

当前为 2024-03-02 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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 *://curazy.com/manga/viewer*
// @match *://comic-trail.jp/pt/*
// @match *://piccoma.com/web/viewer/*
// @match *://wanibooks-newscrunch.com/articles/viewer/*
// @match *://urasunday.com/title/*
// @match *://feelweb.jp/episode/*
// @match *://www.sunday-webry.com/episode/*
// @match https://comicborder.com/episode/*
// @match *://comic-ogyaaa.com/*
// @match https://comic-trail.com/episode/*
// @run-at document-idle
// @grant GM_addStyle
// @version 0.6.18
// @namespace http://greasyfork.icu/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
// ==/UserScript==

(function() {
  let COLL = (a, b) => (new Intl.Collator("ja", { numeric: true, sensitivity: 'base' }).compare)(a.textContent, b.textContent)
  let latestReadable = () => {
    $(`.enterdisp`).remove();
    let l = elegeta('div.series-episode-list-title-wrapper.test-readable-product-item-title')
      .filter(e => !e.innerText.match(/公開は終了しました/) && !eleget0('//p[@class="test-readable-product-point point"]', e.closest("li")))
      .sort(COLL)?.pop()
    end(l, `<span class="enterdisp">(Enter)</span>`);
    return eleget0('//span[@class="series-episode-list-date"]', l)
  }

  const KeyNextReadableEpisode = "ArrowLeft";
  const KeyLatestReadableEpisode = "Enter";
  const KeyFullScreen1 = "[";
  const KeyFullScreen2 = "f";
  let latestClick = 0

  let GF = {};

  function openacc() {
    if (eleget0('//span[@class="loading-text"]:visible')) return;
    //    var ele = elegeta('//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').find(e => isinscreen(e, "wait"));
    var ele = elegeta('//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:inscreen:visible')
    if (ele.length && Date.now() - (GF?.lastoa || 0) >= 1500) {
      $(ele).click().effect("highlight");
      GF.lastoa = Date.now();
    }
  }
  setInterval(openacc, 1500); // アコーディオンを開く
  document.addEventListener("scroll", openacc)

  /*
  setInterval(() => {
    var ele = elegeta('//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').find(e => isinscreen(e, "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[contains(@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(),"次の話を読む")]|//div[@class="article-comic-slider__item-next"]/div/a[contains(text(),"次の話を読む")]|//a[@class="next-episode-free-link   common-button"]';

  var leftArrowTimer = setInterval(() => {
    var ele = eleget0(nextl);
    if (isinscreen(ele) && !ele.innerText.match(/ \(←\)/)) {
      ele.innerText += " (←)";
    }
  }, 500);

  var writeEnter = setInterval(() => {
    let e = latestReadable()
  }, 500)

  // 1,下にスクロールさせてエピソードリンクを読み込ませる
  setTimeout(() => {
    var ele = eleget0('//div[@class="episode-header-container"]');
    if (ele) $("html,body").animate({ scrollTop: $(ele).offset().top });
    //  }, 500);
  }, 17);

  // 2,一番上にスクロールを戻す
  if (!lh("rookie.shonenjump.com")) {
    setTimeout(() => {
      $(eleget0('//div[@id="btn-scale"]/div[1]/div[text()="拡大"]|//span[@class="viewer-btn-expand js-viewer-btn-expand"]|//button[@class="viewer-button viewer-button--max"]/img')).click(); // 「拡大」ボタンがあれば押す
      $("html,body").animate({ scrollTop: 0 });
    }, 1600)
  }
  document.addEventListener('keydown', function(e) {
    if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA' || e.target.isContentEditable) return;
    if (!e.getModifierState("Alt") && !e.getModifierState("Control") && !e.getModifierState("Shift") && e.key === KeyNextReadableEpisode) { // 左キー
      var ele = eleget0(nextl);
      if (isinscreen(ele)) {
        if (Date.now() - latestClick < 1500) return false; // 1秒に1回以上は抑制
        latestClick = Date.now();
        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 = latestReadable()
      if (ele) {
        if (Date.now() - latestClick < 1500) return false; // 1秒に1回以上は抑制
        latestClick = Date.now();
        lightup();
        ele.click();
        ele.focus();
        ele.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" });
      } else eleget0('//div[@class="episode-header-container"]') && eleget0('//div[@class="episode-header-container"]').scrollIntoView();
    }

    if (!e.getModifierState("Alt") && !e.getModifierState("Control") && !e.getModifierState("Shift") && e.key === "a") { // a::
      domsort(eleget0('//ul[@class="series-comment-contents-list js-series-comment-list"]'), elegeta('//li[@class="comment-container js-series-report-comment-container"]'), v => parseInt(eleget0('//span[@class="comment-likes-number js-comment-like-counts"]|.//span[@class="comment-likes-number js-comment-like-counts comment-like-counts-zero"]', v)?.innerText))
    }

    if (!e.getModifierState("Alt") && !e.getModifierState("Control") && !e.getModifierState("Shift") && (e.key === KeyFullScreen1 || e.key === KeyFullScreen2)) { // f [ 全画面化
      var y = window.pageYOffset;
      if (!document.fullscreenElement) {
        let p = document.documentElement.requestFullscreen();
        p.catch(() => {});
      } else {
        if (document.exitFullscreen) {
          let p = document.exitFullscreen();
          p.catch(() => {});
        }
      }
      setTimeout(window.scroll, 100, 0, y);
    }
  }, false)
  return

  function elegeta(xpath, node = document) {
    if (!xpath || !node) return [];
    if (typeof xpath === "function") return xpath() // !!!
    //    let xpath2 = xpath.replace(/:inv?screen|:visible|:text\*=[^:]*/g, "") // text*=~中で:は使えない
    let xpath2 = xpath.replace(/:inscreen|:visible|:text\*=[^:]*/g, "") // text*=~中で:は使えない
    let array = []
    try {
      if (!/^\.?\//.test(xpath)) {
        array = [...node.querySelectorAll(xpath2)]
      } else {
        var snap = document.evaluate("." + xpath2, node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null)
        let l = snap.snapshotLength
        for (var i = 0; i < l; i++) array[i] = snap.snapshotItem(i)
      }
      if (/:visible/.test(xpath)) array = array.filter(e => e.offsetHeight)
      //if (/:invscreen/.test(xpath)) array = array.filter(e => { var eler = e.getBoundingClientRect(); return (eler.bottom >= 0 && eler.top <= document.documentElement.clientHeight) }) // 画面縦内に1ピクセルでも入っている
      if (/:inscreen/.test(xpath)) array = array.filter(e => { var eler = e.getBoundingClientRect(); return (eler.bottom >= 0 && eler.right >= 0 && eler.left <= document.documentElement.clientWidth && eler.top <= document.documentElement.clientHeight) }) // 画面内に1ピクセルでも入っている
      if (/:text\*=./.test(xpath)) { let text = xpath.replace(/^.*:text\*=([^:]*)$/, "$1"); if (text) array = array.filter(e => new RegExp(text).test(e?.textContent)) }
    } catch (e) { return []; }
    return array
  }

  function eleget0(xpath, node = document) {
    if (!xpath || !node) return null;
    //if (typeof xpath === "function") return xpath() // !!!
    //    if (/:inv?screen|:visible|:text\*=/.test(xpath)) return elegeta(xpath, node)?.shift();
    if (/:inscreen|:visible|:text\*=/.test(xpath)) return elegeta(xpath, node)?.shift();
    if (!/^\.?\//.test(xpath)) return node.querySelector(xpath);
    try {
      var ele = document.evaluate("." + xpath, node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
      return ele.snapshotLength > 0 ? ele.snapshotItem(0) : null;
    } catch (e) { alert(e + "\n" + xpath + "\n" + JSON.stringify(node)); return null; }
  }
  /*
    function elegeta(xpath, node = document) {
      if (!xpath) return [];
      let flag
      if (!/^\.?\//.test(xpath)) return /:visible$/.test(xpath) ? [...node.querySelectorAll(xpath.replace(/:visible$/, ""))].filter(e => e.offsetHeight) : [...node.querySelectorAll(xpath)]
      try {
        var array = [];
        var ele = document.evaluate("." + xpath.replace(/:visible$/, ""), node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        let l = ele.snapshotLength;
        for (var i = 0; i < l; i++) array[i] = ele.snapshotItem(i);
        return /:visible$/.test(xpath) ? array.filter(e => e.offsetHeight) : array;
      } catch (e) { popup3(e + "\n" + xpath, 1); return []; }
    }

    function eleget0(xpath, node = document) {
      if (!xpath) return null;
      if (!/^\.?\//.test(xpath)) return node.querySelector(xpath.replace(/:visible$/, ""));
      try {
        var ele = document.evaluate("." + xpath.replace(/:visible$/, ""), node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        return ele.snapshotLength > 0 ? ele.snapshotItem(0) : "";
      } catch (e) { popup3(e + "\n" + xpath, 1); return null; }
    }
  */
  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);
  }

  function domsort(container, doms, func, prepend = 0) { // prepend:1ならcontainerの最初に付ける、0なら最後に付ける
    doms.map(function(v) { return { dom: v, value: func(v) } }).sort(function(a, b) { return (typeof Number(a.value) && Number(b.value) ? (b.value - a.value) : (a.value < b.value ? 1 : -1)) }).forEach(function(v) { prepend ? container.prepend(v.dom) : container.appendChild(v.dom); });
  }

  function lh(re) { let tmp = location.href.match(re); if (!tmp) { return null } else if (tmp.length > 1) { return tmp[1] } else return tmp[0] } // gフラグ不可
  function before(e, html) { e?.insertAdjacentHTML('beforebegin', html); return e?.previousElementSibling; }

  function begin(e, html) { e?.insertAdjacentHTML('afterbegin', html); return e?.firstChild; }

  function end(e, html) { e?.insertAdjacentHTML('beforeend', html); return e?.lastChild; }

  function after(e, html) { e?.insertAdjacentHTML('afterend', html); return e?.nextElementSibling; }


})();