// ==UserScript== // @name Syosetu Chapter Copy // @namespace ultrabenosaurus.Syosetu // @version 0.6 // @description Copy the chapter content from a Syosetu chapter page. // @author Ultrabenosaurus // @source https://greasyfork.org/en/users/437117-ultrabenosaurus?sort=name // @match https://ncode.syosetu.com/*/*/ // @grant GM.setClipboard // @grant GM_setClipboard // @downloadURL none // ==/UserScript== (function() { 'use strict'; var maxChars = 5000; // 5000 = DeepL free user max characters. Also set at the start of the UBsyosetuChapterCopyPart() function. var mobile = 0; let txtBox = document.createElement("textarea"); txtBox.id = "UBsyosetuChapterContent"; txtBox.name = "UBsyosetuChapterContent"; txtBox.style = "width: 0; height: 0; border: none;"; document.body.appendChild(txtBox); var subTitle = document.querySelectorAll('div#novel_color p.novel_subtitle'); if(subTitle.length == 0) { mobile = 1; subTitle = document.querySelectorAll('div#novel_color div.novel_subtitle'); } txtBox.value = (mobile ? subTitle[0].innerText.split("\n")[1] : subTitle[0].textContent) + "\n\n" + document.querySelectorAll('div#novel_honbun')[0].textContent; var charCount = txtBox.value.length; var btnElem = "
"; if( charCount > maxChars ) { btnElem += " "; } subTitle[0].insertAdjacentHTML("beforeend", btnElem); var sccwBtn = document.getElementById('UBsyosetuChapterCopyWhole'); if(sccwBtn){ sccwBtn.addEventListener("click", UBsyosetuChapterCopyWhole, false); } var sccpBtn = document.getElementById('UBsyosetuChapterCopyPart'); if(sccpBtn){ sccpBtn.addEventListener("click", UBsyosetuChapterCopyPart, false); } maxChars = mobile = sccwBtn = sccpBtn = btnElem = txtBox = subTitle = charCount = null; })(); function UBsyosetuChapterCopyWhole() { let txtBox = document.getElementById('UBsyosetuChapterContent'); txtBox.select(); txtBox.setSelectionRange(0, 999999); document.execCommand("copy"); txtBox = null; } function UBsyosetuChapterCopyPart() { var maxChars = 5000; var copyBtn = document.getElementById('UBsyosetuChapterCopyPart'); var chpPart = parseInt( copyBtn.value.split(": ")[1].split(" of ")[0] ); var lastPart = parseInt( copyBtn.value.split(": ")[1].split(" of ")[1] ); //console.log( chpPart, typeof chpPart ); let txtBox = document.getElementById('UBsyosetuChapterContent'); var maxBlocks = Math.ceil( txtBox.value.length / maxChars ); if( maxBlocks >= chpPart ) { var selRngStart = ( chpPart - 1 ) * maxChars; var selRngEnd = chpPart * maxChars; txtBox.select(); txtBox.setSelectionRange( selRngStart, selRngEnd ); document.execCommand("copy"); copyBtn.value = copyBtn.value.split(": ")[0] + ": " + ( chpPart + 1 ) + " of " + lastPart; } else { copyBtn.value = copyBtn.value.split(": ")[0] + ": 1 of " + lastPart; alert("You have already finished this chapter. Click again to start copying from the first block."); } maxChars = maxBlocks = copyBtn = chpPart = lastPart = selRngStart = selRngEnd = txtBox = null; } //