Difference between revisions of "User:JP/common.js"
| Line 105: | Line 105: | ||
Description: Makes maintenance templates such as {cleanup} appear smaller so that they take up less space. | Description: Makes maintenance templates such as {cleanup} appear smaller so that they take up less space. | ||
*/ | */ | ||
| + | // ==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 } | ||
| + | ); | ||
| + | }); | ||
Revision as of 16:15, 3 August 2016
// ==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("<", "<")+
"<br>"+"<b>Hidden properties: </b>" + (hiddenPropertiesDisplay).replace("<", "<");
}
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==
// @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 }
);
});