Splits long paragraphs at the period nearest to the split point.
当前为
// ==UserScript==
// @name Split Long Paragraphs
// @namespace http://tampermonkey.net/
// @version 1
// @description Splits long paragraphs at the period nearest to the split point.
// @match https://ranobes.top/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=ranobes.top
// @license MIT
// @grant none
// ==/UserScript==
(function() {
'use strict';
function ellipsize(s) {
return s.substring(0, 64).trim().replace(/[^\w\s\d]+$/, "") + "...";
}
const MAX_WORD_COUNT = 80;
const section = document.querySelector(".story #arrticle");
const nodes = Array.from(section.querySelectorAll('p'));
section.childNodes.forEach(child => {
if (child.nodeType === Node.TEXT_NODE) {
nodes.push(child);
}
})
let i = 0;
let node;
while (i < nodes.length) {
node = nodes[i];
const text = node.textContent.trim();
const words = text.split(/\s+/);
// Max word count before splitting
if (words.length > MAX_WORD_COUNT + Math.floor(MAX_WORD_COUNT / 2)) {
// Find closest split point to MAX_WORD_COUNT at a period
const sentences = text.split(/(?<=[^\.]\.)\s+/);
let sentenceIndex = 0;
let wordCount = 0;
for (const sentence of sentences) {
wordCount += sentence.split(/\s+/).length;
// console.log(`${ellipsize(sentence)} totalWordCount:${wordCount}`);
if (wordCount >= MAX_WORD_COUNT) {
break;
}
sentenceIndex += 1;
}
if (wordCount !== 0) {
console.log(`${ellipsize(text)} wordCount:${words.length} sentenceIndex:${sentenceIndex} totalSentences:${sentences.length}`);
node.textContent = '';
let p = document.createElement('p');
p.textContent = sentences.slice(0, sentenceIndex + 1).join(" ").trim();
node.parentNode.insertBefore(p, node);
p = document.createElement('p');
p.textContent = sentences.slice(sentenceIndex + 1).join(" ").trim();
node.parentNode.insertBefore(p, node);
nodes.push(p);
node.remove();
}
}
i += 1;
}
})();