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