|
|
Line 1: |
Line 1: |
− | // ==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 }
| |
− | );
| |
− | });
| |