User:Spike/watchgadget-v3.js

window.spike = window.spike || {}; spike.watchGadget = { cells: {}, uwLink: "u ", rwLink: "r ARTICLE (unwatched)",

init: function { var pn = mw.config.get('wgCanonicalSpecialPageName'); if ((pn != "Watchlist") && (pn != "Recentchanges")) { return }; // Load stuff mw.loader.using(['mediawiki.util', 'mediawiki.api.watch']); // Cosmetic tweaks //   $("A.mw-changeslist-history").text("hist"); $("A.mw-changeslist-groupdiff").each( function {      $(this).text($(this).text.replace(/\ changes/, "×"));      }); // Same change for entries on new articles with multiple edits ("10 changes" is not an element) $("TD.mw-changeslist-line-inner").each( function {      $(this).html($(this).html.replace(/\ changes/, "×"));      }); $("SPAN.mw-changeslist-separator").text("•"); // Replace photo with arrow for collapsible entries, for those of us running with images disabled // Just so I know where to click; am not going to try to make this modal $("TABLE.mw-collapsible SPAN.mw-collapsible-toggle").html("▶");

var gadget = spike.watchGadget; // Loop through every anchor that is the title of a wiki page $( ".mw-changeslist-title").each( function {     var obj = $( this ), article = obj.text; // Limit it further to buttons whose text is the article title (ignoring "hist" and "diff" links) // And when in RecentChanges, limit it to pages also on the Watchlist      if ((article == obj.attr("title")) && ((pn == "Watchlist") || (obj.closest("TABLE.mw-changeslist-line").hasClass("mw-changeslist-line-watched"))) )       { // Using encodeURIComponent below encodes pages with single or double quotes in the page title // to prevent premature string termination in uwLink and rwLink        ( gadget.cells[article] || ( gadget.cells[article] = [] )).push( $( $( gadget.uwLink.replace( /URI/, encodeURIComponent(article) ))           .insertBefore( this ).closest("td")) );       }      });    },

unwatch: function( article ) { new mw.Api.unwatch( article, function( response ) {} );

// Formulate a legend to replace the page name. var unwatchedLegend = spike.watchGadget.rwLink .replace(/URI/g,   encodeURIComponent(article)) .replace(/ARTICLE/, article); // Save the original entry (the entire line) at "oldHtml" and replace the page name with the new message // "this" is the table cell being manipulated $( spike.watchGadget.cells[article] ).each( function {       this.data("oldHtml", this.html).find("A.unwatchButton").closest("TD").html(unwatchedLegend);      }); }, rewatch: function( article ) { new mw.Api.watch( article, function( response ) {} ); // After "watch" returns, restore the table cell to its original state (before unwatching) $( spike.watchGadget.cells[article] ).each( function {     this.html(this.data("oldHtml"));      }); } }; $(document).ready(spike.watchGadget.init);