토끼 뷰어

i,j,k 키를 눌러보세요

Verze ze dne 23. 10. 2023. Zobrazit nejnovější verzi.

  1. // ==UserScript==
  2. // @name 토끼 뷰어
  3. // @name:ko 토끼 뷰어
  4. // @name:en toki viewer
  5. // @description i,j,k 키를 눌러보세요
  6. // @description:ko i,j,k 키를 눌러보세요
  7. // @description:en press i to open
  8. // @version 231023123927
  9. // @match https://*.net/bbs/*
  10. // @match https://*.net/comic/*
  11. // @match https://*.com/webtoon/*
  12. // @author nanikit
  13. // @namespace https://greasyfork.org/ko/users/713014-nanikit
  14. // @connect *
  15. // @grant GM_getResourceText
  16. // @grant GM_getValue
  17. // @grant GM_setValue
  18. // @grant GM_xmlhttpRequest
  19. // @grant unsafeWindow
  20. // @require https://cdn.jsdelivr.net/npm/requirejs@2.3.6/require.js
  21. // @resource @stitches/react https://cdn.jsdelivr.net/npm/@stitches/react@1.3.1-1/dist/index.cjs
  22. // @resource fflate https://cdn.jsdelivr.net/npm/fflate@0.8.1/lib/browser.cjs
  23. // @resource jotai https://cdn.jsdelivr.net/npm/jotai@2.4.2/index.js
  24. // @resource jotai/react https://cdn.jsdelivr.net/npm/jotai@2.4.2/react.js
  25. // @resource jotai/react/utils https://cdn.jsdelivr.net/npm/jotai@2.4.2/react/utils.js
  26. // @resource jotai/utils https://cdn.jsdelivr.net/npm/jotai@2.4.2/utils.js
  27. // @resource jotai/vanilla https://cdn.jsdelivr.net/npm/jotai@2.4.2/vanilla.js
  28. // @resource jotai/vanilla/utils https://cdn.jsdelivr.net/npm/jotai@2.4.2/vanilla/utils.js
  29. // @resource react https://cdn.jsdelivr.net/npm/react@18.2.0/cjs/react.production.min.js
  30. // @resource react-dom https://cdn.jsdelivr.net/npm/react-dom@18.2.0/cjs/react-dom.production.min.js
  31. // @resource scheduler https://cdn.jsdelivr.net/npm/scheduler@0.23.0/cjs/scheduler.production.min.js
  32. // @resource vcv-inject-node-env data:,unsafeWindow.process=%7Benv:%7BNODE_ENV:%22production%22%7D%7D
  33. // @resource vim_comic_viewer https://greasyfork.org/scripts/417893-vim-comic-viewer/code/vim%20comic%20viewer.js?version=1268761
  34. // ==/UserScript==
  35. "use strict";
  36.  
  37. define("main", (require, exports, module) => {
  38. var import_vim_comic_viewer = require("vim_comic_viewer");
  39. async function main() {
  40. if (!location.origin.match(/manatoki|newtoki/)) {
  41. return;
  42. }
  43. const buttons = duplicateViewerButton();
  44. try {
  45. const controller = await (0, import_vim_comic_viewer.initialize)({ source: comicSource });
  46. for (const button of buttons) {
  47. button.addEventListener("click", async () => {
  48. await controller.toggleFullscreen();
  49. });
  50. }
  51. } catch (error) {
  52. console.log(error);
  53. }
  54. }
  55. function duplicateViewerButton() {
  56. const template = document.createElement("template");
  57. template.innerHTML = `<a class="show_viewer" alt="뷰어로 보기">
  58. <i class="ion-ios-book at-tip" aria-hidden="true" style="color: blue;"></i>
  59. </a>`;
  60. const templateButton = template.content.firstElementChild;
  61. const buttons = [];
  62. const divs = document.querySelectorAll(".toon-nav");
  63. for (const div of divs) {
  64. const button = templateButton.cloneNode(true);
  65. div.prepend(button);
  66. buttons.push(button);
  67. }
  68. return buttons;
  69. }
  70. function comicSource() {
  71. registerEpisodeNavigator();
  72. return getUrls();
  73. }
  74. function registerEpisodeNavigator() {
  75. addEventListener("keydown", (event) => {
  76. const { ctrlKey, shiftKey, altKey } = event;
  77. if (ctrlKey || shiftKey || altKey || import_vim_comic_viewer.utils.isTyping(event)) {
  78. return;
  79. }
  80. switch (event.key) {
  81. case "h":
  82. case "ArrowLeft":
  83. document.getElementById("goPrevBtn")?.click?.();
  84. break;
  85. case "l":
  86. case "ArrowRight":
  87. document.getElementById("goNextBtn")?.click?.();
  88. break;
  89. case "m":
  90. document.querySelector(".view-good")?.scrollIntoView({
  91. block: "center"
  92. });
  93. break;
  94. }
  95. });
  96. }
  97. function getUrls() {
  98. const imgs = document.querySelectorAll(
  99. "div.view-padding img"
  100. );
  101. const urls = [...imgs].flatMap(getUrl);
  102. return urls;
  103. }
  104. function getUrl(image) {
  105. if (image.offsetParent === null) {
  106. return [];
  107. }
  108. const data = Object.values(image.dataset);
  109. return data.length ? data : [image.src];
  110. }
  111. main();
  112.  
  113. });
  114.  
  115. define("tampermonkey_grants", function() { Object.assign(this.window, { GM, GM_getResourceText, GM_getValue, GM_setValue, GM_xmlhttpRequest, unsafeWindow }); });
  116. requirejs.config({ deps: ["tampermonkey_grants"] });
  117. for (const name of ["@stitches/react", "fflate", "jotai", "jotai/react", "jotai/react/utils", "jotai/utils", "jotai/vanilla", "jotai/vanilla/utils", "react", "react-dom", "scheduler", "vcv-inject-node-env", "vim_comic_viewer"]) {
  118. const body = GM_getResourceText(name);
  119. define(name, Function("require", "exports", "module", body));
  120. }
  121.  
  122. require(["main"], () => {}, console.error);