]> git.rmz.io Git - dotfiles.git/blob - dwb/greasemonkey/wikipedia.table.filter.user.js
2b42d7c10603360fa81a06835b57b91a4264ca37
[dotfiles.git] / dwb / greasemonkey / wikipedia.table.filter.user.js
1 // ==UserScript==
2 // @name Wikipedia Table filter
3 // @namespace benibela
4 // @include https?://*.wikipedia.org/wiki/*
5 // ==/UserScript==
6
7
8 var tables = document.getElementsByClassName("wikitable");
9 var hiddenLists = new Array();
10 var hiddenNames = new Array();
11 var hiddenPropertiesDisplay = "";
12
13 if (tables.length > 0) {
14
15 function stringContains(str, list) {
16 for (var i=0;i<list.length;i++)
17 if (str == list[i] || (list[i] > 3 && str.indexOf(list[i]) >= 0)) return true;
18 return false;
19 }
20
21 function arrayIndexOf(ar, v) {
22 for (var i=0;i<ar.length;i++) if (ar[i] == v) return i;
23 return -1;
24 }
25 function arrayContains(ar, v) {
26 for (var i=0;i<ar.length;i++) if (ar[i] == v) return true;
27 return false;
28 }
29
30 function updateHideText(){
31 for (var i=0;i<hiddenLists.length;i++)
32 hiddenLists[i].innerHTML = "<b>Hidden names:</b> " + (hiddenNames.join(", ")).replace("<", "&lt;")+
33 "<br>"+"<b>Hidden properties: </b>" + (hiddenPropertiesDisplay).replace("<", "&lt;");
34 }
35 function updateHide(){
36 for (var i=0;i<tables.length;i++) {
37 for (var r=0;r<tables[i].rows.length;r++)
38 if (tables[i].rows[r].cells[0] && ( stringContains(tables[i].rows[r].cells[0].textContent, hiddenNames)) )
39
40 tables[i].rows[r].style.display="none";
41 }
42 updateHideText();
43 }
44
45 function newButton(){
46 var deleteThis = document.createElement("a");
47 deleteThis.textContent = "x";
48 deleteThis.addEventListener("click", function(e){
49 var cell = e.target.parentNode;
50 var row = cell.parentNode;
51 if (cell == row.cells[0]) {
52 if (cell.textContent == "x") {
53 row.style.display = "none"; //empty row (repeated table headers, wikipedias idea of filtering)
54 } else if (!arrayContains(hiddenNames, cell.textContent)) {
55 hiddenNames.push(cell.textContent);
56 updateHide();
57 }
58 } else if (row.parentNode.nodeName == "THEAD" || row.parentNode.nodeName == "TFOOT"
59 || (row.parentNode.nodeName == "TBODY" && row.parentNode.parentNode.rows[0] == row)) {
60 if (hiddenPropertiesDisplay != "") hiddenPropertiesDisplay += ", ";
61 hiddenPropertiesDisplay += " Column("+cell.textContent+") ";
62
63 var table = row.parentNode.parentNode; //tbody actually
64 var pos = arrayIndexOf(row.cells,cell);
65 for (var i=0;i<table.rows.length;i++)
66 table.rows[i].cells[pos].style.display = "none";
67 } else {
68 var table = row.parentNode; //tbody actually
69 var pos = arrayIndexOf(row.cells,cell);
70 var remove = cell.textContent;
71 for (var i=0;i<table.rows.length;i++)
72 if (table.rows[i].cells[pos] && table.rows[i].cells[pos].textContent == remove) {
73 if (!arrayContains(hiddenNames, table.rows[i].cells[0].textContent))
74 hiddenNames.push(table.rows[i].cells[0].textContent);
75 }
76 if (hiddenPropertiesDisplay != "") hiddenPropertiesDisplay += ", ";
77 if (table.nodeName == "TBODY") table = table.parentNode;
78 hiddenPropertiesDisplay += table.rows[0].cells[pos].textContent + " = " + remove.substr(0, remove.length-1);
79
80 updateHide();
81 }
82 });
83 deleteThis.className = "delete-this-button";
84 return deleteThis;
85 }
86
87 setTimeout(function(){
88 for (var i=0;i<tables.length;i++) {
89 for (var r=0;r<tables[i].rows.length;r++)
90 for (var c=0;c<tables[i].rows[r].cells.length;c++) {
91 tables[i].rows[r].cells[c].appendChild(newButton());
92 }
93 var temp = document.createElement("div");
94 tables[i].parentNode.insertBefore(temp, tables[i].nextSibling);
95 hiddenLists.push(temp);
96 }}, 100);
97
98 var head = document.getElementsByTagName("head")[0];
99 var ele = head.appendChild(window.document.createElement("style"));
100 ele.innerHTML = ".delete-this-button {flush: right; display: inline-block; 0; bottom: 0; color: red; cursor: pointer}";
101
102 }