Greasy Fork

AO3 Remove Double-Spacing

Removes awkward double spaces between paragraphs on AO3.

目前为 2019-09-25 提交的版本。查看 最新版本

// ==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
// ==/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 <br />s with two)
  chapters.innerHTML = chapters.innerHTML.replace(/(<br\s*\/?>\s*){3,}/gi, '<br /><br />');

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

  // Remove unneeded <br>s between divs
  chapters.innerHTML = chapters.innerHTML.replace(/<\/\s*div>\s*(<br\s*\/?>\s*)+\s*<div/gi, '</div><div')

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

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

removeDoubleSpacing(document);