小説家になろう 最新話

最新の10話と前後の話数を表示する

  1. // ==UserScript==
  2. // @name 小説家になろう 最新話
  3. // @description 最新の10話と前後の話数を表示する
  4. // @version 1.1
  5. // @namespace none
  6. // @match https://*.syosetu.com/n*
  7. // @grant none
  8. // ==/UserScript==
  9.  
  10. add_style();
  11. show_latest();
  12. show_current();
  13.  
  14. function add_style() {
  15. let css = `
  16. .p-eplist-ex {border: 1px solid rgba(150,150,150,0.5); background: rgba(200,200,200,0.15);}
  17. .p-eplist-ex.scroll {width: 740px; height: 240px; margin: 15px auto; box-sizing: border-box; overflow-y: scroll; position: relative;}
  18. .p-eplist-ex .p-eplist__chapter-title {margin: 12px 12px 6px 12px;}
  19. .p-eplist-ex .p-eplist__sublist {display: flex; align-items: center; border: unset; margin: unset;}
  20. .p-eplist-ex .p-eplist__sublist:hover {background: rgba(150,150,150,0.15);}
  21. .p-eplist-ex .p-eplist__sublist .p-eplist__subtitle {flex-grow: 1; padding: 8px 16px;}
  22. .p-eplist-ex .p-eplist__sublist .p-eplist__update {padding: 8px 0px;}
  23.  
  24. .p-eplist-ex .p-eplist__sublist.current a {font-weight: bold; pointer-events: none;}
  25. .p-eplist-ex .p-eplist__sublist.current a:visited {color: black;}
  26. body.js-customlayout2 .p-eplist-ex .p-eplist__sublist.current a:visited,
  27. body.js-customlayout3 .p-eplist-ex .p-eplist__sublist.current a:visited {color: white;}
  28. `;
  29. document.head.insertAdjacentHTML('beforeend', `<style>${css}</style>`);
  30. }
  31.  
  32. async function show_latest() {
  33. let pager_box = document.querySelector('div.c-pager__pager');
  34. let pager_first = !document.querySelector('a.c-pager__item--first');
  35. if (pager_box && pager_first) {
  36. let last = document.querySelector('a.c-pager__item--last');
  37. let last_doc = await fetch_doc(last.href);
  38. let latest = Array.from(last_doc.querySelectorAll('.p-eplist__sublist')).slice(-10);
  39. if (latest.length < 10) {
  40. let prev = last_doc.querySelector('a.c-pager__item--before');
  41. let prev_doc = await fetch_doc(prev.href);
  42. latest = Array.from(prev_doc.querySelectorAll('.p-eplist__sublist')).slice(latest.length - 10).concat(latest);
  43. }
  44. document.querySelector('#novel_ex').insertAdjacentHTML('afterend', '<div class="p-eplist-ex"><div class="p-eplist__chapter-title">最新話</div></div>');
  45. while (latest.length) document.querySelector('.p-eplist-ex').appendChild(latest.pop());
  46. }
  47. }
  48.  
  49. async function show_current() {
  50. let novel_bn = document.querySelector('.c-pager--center');
  51. if (novel_bn) {
  52. novel_bn.insertAdjacentHTML('beforebegin', '<div class="p-eplist-ex scroll"></div>');
  53. let novel_ep = document.querySelector('.p-eplist-ex');
  54. let [ncode, ep_num] = location.pathname.split('/').filter(n => n);
  55. let index = (ep_num - 1) % 100;
  56. let page = Math.ceil(ep_num / 100);
  57. let doc = await fetch_doc(`/${ncode}/?p=${page}`);
  58. let lists = Array.from(doc.querySelectorAll('.p-eplist__sublist'));
  59. lists[index].classList.add('current');
  60. if (index < 10 && ep_num > 100) {
  61. let doc = await fetch_doc(`/${ncode}/?p=${page - 1}`);
  62. lists = Array.from(doc.querySelectorAll('.p-eplist__sublist')).concat(lists);
  63. }
  64. if (index > 90 && doc.querySelector('.c-pager__item--next')) {
  65. let doc = await fetch_doc(`/${ncode}/?p=${page + 1}`);
  66. lists = lists.concat(Array.from(doc.querySelectorAll('.p-eplist__sublist')));
  67. }
  68. lists.forEach(ep => novel_ep.appendChild(ep));
  69. let current = document.querySelector('.current');
  70. novel_ep.scrollTop = current.offsetTop + current.clientHeight / 2 - novel_ep.clientHeight / 2;
  71. }
  72. }
  73.  
  74. async function fetch_doc(url) {
  75. let text = await (await fetch(url, {credentials: "same-origin"})).text();
  76. let doc = new DOMParser().parseFromString(text, 'text/html');
  77. return doc;
  78. }

QingJ © 2025

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