小説家になろうを縦書きで表示

Let's Become a Novelist read with a vertical writing mode

  1. // ==UserScript==
  2. // @name 小説家になろうを縦書きで表示
  3. // @license MIT
  4. // @namespace https://gf.qytechs.cn/zh-TW/scripts/447050-let-s-become-a-novelist-read-with-a-vertical-writing-mode
  5. // @version 2.1
  6. // @description Let's Become a Novelist read with a vertical writing mode
  7. // @author avan
  8. // @match ncode.syosetu.com/*
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. const reHeadNav = () => {
  13. const headNav = document.querySelector(".c-menu__body") //#head_nav
  14. const novlBns = document.querySelectorAll(".c-pager") //.novel_bn
  15. const links = novlBns[0].querySelectorAll("a")
  16. links.forEach(element => {
  17. element.className="c-menu__item c-menu__item--headnav"
  18. headNav.appendChild(element)
  19. });
  20. headNav.style.width="60rem"
  21. }
  22.  
  23. const replaceContents = () => {
  24. const contents = document.querySelector("div.p-novel__body") //div#novel_color
  25. contents.innerHTML = contents.innerHTML.replace(/\…/g,"..").replace(/\※/g,"*").replace(/\―/g,"。")
  26. document.querySelectorAll("div.p-novel__body p").forEach(item => {
  27. if (item.innerHTML.length == 0) return
  28. if (item.querySelectorAll("a[href],img[src]").length > 0) return
  29. item.innerHTML = item.innerHTML.replace(/0/g,"0").replace(/1/g,"1").replace(/2/g,"2").replace(/3/g,"3").replace(/4/g,"4").replace(/5/g,"5").replace(/6/g,"6").replace(/7/g,"7").replace(/8/g,"8").replace(/9/g,"9")
  30. item.innerHTML = item.innerHTML.replace(/,/g,",")
  31. })
  32. }
  33.  
  34. const vertical = () => {
  35. const windowWidth = window.innerWidth*0.9
  36. const windowHeight = window.innerHeight*0.8
  37. const container = document.querySelector(".l-main")
  38. container.style.width = "100%"
  39. const novelHonbun = document.querySelector(".p-novel__body")
  40.  
  41. const styles = {
  42. 'width': windowWidth+"px",
  43. 'height': windowHeight+"px",
  44. '-ms-writing-mode': 'tb-rl',
  45. 'writing-mode': 'vertical-rl',
  46. 'overflow-x': 'scroll',
  47. 'padding': '10px',
  48. 'margin':'0 auto',
  49. 'left':'0',
  50. 'right':'0',
  51. };
  52. Object.assign(novelHonbun.style,styles)
  53.  
  54. window.addEventListener('keydown', function(e){
  55. if(e.keyCode === 33 || e.keyCode === 38){ //page up、up
  56. e.preventDefault()
  57. scrollLeft(novelHonbun, "up")
  58. } else if(e.keyCode === 32 || e.keyCode === 34 || e.keyCode === 40){ //space、page down、down
  59. e.preventDefault()
  60. scrollLeft(novelHonbun, "down")
  61. } else if(e.keyCode === 37){ //left
  62. e.preventDefault();
  63. scrollLeft(novelHonbun, "down", 100)
  64. } else if(e.keyCode === 39){ //right
  65. e.preventDefault()
  66. scrollLeft(novelHonbun, "up", 100)
  67. }
  68. });
  69.  
  70. novelHonbun.addEventListener('mousewheel', function(e){
  71. e.preventDefault()
  72. if(e.wheelDelta > 0) scrollLeft(novelHonbun, "up")
  73. else scrollLeft(novelHonbun, "down")
  74. });
  75.  
  76. novelHonbun.addEventListener('click', function(e) {
  77. var xPosition = e.layerX
  78. var yPosition = e.layerY
  79. if (xPosition > windowWidth) {
  80. scrollLeft(novelHonbun, "up")
  81. } else if (xPosition < windowWidth*0.1) {
  82. scrollLeft(novelHonbun, "down")
  83. }
  84. console.log("x:" + xPosition + ", y:" + yPosition)
  85. });
  86. }
  87.  
  88. const scrollLeft = (element, type, value) => {
  89. if (!value || value <= 0) value = element.clientWidth*0.9
  90. if (!type) type = "down"
  91. if (type === "up") element.scrollLeft += value //up
  92. else if (type === "down") element.scrollLeft -= value //down
  93. }
  94.  
  95. (function() {
  96. reHeadNav()
  97. replaceContents()
  98. vertical()
  99. })()

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址