// ==UserScript==
// @name AO3 Remove Double-Spacing
// @namespace ao3-remove-double-spacing
// @version 1.3
// @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*