// ==UserScript== // @name AO3 Remove Double-Spacing // @namespace ao3-remove-double-spacing // @version 1.4 // @description Removes awkward double spaces between paragraphs on AO3. // @author yuube // @match http*://*.archiveofourown.org/works/* // @match http*://*.archiveofourown.org/collections/*/works/* // @grant none // @downloadURL none // ==/UserScript== function removeDoubleSpacing (doc) { function hasMedia (el) { var hasImg = el.tagName === 'IMG' || el.querySelector('img') var hasEmbed = el.tagName === 'EMBED' || el.querySelector('embed') var hasIframe = el.tagName === 'IFRAME' || el.querySelector('iframe') var hasVideo = el.tagName === 'VIDEO' || el.querySelector('video') return !!(hasImg || hasEmbed || hasIframe || hasVideo) } function supposedToBeEmpty (el) { var hr = el.tagName === 'HR' || el.querySelector('hr') var br = el.tagName === 'BR' || el.querySelector('br') return !!(hr || br) } // Hide the given element if it has no text content. function hideEmptyElement (el) { var content = el.textContent && el.textContent.replace(/ /g, '').trim() if (!content) { // But, if it has no text because it contains media, // or if it's an element that's meant to be empty, don't hide. if (hasMedia(el) || supposedToBeEmpty(el)) { return } el.style.display = 'none' } } var chapters = doc.querySelector('#chapters') // Remove empty paragraphs chapters.querySelectorAll('p').forEach(hideEmptyElement); // Remove empty divs chapters.querySelectorAll('div').forEach(hideEmptyElement); // Remove empty spans chapters.querySelectorAll('span').forEach(hideEmptyElement); // Remove any other empty elements (only catches elements that are completely // empty, with no children) chapters.querySelectorAll(':empty').forEach(hideEmptyElement); // Remove excessive line breaks (replaces 3 or more
s with two) chapters.innerHTML = chapters.innerHTML.replace(/(\s*){3,}/gi, '

'); // Remove unneeded
s between paragraphs chapters.innerHTML = chapters.innerHTML.replace(/<\/\s*p>\s*(\s*)+\s*

s between divs chapters.innerHTML = chapters.innerHTML.replace(/<\/\s*div>\s*(\s*)+\s*

\s*(\s*)+\s*<\/\s*p>/gi, '


') // Cut down size of divs with only linebreaks in them chapters.innerHTML = chapters.innerHTML.replace(/
\s*()+\s*<\/\s*div>/gi, '

') // Remove pointless
s chapters.innerHTML = chapters.innerHTML.replace(/

\s*/gi, '

') }; removeDoubleSpacing(document);