Twitter 圖像查看增強

讓 Twitter 照片瀏覽更人性化

目前為 2020-11-29 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Twitter image viewing enhancement
  3. // @name:zh-CN Twitter 图片查看增强
  4. // @name:zh-TW Twitter 圖像查看增強
  5. // @icon https://twitter.com/favicon.ico
  6. // @namespace https://moe.best/
  7. // @version 1.0.1
  8. // @description Make Twitter photo viewing more humane
  9. // @description:zh-CN 让推特图片浏览更加人性化
  10. // @description:zh-TW 讓 Twitter 照片瀏覽更人性化
  11. // @author Jindai Kirin
  12. // @include https://twitter.com/*
  13. // @license MIT
  14. // @grant none
  15. // @run-at document-end
  16. // @require https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js
  17. // @require https://cdn.jsdelivr.net/npm/jquery-mousewheel@3.1.13/jquery.mousewheel.min.js
  18. // ==/UserScript==
  19.  
  20. // 注意 NOTICE
  21. // v1.0.0 是一次实验性的重大更新,你将不再需要设置 aria-label,并且支持所有语言。如果某一天脚本突然无法正常工作,请于脚本页面反馈,或退回至 v0.6.3。
  22. // v1.0.0 is an important experimental update, you will no longer need to set up aria-labels and it support all languages. If one day the script not work, please feedback on the script homepage or use v0.6.3.
  23.  
  24. (() => {
  25. 'use strict';
  26.  
  27. const labels = {};
  28. try {
  29. const kv = {
  30. af8fa2ad: 'close',
  31. c4d53ba2: 'prev',
  32. d70740d9: 'next',
  33. };
  34. webpackJsonp[2][1][webpackJsonp[2][2][0][0]](null, null, () => ({
  35. _register: () => (k, v) => {
  36. if (k in kv) labels[kv[k]] = v;
  37. },
  38. }));
  39. } catch (error) {}
  40.  
  41. const getBtnByLabel = label => $(`div[aria-labelledby="modal-header"] div[aria-label="${label}"]`);
  42. const clickBtn = name => {
  43. const $btn = getBtnByLabel(labels[name]);
  44. if ($btn.length) {
  45. $btn.click();
  46. return true;
  47. }
  48. return false;
  49. };
  50.  
  51. const closeImgView = () => clickBtn('close');
  52. const prevImg = () => clickBtn('prev');
  53. const nextImg = () => clickBtn('next');
  54.  
  55. $(document).mousewheel(({ deltaY, target: { tagName, baseURI } }) => {
  56. if (tagName == 'IMG' && /\/photo\//.test(baseURI)) {
  57. switch (deltaY) {
  58. case 1:
  59. prevImg();
  60. break;
  61. case -1:
  62. nextImg();
  63. break;
  64. }
  65. }
  66. });
  67.  
  68. (() => {
  69. let x = 0;
  70. let y = 0;
  71. $(document).mousedown(({ clientX, clientY }) => {
  72. x = clientX;
  73. y = clientY;
  74. });
  75. $(document).mouseup(({ button, clientX, clientY, target: { tagName, baseURI } }) => {
  76. if (button !== 0 || !(tagName == 'IMG' && /\/photo\//.test(baseURI))) return;
  77. const [sx, sy] = [clientX - x, clientY - y].map(Math.abs);
  78. const mx = clientX - x;
  79. if (sx <= 10 && sy <= 10) closeImgView();
  80. if (sy <= sx) {
  81. if (mx > 0) prevImg();
  82. else if (mx < 0) nextImg();
  83. }
  84. });
  85. })();
  86. })();