Difference between revisions of "User:JP/common.js"

Line 1: Line 1:
// ==UserScript==
 
// @name          Wikipedia Table filter
 
// @namespace      benibela
 
// @include        http://*.wikipedia.org/wiki/*
 
// ==/UserScript==
 
 
 
var tables = document.getElementsByClassName("wikitable");
 
var hiddenLists = new Array();
 
var hiddenNames = new Array();
 
var hiddenPropertiesDisplay = "";
 
 
if (tables.length > 0) {
 
 
 
function stringContains(str, list) {
 
  for (var i=0;i<list.length;i++)
 
    if (str == list[i] || (list[i] > 3 && str.indexOf(list[i]) >= 0)) return true;
 
  return false;
 
}
 
 
function arrayIndexOf(ar, v) {
 
  for (var i=0;i<ar.length;i++) if (ar[i] == v) return i;
 
  return -1;
 
}
 
function arrayContains(ar, v) {
 
  for (var i=0;i<ar.length;i++) if (ar[i] == v) return true;
 
  return false;
 
}
 
 
function updateHideText(){
 
  for (var i=0;i<hiddenLists.length;i++)
 
    hiddenLists[i].innerHTML = "<b>Hidden names:</b> " + (hiddenNames.join(", ")).replace("<", "&lt;")+
 
                              "<br>"+"<b>Hidden properties: </b>" + (hiddenPropertiesDisplay).replace("<", "&lt;");
 
}
 
function updateHide(){
 
  for (var i=0;i<tables.length;i++) {
 
    for (var r=0;r<tables[i].rows.length;r++)
 
      if (tables[i].rows[r].cells[0] && ( stringContains(tables[i].rows[r].cells[0].textContent, hiddenNames)) )
 
     
 
        tables[i].rows[r].style.display="none";
 
  }
 
  updateHideText();
 
}
 
 
 
function newButton(){
 
  var deleteThis = document.createElement("a");
 
  deleteThis.textContent = "x";
 
  deleteThis.addEventListener("click", function(e){
 
    var cell = e.target.parentNode;
 
    var row = cell.parentNode;
 
    if (cell == row.cells[0]) {
 
      if (cell.textContent == "x") {
 
        row.style.display = "none";  //empty row (repeated table headers, wikipedias idea of filtering)
 
      } else if (!arrayContains(hiddenNames, cell.textContent)) {
 
        hiddenNames.push(cell.textContent);
 
        updateHide();
 
      }
 
    } else if (row.parentNode.nodeName == "THEAD" || row.parentNode.nodeName == "TFOOT"
 
              || (row.parentNode.nodeName == "TBODY" && row.parentNode.parentNode.rows[0] == row)) {
 
      if (hiddenPropertiesDisplay != "") hiddenPropertiesDisplay += ", ";
 
      hiddenPropertiesDisplay += " Column("+cell.textContent+") ";
 
     
 
      var table = row.parentNode.parentNode; //tbody actually
 
      var pos = arrayIndexOf(row.cells,cell);
 
      for (var i=0;i<table.rows.length;i++)
 
        table.rows[i].cells[pos].style.display = "none";
 
    } else {
 
      var table = row.parentNode; //tbody actually
 
      var pos = arrayIndexOf(row.cells,cell);
 
      var remove = cell.textContent;
 
      for (var i=0;i<table.rows.length;i++)
 
        if (table.rows[i].cells[pos] && table.rows[i].cells[pos].textContent == remove) {
 
          if (!arrayContains(hiddenNames, table.rows[i].cells[0].textContent))
 
            hiddenNames.push(table.rows[i].cells[0].textContent);
 
        }
 
      if (hiddenPropertiesDisplay != "") hiddenPropertiesDisplay += ", ";
 
      if (table.nodeName == "TBODY") table = table.parentNode;
 
      hiddenPropertiesDisplay += table.rows[0].cells[pos].textContent + " = " + remove.substr(0, remove.length-1);
 
     
 
      updateHide();
 
    }
 
  });
 
  deleteThis.className = "delete-this-button";
 
  return deleteThis;
 
}
 
 
setTimeout(function(){
 
for (var i=0;i<tables.length;i++) {
 
  for (var r=0;r<tables[i].rows.length;r++)
 
    for (var c=0;c<tables[i].rows[r].cells.length;c++) {
 
      tables[i].rows[r].cells[c].appendChild(newButton());
 
    }
 
  var temp = document.createElement("div");
 
  tables[i].parentNode.insertBefore(temp, tables[i].nextSibling);
 
  hiddenLists.push(temp);
 
}}, 100);
 
 
var head = document.getElementsByTagName("head")[0];
 
var ele = head.appendChild(window.document.createElement("style"));
 
ele.innerHTML = ".delete-this-button {flush: right; display: inline-block; 0; bottom: 0; color: red; cursor: pointer}";
 
 
}
 
/*
 
SMALLER TEMPLATES
 
Description: Makes maintenance templates such as {cleanup} appear smaller so that they take up less space.
 
*/
 
 
// ==UserScript==
 
// ==UserScript==
 
// @name        Wikitable filter
 
// @name        Wikitable filter

Revision as of 16:16, 3 August 2016

// ==UserScript==
// @name        Wikitable filter
// @description Filter for wiki tables using the jQuery tablesorter filter widget
// @include     *wiki*
// @grant       none
// @require     http://code.jquery.com/jquery-1.11.3.min.js
// @require     https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.22.1/js/jquery.tablesorter.min.js
// @require     https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.22.1/js/jquery.tablesorter.widgets.js
// @version     1.1
// @namespace https://greasyfork.org/users/12797
// ==/UserScript==

// Constants

SHOW_FILTERS_CLASS = "wikitable_show_filters";
FILTERED_CLASS = "wikitable_filter_filtered";

// Globals
style_initialised = false;

// Functions

showFilters = function() {
  var tbl = $(this).next(".wikitable");
  tbl.addClass("tablesorter");
  tbl.tablesorter({
    "widgets": ["filter"],
    "widgetOptions": {
      "filter_filteredRow": FILTERED_CLASS
    }
  });
  $(this).hide();
  return false;
}

addShowFiltersButton = function() {
  var btn = $("<button/>",
  { "type": "button",
    "class": SHOW_FILTERS_CLASS,
    "html": "\u2261 Filters" }
  );
  btn.click(showFilters);
  return btn;
}

initTables = function(tbl) {
  if (tbl.length > 0) {
    if (!style_initialised) {
      // Add our stylesheet
      var styleElem = document.createElement('style');
      document.head.appendChild(styleElem);
      styleSheet = styleElem.sheet;
      styleSheet.insertRule("tr."+FILTERED_CLASS+" { display: none; }", 0);
      style_initialised = true;
    }
    // Add button to show the filters
    tbl.before(addShowFiltersButton);
  }
}

// Main

// Check if there are wiki tables on this page in the first place
var tbl = $("table.wikitable");
// Initialise them (if necessary)
initTables(tbl.has("thead").has("tbody"));
// Register observer that initialises tables that were modified to fit our
// criteria.
var tblMutationObserver = new MutationObserver(function(mutations) {
  var mutatedNodes = new Array();
  mutations.forEach(function(mutation) {
    mutatedNodes.push(mutation.target);
  });
  var jqMutatedTbl = $(mutatedNodes);
  jqMutatedTbl = jqMutatedTbl.filter(".wikitable").has("thead").has("tbody");
  jqMutatedTbl = $.unique(jqMutatedTbl);
  // Do not initialise tables twice!
  jqMutatedTbl = jqMutatedTbl.not(".tablesorter");
  if (jqMutatedTbl.length <= 0) {
    return null;
  }
  console.log(jqMutatedTbl);
  initTables(jqMutatedTbl);
});
tbl.each(function(index, node) {
  tblMutationObserver.observe(
    // node to be observed
    node,
    // options
    { "childList": true }
  );
});