User:Maniwar/auto.js

// $Id: autoedit.js 1377 2006-08-23 08:43:24Z quarl $

// autoedit.js - tab menu & framework for automatically editing // wiki pages

// SYNOPSIS: //   var myeditor = new $autoedit('myeditor', 'MyEdit', 'ca-myedit', 'Do my edits', 'Edit summary prefix'); //   myeditor.initData = function { this.foo=5; } /* optional */ //   myeditor.splitText = function(s) { return s.split('\n'); } /* optional */ //   myeditor.buildRegExp = function { return /foo/ } //   myeditor.replaceRegExp = function(s) { return + "("+s+")" }

// USER USAGE: //   myeditor.widgetLoad;

// quarl 2006-02-08 initial version, refactoring *_canonicalize.js scripts

var $autoedit = new Module('autoedit.js'); $autoedit.depend('wikipage.js','wikiedit.js', 'util.js',                'wikiwidget.js', 'token.js');

$autoedit.editors = {};

$autoedit.options = { submitButton : 'wpDiff' };

// auto edit if query string asks us to (more commonly this is not necessary; // user will invoke through tab) $autoedit.load = function { var v = WikiDocument.queryVars['autoedit']; if (!v) return;

var autoeditor = $autoedit.editors[v]; if (!autoeditor || !autoeditor.varname) { $autoedit.error("$autoedit: invalid autoeditor! (error ae2a3784-7daf-49fb-9c6c-b68a7f28dc63)"); return; }

if (WikiDocument.queryVars['auth'] != autoeditor._makeAuthToken(wikiPage)) { $autoedit.error("$autoedit: invalid auth token! (error a1908c50-620b-4104-bcfa-881ecf094442)"); return; }

setTimeout(function{autoeditor.run;}, 50); }

$autoedit._getMenu = function { if (!$autoedit._menuAutoEdit) { $autoedit._menuAutoEdit = $wikiwidget.addTabMenu('AutoEdit', 'mn-autoedit'); }   return $autoedit._menuAutoEdit; }

$autoedit.AutoEditor = function(varname, name, id, title, summaryPrefix) { this.varname = varname; this.summaryPrefix = summaryPrefix; this.name = name; this.id = id; this.title = title;

this.widgetLoad = $util.bindThis(this, this.widgetLoad_);

$autoedit.editors[varname] = this; };

$autoedit.AutoEditor.prototype = { widgetLoad_ : function(location) { var me = this; if (!(me instanceof $autoedit.AutoEditor)) { $autoedit.error("widgetLoad: need AutoEditor instance (error 87bd9bfd-7ff6-4577-a59c-488936fa536c)"); return; }       $util.addOnloadHook(function {                if (wikiPage.nsSpecialP) return;                if (wikiDoc.protectedP) return;

this.widget = new WikiWidget({default_location: $autoedit._getMenu,                                             onclick: $util.bindThis(me, me.run),                                              // href: me.makeEditUrl(wikiPage),                                              name: me.name, id: me.id, title: me.title}); this.widget.add(location); });   },

_makeAuthToken: function(wp) { return $token.makeAuthToken('autoedit', this.varname, wp.page); },

makeEditUrl : function(wp) { return (wp.qurl + '&action=edit&autoedit=' + this.varname + '&auth=' +               this._makeAuthToken(wp)); },

run : function { this.initData; $util.buttonShowStatus(this.tab); wikiPage.getEditorAsync(this._edit0, this); return false; },

_edit0 : function(editor, this_) { this_._edit1(editor); },

_edit1 : function(editor) { var result = ''; var input = editor.wpTextbox1; var changes = [];

var inputs = this.splitText(input);

var result = this.editStrings(inputs, changes);

$util.buttonRestoreStatus(this.tab); if (changes.length) { editor.wpTextbox1 = result; editor.wpSummary = this.summaryPrefix + ': ' + changes.join('; '); editor.wpMinoredit = true; editor.submit($autoedit.options.submitButton); } else { alert("No changes to make!"); }   },

initData : function { /* TO BE OVERRIDDEN */ // default: nothing to initialize },

splitText : function(s) { /* TO BE OVERRIDDEN */ // default: don't split at all return [s]; },

editStrings : function(inputs, changes) { for (var i in inputs) { inputs[i] = this.editString(inputs[i], changes); }       return inputs.join(''); },

editString : function(input, changes) { /* TO BE OVERRIDDEN */ return this.regexpEditString(input, changes); },

regexpEditString : function(input, changes) { var result = '';

var regexp = this.buildRegExp; var m;       while ((m=input.match(regexp))) { result += RegExp.leftContext;

// This descriptor is passed in for input as well as taken as output. //           // LEFT is the text on the left of the match; TEXT is the text itself; // RIGHT is the text on the right of the match. All 3 can be modified. //           // Return value of replaceRegExp overrides d.text if non-null -- // it's simply a convenience feature.

var d = { left: result, text: m[0], right: RegExp.rightContext };

var dresult = this.replaceRegExp(d, m); if (dresult != null) { d.text = dresult; }

if (d.text != m[0]) { changes.push('"'+m[0]+'"' + ' â†’ ' +'"'+d.text+'"'); }           result = d.left + d.text; input = d.right; }       result += input; return result; },

buildRegExp : function { $autoedit.error("## $autoedit.AutoEditor.buildRegExp not overridden! (38c826f0-9f24-4ce2-9708-567d8e55a7c5)"); },

replaceRegExp : function(d, match) { // d.left // d.text // d.right $autoedit.error("## $autoedit.AutoEditor.replaceRegExp not overridden! (1a791fee-8020-453f-adb1-df3c69dc6828)"); },

// $autoedit._findCategoryContentTable = function { //    var tables = document.getElementsByTagName('table'); //    for (var i = 0; i < tables.length; ++i) { //        var table = tables[i]; //        if (table.previousSibling.textContent.match(/^There are/)) { //            return table; //        }    //     }    //     return false; // }

// prefix [varname] buttons before all wikilinks. Good for category pages. addAutoEditButtons : function { // if (!wikiPage.nsCategoryP) return;

// var table = $autoedit._findCategoryContentTable; // if (!table) return;

var d = document.getElementById('bodyContent');

var links = $util.copyArray(d.getElementsByTagName('a')); for (var i = 0; i < links.length; ++i) { var link = links[i]; if (!link.href || !link.href.match(/\/wiki\//)) continue; if (link.href.match(/#/)) continue; if (link.className.match(/external/)) continue; var wp = new WikiPage(link); var url = this.makeEditUrl(wp);

var span = document.createElement('span'); span.innerHTML = '['+this.varname+'] '; $util.addNodeBefore(link, span); }   } };

$util.addOnloadHook($autoedit.load);