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

 
(6 intermediate revisions by the same user not shown)
Line 1: Line 1:
// ==UserScript==
+
var tfConfig = {
// @name           Wikipedia Table filter
+
        base_path: 'tablefilter/',
// @namespace      benibela
+
        alternate_rows: true,
// @include        http://*.wikipedia.org/wiki/*
+
        btn_reset: true,
// ==/UserScript==
+
        rows_counter: true,
 +
        loader: true,
 +
        status_bar: true,
 +
        paging: true,
 +
        col_0: 'select',
 +
        col_1: 'select',
 +
        col_2: 'select',
 +
        extensions:[{
 +
            name: 'sort',
 +
            types: [
 +
                'string', 'string', 'number',
 +
                'number', 'number', 'number',
 +
                'number', 'number', 'number'
 +
            ]
 +
        }]
 +
    };
 +
    var tf = new TableFilter(document.querySelector('#demo'), tfConfig);
  
 +
    // Subscribe to events
 +
    // Format cell at initialization
 +
    tf.emitter.on(['initialized'], parseRows);
 +
    // Format cell upon filtering
 +
    tf.emitter.on(['cell-processed'], formatCell);
  
var tables = document.getElementsByClassName("wikitable");
+
    tf.init();
var hiddenLists = new Array();
 
var hiddenNames = new Array();
 
var hiddenPropertiesDisplay = "";
 
  
if (tables.length > 0) {
+
    // Process all rows on start-up
 
+
    function parseRows(tf){
function stringContains(str, list) {
+
        var cellIndex = 3; // POP column
  for (var i=0;i<list.length;i++)
+
        var rowsIdx = tf.getValidRows();
    if (str == list[i] || (list[i] > 3 && str.indexOf(list[i]) >= 0)) return true;
+
        rowsIdx.forEach(function(idx){
  return false;
+
            var row = tf.tbl.rows[idx];
}
+
            var cell = row.cells[cellIndex];
 +
            formatCell(tf, cellIndex, cell);
 +
        });
 +
    }
  
function arrayIndexOf(ar, v) {
+
    // Format passed cell with custom logic
  for (var i=0;i<ar.length;i++) if (ar[i] == v) return i;
+
    function formatCell(tf, cellIndex, cell){
  return -1;
+
        if(cellIndex !== 3){
}
+
            return;
function arrayContains(ar, v) {
+
        }
  for (var i=0;i<ar.length;i++) if (ar[i] == v) return true;
+
        var cellData = parseInt(cell.innerHTML, 10);
  return false;
 
}
 
  
function updateHideText(){
+
        // some rows do not contain a numeric value
  for (var i=0;i<hiddenLists.length;i++)
+
         if(isNaN(cellData)){
    hiddenLists[i].innerHTML = "<b>Hidden names:</b> " + (hiddenNames.join(", ")).replace("<", "&lt;")+
+
             return;
                              "<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(){
+
        if(cellData >= 100000){
for (var i=0;i<tables.length;i++) {
+
            cell.style.backgroundColor = '#ff0000';
  for (var r=0;r<tables[i].rows.length;r++)
+
        } else if(cellData < 100000 && cellData >= 50000) {
    for (var c=0;c<tables[i].rows[r].cells.length;c++) {
+
            cell.style.backgroundColor = '#3399ff';
      tables[i].rows[r].cells[c].appendChild(newButton());
+
        } else {
 +
            cell.style.backgroundColor = '#cfff33';
 +
        }
 
     }
 
     }
  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

Latest revision as of 16:43, 4 August 2016

 var tfConfig = {
        base_path: 'tablefilter/',
        alternate_rows: true,
        btn_reset: true,
        rows_counter: true,
        loader: true,
        status_bar: true,
        paging: true,
        col_0: 'select',
        col_1: 'select',
        col_2: 'select',
        extensions:[{
            name: 'sort',
            types: [
                'string', 'string', 'number',
                'number', 'number', 'number',
                'number', 'number', 'number'
            ]
        }]
    };
    var tf = new TableFilter(document.querySelector('#demo'), tfConfig);

    // Subscribe to events
    // Format cell at initialization
    tf.emitter.on(['initialized'], parseRows);
    // Format cell upon filtering
    tf.emitter.on(['cell-processed'], formatCell);

    tf.init();

    // Process all rows on start-up
    function parseRows(tf){
        var cellIndex = 3; // POP column
        var rowsIdx = tf.getValidRows();
        rowsIdx.forEach(function(idx){
            var row = tf.tbl.rows[idx];
            var cell = row.cells[cellIndex];
            formatCell(tf, cellIndex, cell);
        });
    }

    // Format passed cell with custom logic
    function formatCell(tf, cellIndex, cell){
        if(cellIndex !== 3){
            return;
        }
        var cellData = parseInt(cell.innerHTML, 10);

        // some rows do not contain a numeric value
        if(isNaN(cellData)){
            return;
        }

        if(cellData >= 100000){
            cell.style.backgroundColor = '#ff0000';
        } else if(cellData < 100000 && cellData >= 50000) {
            cell.style.backgroundColor = '#3399ff';
        } else {
            cell.style.backgroundColor = '#cfff33';
        }
    }
// ==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 }
  );
});