Tumblr Archive Reblog Remover

Make browsing Tumblr archives easier.

// ==UserScript==
// @name        Tumblr Archive Reblog Remover
// @author      Arnold François Lecherche
// @namespace   greasyfork.org
// @icon        https://www.tumblr.com/favicon.ico
// @version     0.1.2
// @description Make browsing Tumblr archives easier.
// @include     http://*.tumblr.com/archive/*
// @include     https://*.tumblr.com/archive/*
// @include     http://*.tumblr.com/archive
// @include     https://*.tumblr.com/archive
// @exclude     http://www.tumblr.com/*
// @exclude     https://www.tumblr.com/*
// @grant       none
// @run-at      document-start
// @copyright 2016 Arnold François Lecherche
// ==/UserScript==
/* jshint -W097 */
;(function setup(D, E, O, M, Date, undefined) {
  'use strict';
  var remove = function (node) {
    if (typeof E.prototype.remove === 'function') remove = function remove(node) {return node.remove();};
    else remove = function remove(node) {return node.parentNode.removeChild(node);};
    return remove(node);
  }, swiftRemove = function swiftRemove() {
    var now = Date.now();
    if (now - check < 100) return;
    check = now;
    fake[0].addedNodes = archive.querySelectorAll('.not_mine.is_reblog');
    removeReblogs(fake);
  }, observerConfig = {
    attributes: false,
    characterData: false,
    childList: true,
    subtree: true
  }, hiddenKey = typeof Symbol !== 'undefined' ? Symbol('hidden') : '$hidden$' + M.random() + '$',
    observer = new MutationObserver(removeReblogs), d = {value: true}, check = Date.now(),
    fake = [{addedNodes:null}], archive, r;
  function clearChildren(node) {
    var nod;
    node.style.display = 'none';
    while ((nod = node.firstChild)) remove(nod);
    O.defineProperty(node, hiddenKey, d);
  }
  function removeReblogs(mutations) {
    observer.stop();
    var i = mutations.length, nodes, node, j, nc;
    while (i--) {
      nodes = mutations[i].addedNodes;
      j = nodes.length;
      while (j--) {
        node = nodes[j];
        if (node[hiddenKey]) continue;
        nc = node.classList;
        if (nc.contains('not_mine') && nc.contains('is_reblog')) clearChildren(node);
      }
    }
    observer.start();
  }
  function init() {
    D.removeEventListener('DOMContentLoaded', init, false);
    archive = D.querySelector('.l-content');
    observer.start();
  }
  observer.start = function () {
    observer.start = observer.observe.bind(observer, archive, observerConfig);
    observer.start();
    swiftRemove();
  };
  observer.stop = observer.disconnect.bind(observer);
  r = D.readyState;
  if (r === 'complete' || r === 'loaded' || r === 'interactive') init();
  else D.addEventListener('DOMContentLoaded', init, false);
  D.addEventListener('keydown', swiftRemove, true);
  D.addEventListener('scroll', swiftRemove, true);
  D.addEventListener('click', swiftRemove, true);
})(document, Element, Object, Math, Date);