// ==UserScript== // @name FIMFiction - Unify Typography Style // @namespace Selbi // @include http*://*fimfiction.net/story/*/*/* // @include http*://*fimfiction.net/chapter/* // @version 1.4 // @grant none // @description Replaces all standard quotation marks, apostrophes, ellipsis, and line breaks with typographically “proper” variations // @downloadURL https://update.greasyfork.icu/scripts/411691/FIMFiction%20-%20Unify%20Typography%20Style.user.js // @updateURL https://update.greasyfork.icu/scripts/411691/FIMFiction%20-%20Unify%20Typography%20Style.meta.js // ==/UserScript== (function() { "use strict"; const TAG_PLACEHOLDER = "<$€%>"; // This'll do, hopefully let paragraphs = document.querySelectorAll("#chapter-body > div > *"); for (let p of paragraphs) { // Skip images if (p.childElementCount == 0 || p.textContent.trim().length > 0) { if (p.outerHTML.match(/^\s*\s*/)) { // Remove useless linebreaks p.parentElement.removeChild(p); } else if (p.textContent.match(/^\s*((\-|\_|\*|\=)\s*){3,}\s*$/gm)) { // Pretty chapter breaks (***** ->
) p.innerHTML = "
"; } else { // Strip the innerHTML of any tags (and back them up) so we won't interfere with anything inside them let text = p.innerHTML; let tagBackups = []; for (let match of text.matchAll(/<.*?>/g)) { tagBackups.push(match); text = text.replace(match, TAG_PLACEHOLDER); } // Apply the regex replacements to the text text = text // Remove excess spacing (" " -> " ") .replace("\s{2,}", " ") // Curly apostrophes (it's -> it’s) .replace(/\b\'\b/g, "’") // Curly quotation marks, single and double ("Hello!" -> “Hello!”) .replace(/(["“”])([^(\"|\“|\”)]*)(["“”])/g, "“$2”") .replace(/(\W)(['‘’])([^(\'|\‘|\’)]*)(['‘’])(\W)/g, "$1‘$3’$5") // Curly quotation marks on cut-off words (lookin' good -> lookin’ good) .replace(/\b\'\s/g, "’ ") .replace(/\s\'\b/g, " ‘") // Unicode ellipsis for regular ellipsis and spaced ellipsis (. . . -> …) .replace(/\s*\.\s?\.\s?\.(\s?)/g, "…$1") // Missing spaces after punctuation ("he said.Then" -> "he said. Then") .replace(/([a-z]{2,}[.,!?…])(\w|“)/g, "$1 $2") // Replace dashes were appropriate with em-dashes (-- -> —) .replace(/(\s–\s|\s?—\s?|\s-\s|\s?-{2,4}\s?)/g, "—"); // Restore the content inside the tags for (let backup of tagBackups) { text = text.replace(TAG_PLACEHOLDER, backup); } // Write the results p.innerHTML = text; } } } })();