Expand quotes

Expand structured quotes into old-fashioned unstructured ones

As of 2014-12-08. See the latest version.

// ==UserScript==
// @name        Expand quotes
// @namespace   forum.pravda.com.ua
// @description Expand structured quotes into old-fashioned unstructured ones
// @include     http://forum.pravda.com.ua/index.php?topic=*
// @version     1.04
// @grant       none
// ==/UserScript==
var divs = document
  .getElementById('phorum')
  .getElementsByTagName('div');

for (var i = 0; i < divs.length; i++) {
  var div = divs[i];
  if (div.className == 'msg') {
    expandQuotes(div, 115);    
  }
}

function expandQuotes(element, wrapLimit) {
  var node = element.firstChild;
  while (node) {
    var next = node.nextSibling; 

    if (node.className == 'quoteheader') {
      var quoteheader = node;
      
      do {
        node = node.nextSibling;
      }
      while (node.nodeName.toLowerCase() != 'blockquote');
      var blockquote = node;

      do {
        node = node.nextSibling;
      }
      while (node.className != 'quotefooter');
      var quotefooter = node;

      node = node.nextSibling;

      element.removeChild(quoteheader);
      element.removeChild(blockquote);
      element.removeChild(quotefooter);

      var who_node = quoteheader.getElementsByTagName('b');
      var who = (who_node.length === 1) ? who_node[0].innerHTML : '';
      
      var what = expandQuotes(blockquote, wrapLimit - 5);
      
      var div = document.createElement('div');
      div.innerHTML = who + ' Написав:<br>-------------------------------------------------------<br>' + what;
      
      var innerNode = div.firstChild;
      while (innerNode) {
        var next = innerNode.nextSibling;
        div.removeChild(innerNode);
        element.insertBefore(innerNode, node);
        innerNode = next;
      }
      
      next = node.nextSibling;
    }
    else if (node.className == 'link') {
      element.removeChild(node)
    }
    node = next;
  }
  
  if (element.className != 'msg') {
    var text = quoteHtml(element.innerHTML, wrapLimit) + '\n';
    return text.replace(/\n/g, '<br>');
  }
}

function quoteHtml(htmlText, limit) {
  var text = '> ' + htmlText.trim()
    .replace(/&gt;/g, '>')
    .replace(/\s{2,}/g, ' ')
    .replace(/\r?\n|\r/g, '')
    .replace(/<br\s*[\/]?>\s*/gi, '\n> ')
    .replace(/(<([^>]+)>)/ig, '')
    .replace(/&nbsp;/ig, String.fromCharCode(160));

  var lines = text.split(/\r\n|\n|\r/);
  if (lines.length > 0 && lines[0] == '> ') {
    lines.splice(0, 1);
  }

  for (i = 0; i < lines.length; i++) {
    var j;
    var line = lines[i];
    lines[i] = '';
    while (line.length > limit) {
      j = (j = line.slice(0, limit + 1)
        .match(/\S*(\s)?$/))[1] ? limit : j.input.length - j[0].length || limit || j.input.length + (j = line.slice(limit)
        .match(/^\S*/))[0].length;
      lines[i] += line.slice(0, j) + ((line = line.slice(j)).length ? '\n> ' : '');
    }
    lines[i] += line;
  }
  return lines.join('\n');
}