<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Editor.js</id>
	<title>MediaWiki:Gadget-Editor.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Editor.js"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-Editor.js&amp;action=history"/>
	<updated>2026-04-10T19:02:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-Editor.js&amp;diff=475155&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-Editor.js&amp;diff=475155&amp;oldid=prev"/>
		<updated>2025-11-04T17:55:15Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:55, 4 November 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-Editor.js&amp;diff=475154&amp;oldid=prev</id>
		<title>wikt&gt;Ioaxxere: Remove console.trace</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-Editor.js&amp;diff=475154&amp;oldid=prev"/>
		<updated>2025-09-17T23:06:21Z</updated>

		<summary type="html">&lt;p&gt;Remove console.trace&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// This page consists of Editor and AdderWrapper&lt;br /&gt;
// Author: Conrad Irwin&lt;br /&gt;
/*jshint maxerr:1048576, strict:true, undef:true, latedef:true, es5:true */&lt;br /&gt;
/*global mw, jQuery, importScript, importScriptURI, $ */&lt;br /&gt;
window.PageEditor = function(title) {&lt;br /&gt;
	this.CheckOutForEdit = function() {&lt;br /&gt;
		return new mw.Api().get({&lt;br /&gt;
				action: &amp;#039;query&amp;#039;,&lt;br /&gt;
				prop: &amp;#039;revisions&amp;#039;,&lt;br /&gt;
				rvprop: [&amp;#039;ids&amp;#039;, &amp;#039;content&amp;#039;, &amp;#039;timestamp&amp;#039;],&lt;br /&gt;
				titles: String(title),&lt;br /&gt;
				formatversion: &amp;#039;2&amp;#039;,&lt;br /&gt;
				curtimestamp: true&lt;br /&gt;
			})&lt;br /&gt;
			.then(function(data) {&lt;br /&gt;
				var page, revision;&lt;br /&gt;
				if (!data.query || !data.query.pages) {&lt;br /&gt;
					return $.Deferred().reject(&amp;#039;unknown&amp;#039;);&lt;br /&gt;
				}&lt;br /&gt;
				page = data.query.pages[0];&lt;br /&gt;
				if (!page || page.missing) {&lt;br /&gt;
					return $.Deferred().reject(&amp;#039;nocreate-missing&amp;#039;);&lt;br /&gt;
				}&lt;br /&gt;
				revision = page.revisions[0];&lt;br /&gt;
				this.baserevid = revision.revid;&lt;br /&gt;
				this.basetimestamp = revision.timestamp;&lt;br /&gt;
				this.curtimestamp = data.curtimestamp;&lt;br /&gt;
				return revision.content;&lt;br /&gt;
			});&lt;br /&gt;
	}&lt;br /&gt;
	this.Save = function(newWikitext, params) {&lt;br /&gt;
		var editParams = typeof params === &amp;#039;object&amp;#039; ? params : {&lt;br /&gt;
			text: String(params)&lt;br /&gt;
		};&lt;br /&gt;
		return new mw.Api().postWithEditToken($.extend({&lt;br /&gt;
			action: &amp;#039;edit&amp;#039;,&lt;br /&gt;
			title: title,&lt;br /&gt;
			formatversion: &amp;#039;2&amp;#039;,&lt;br /&gt;
			text: newWikitext,&lt;br /&gt;
&lt;br /&gt;
			// Protect against errors and conflicts&lt;br /&gt;
			assert: mw.user.isAnon() ? undefined : &amp;#039;user&amp;#039;,&lt;br /&gt;
			baserevid: this.baserevid,&lt;br /&gt;
			basetimestamp: this.basetimestamp,&lt;br /&gt;
			starttimestamp: this.curtimestamp,&lt;br /&gt;
			nocreate: true&lt;br /&gt;
		}, editParams));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A generic page editor for the current page.&lt;br /&gt;
 *&lt;br /&gt;
 * This is a singleton and it displays a small interface in the top left after&lt;br /&gt;
 * the first edit has been registered.&lt;br /&gt;
 *&lt;br /&gt;
 * @public&lt;br /&gt;
 * this.page&lt;br /&gt;
 * this.addEdit&lt;br /&gt;
 * this.error&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
window.Editor = function() {&lt;br /&gt;
	//Singleton&lt;br /&gt;
	if (arguments.callee.instance)&lt;br /&gt;
		return arguments.callee.instance;&lt;br /&gt;
	else&lt;br /&gt;
		arguments.callee.instance = this;&lt;br /&gt;
&lt;br /&gt;
	this.page = new PageEditor(mw.config.get(&amp;#039;wgPageName&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
	// get the current text of the article and call the callback with it&lt;br /&gt;
	// NOTE: This function also acts as a loose non-re-entrant lock to protect currentText.&lt;br /&gt;
	this.withCurrentText = function(callback) {&lt;br /&gt;
		if (callbacks.length == 0) {&lt;br /&gt;
			callbacks = [callback];&lt;br /&gt;
			for (var i = 0; i &amp;lt; callbacks.length; i++) {&lt;br /&gt;
				callbacks[i](currentText);&lt;br /&gt;
			}&lt;br /&gt;
			return callbacks = [];&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (callbacks.length &amp;gt; 0) {&lt;br /&gt;
			return callbacks.push(callback);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		callbacks = [callback];&lt;br /&gt;
		thiz.page.CheckOutForEdit().then(function(wikitext) {&lt;br /&gt;
			if (wikitext === null)&lt;br /&gt;
				return thiz.error(&amp;quot;Could not connect to server&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			currentText = originalText = wikitext;&lt;br /&gt;
&lt;br /&gt;
			for (var i = 0; i &amp;lt; callbacks.length; i++) {&lt;br /&gt;
				callbacks[i](currentText);&lt;br /&gt;
			}&lt;br /&gt;
			callbacks = [];&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
	// A decorator for withCurrentText&lt;br /&gt;
	function performSequentially(f) {&lt;br /&gt;
		return (function() {&lt;br /&gt;
			var the_arguments = arguments;&lt;br /&gt;
			thiz.withCurrentText(function() {&lt;br /&gt;
				f.apply(thiz, the_arguments);&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// add an edit to the editstack&lt;br /&gt;
	function addEdit(edit, node, fromRedo) {&lt;br /&gt;
		withPresenceShowing(false, function() {&lt;br /&gt;
			if (node) {&lt;br /&gt;
				nodestack.push(node);&lt;br /&gt;
				node.style.cssText = &amp;quot;border: 2px var(--wikt-palette-green-4, #00FF00) dashed;&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if (!fromRedo)&lt;br /&gt;
				redostack = [];&lt;br /&gt;
&lt;br /&gt;
			var ntext = false;&lt;br /&gt;
			try {&lt;br /&gt;
				ntext = edit.edit(currentText);&lt;br /&gt;
&lt;br /&gt;
				if (ntext &amp;amp;&amp;amp; ntext != currentText) {&lt;br /&gt;
					edit.redo();&lt;br /&gt;
					currentText = ntext;&lt;br /&gt;
				} else&lt;br /&gt;
					return false;&lt;br /&gt;
			} catch (e) {&lt;br /&gt;
				// TODO Uncaught TypeError: Object [object Window] has no method &amp;#039;error&amp;#039;&lt;br /&gt;
				// I may have just fixed this by changing &amp;quot;this&amp;quot; below to &amp;quot;thiz&amp;quot; ...&lt;br /&gt;
				thiz.error(&amp;quot;ERROR:&amp;quot; + e);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			editstack.push(edit);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
	this.addEdit = performSequentially(addEdit);&lt;br /&gt;
&lt;br /&gt;
	// display an error to the user&lt;br /&gt;
	this.error = function(message) {&lt;br /&gt;
		console.trace(message);&lt;br /&gt;
		if (!errorlog) {&lt;br /&gt;
			errorlog = $(&amp;#039;&amp;lt;ul&amp;gt;&amp;#039;).css(&amp;quot;margin&amp;quot;, &amp;quot;0px -10px -10px -10px&amp;quot;)&lt;br /&gt;
				.css(&amp;quot;padding&amp;quot;, &amp;quot;10px&amp;quot;)[0];&lt;br /&gt;
			// jQuery $.css destroys var(...)&lt;br /&gt;
			errorlog.style.backgroundColor = &amp;quot;var(--wikt-palette-pink, #FFDDDD)&amp;quot;;&lt;br /&gt;
			withPresenceShowing(true, function(presence) {&lt;br /&gt;
				presence.appendChild(errorlog);&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
		errorlog.appendChild($(&amp;#039;&amp;lt;li&amp;gt;&amp;#039;).text(message)[0]);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var thiz = this; // this is set incorrectly when private functions are used as callbacks.&lt;br /&gt;
&lt;br /&gt;
	var editstack = []; // A list of the edits that have been applied to get currentText&lt;br /&gt;
	var redostack = []; // A list of the edits that have been recently undone.&lt;br /&gt;
	var nodestack = []; // A lst of nodes to which we have added highlighting&lt;br /&gt;
	var callbacks = {}; // A list of onload callbacks (initially .length == undefined)&lt;br /&gt;
&lt;br /&gt;
	var originalText = &amp;quot;&amp;quot;; // What was the contents of the page before we fiddled?&lt;br /&gt;
	var currentText = &amp;quot;&amp;quot;; // What is the contents now?&lt;br /&gt;
&lt;br /&gt;
	var errorlog; // The ul for sticking errors in.&lt;br /&gt;
	var $savelog; // The ul for save messages.&lt;br /&gt;
&lt;br /&gt;
	//Move an edit from the editstack to the redostack &lt;br /&gt;
	function undo() {&lt;br /&gt;
		if (editstack.length == 0)&lt;br /&gt;
			return false;&lt;br /&gt;
		var edit = editstack.pop();&lt;br /&gt;
		redostack.push(edit);&lt;br /&gt;
		edit.undo();&lt;br /&gt;
&lt;br /&gt;
		var text = originalText;&lt;br /&gt;
		for (var i = 0; i &amp;lt; editstack.length; i++) {&lt;br /&gt;
			var ntext = false;&lt;br /&gt;
			try {&lt;br /&gt;
				ntext = editstack[i].edit(text);&lt;br /&gt;
			} catch (e) {&lt;br /&gt;
				thiz.error(&amp;quot;ERROR:&amp;quot; + e);&lt;br /&gt;
			}&lt;br /&gt;
			if (ntext &amp;amp;&amp;amp; ntext != text) {&lt;br /&gt;
				text = ntext;&lt;br /&gt;
			} else {&lt;br /&gt;
				editstack[i].undo();&lt;br /&gt;
				editstack = editstack.splice(0, i);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		currentText = text;&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	this.undo = performSequentially(undo);&lt;br /&gt;
&lt;br /&gt;
	//Move an edit from the redostack to the editstack&lt;br /&gt;
	function redo() {&lt;br /&gt;
		if (redostack.length == 0)&lt;br /&gt;
			return;&lt;br /&gt;
		var edit = redostack.pop();&lt;br /&gt;
		addEdit(edit, null, true);&lt;br /&gt;
	}&lt;br /&gt;
	this.redo = performSequentially(redo);&lt;br /&gt;
&lt;br /&gt;
	function withPresenceShowing(broken, callback) {&lt;br /&gt;
		if (arguments.callee.presence) {&lt;br /&gt;
			if (broken || arguments.callee.presence.querySelector(&amp;quot;button&amp;quot;)) {&lt;br /&gt;
				arguments.callee.presence.style.display = &amp;quot;block&amp;quot;;&lt;br /&gt;
				return callback(arguments.callee.presence);&lt;br /&gt;
			} else {&lt;br /&gt;
				try {&lt;br /&gt;
					arguments.callee.presence.parentNode.removeChild(arguments.callee.presence);&lt;br /&gt;
				} catch (e) {&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var presence = $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;).css(&amp;quot;position&amp;quot;, &amp;quot;fixed&amp;quot;)&lt;br /&gt;
			.css(&amp;quot;top&amp;quot;, &amp;quot;0px&amp;quot;)&lt;br /&gt;
			.css(&amp;quot;left&amp;quot;, &amp;quot;0px&amp;quot;)&lt;br /&gt;
			.css(&amp;quot;z-index&amp;quot;, &amp;quot;10&amp;quot;)&lt;br /&gt;
			.css(&amp;quot;padding&amp;quot;, &amp;quot;30px&amp;quot;)[0];&lt;br /&gt;
		// jQuery $.css destroys var(...)&lt;br /&gt;
		presence.style.backgroundColor = &amp;quot;var(--wikt-palette-green-4, #00FF00)&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		window.setTimeout(function() {&lt;br /&gt;
			presence.style.backgroundColor = &amp;quot;var(--wikt-palette-dulllightblue, #CCCCFF)&amp;quot;;&lt;br /&gt;
			presence.style.padding = &amp;quot;10px&amp;quot;;&lt;br /&gt;
		}, 400);&lt;br /&gt;
&lt;br /&gt;
		var closeButton = $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;).css(&amp;quot;position&amp;quot;, &amp;quot;relative&amp;quot;)&lt;br /&gt;
					.css(&amp;quot;top&amp;quot;, &amp;quot;0px&amp;quot;)&lt;br /&gt;
					.css(&amp;quot;left&amp;quot;, &amp;quot;0px&amp;quot;)&lt;br /&gt;
					.css(&amp;quot;margin&amp;quot;, &amp;quot;-10px&amp;quot;)&lt;br /&gt;
					.css(&amp;quot;cursor&amp;quot;, &amp;quot;pointer&amp;quot;)&lt;br /&gt;
					.on(&amp;quot;click&amp;quot;, performSequentially(close))&lt;br /&gt;
					.text(&amp;quot;X&amp;quot;)[0];&lt;br /&gt;
		// jQuery $.css destroys var(...)&lt;br /&gt;
		closeButton.style.color = &amp;quot;var(--wikt-palette-blue, #0000FF)&amp;quot;;&lt;br /&gt;
		presence.appendChild(closeButton);&lt;br /&gt;
&lt;br /&gt;
		document.body.insertBefore(presence, document.body.firstChild);&lt;br /&gt;
&lt;br /&gt;
		var contents = $(&amp;#039;&amp;lt;p&amp;gt;&amp;#039;).css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
			.append($(&amp;#039;&amp;lt;b&amp;gt;Page Editing&amp;lt;/b&amp;gt;&amp;lt;/br&amp;gt;&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
		if (!broken) {&lt;br /&gt;
			contents.append($(&amp;#039;&amp;lt;button&amp;gt;&amp;#039;).text(&amp;quot;Save Changes&amp;quot;)&lt;br /&gt;
				.attr(&amp;#039;title&amp;#039;, &amp;#039;Save your changes [s]&amp;#039;)&lt;br /&gt;
				.attr(&amp;#039;accesskey&amp;#039;, &amp;#039;s&amp;#039;)&lt;br /&gt;
				.on(&amp;quot;click&amp;quot;, save));&lt;br /&gt;
			contents.append($(&amp;#039;&amp;lt;br&amp;gt;&amp;#039;));&lt;br /&gt;
			contents.append($(&amp;#039;&amp;lt;button&amp;gt;&amp;#039;).text(&amp;quot;Undo&amp;quot;)&lt;br /&gt;
				.attr(&amp;#039;title&amp;#039;, &amp;#039;Undo last change [z]&amp;#039;)&lt;br /&gt;
				.attr(&amp;#039;accesskey&amp;#039;, &amp;#039;z&amp;#039;)&lt;br /&gt;
				.on(&amp;quot;click&amp;quot;, thiz.undo));&lt;br /&gt;
&lt;br /&gt;
			contents.append($(&amp;#039;&amp;lt;button&amp;gt;&amp;#039;).text(&amp;quot;Redo&amp;quot;).on(&amp;#039;click&amp;#039;, thiz.redo));&lt;br /&gt;
&lt;br /&gt;
			mw.loader.using(&amp;#039;mediawiki.util&amp;#039;).then(function() {&lt;br /&gt;
				contents.children().updateTooltipAccessKeys();&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
		presence.appendChild(contents[0]);&lt;br /&gt;
&lt;br /&gt;
		arguments.callee.presence = presence;&lt;br /&gt;
		callback(presence);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Remove the button&lt;br /&gt;
	function close() {&lt;br /&gt;
		while (undo())&lt;br /&gt;
		;&lt;br /&gt;
&lt;br /&gt;
		withPresenceShowing(true, function(presence) {&lt;br /&gt;
			presence.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
			if (errorlog) {&lt;br /&gt;
				errorlog.parentNode.removeChild(errorlog);&lt;br /&gt;
				errorlog = false;&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//Send the currentText back to the server to save.&lt;br /&gt;
	function save() {&lt;br /&gt;
		thiz.withCurrentText(function() {&lt;br /&gt;
			if (editstack.length == 0)&lt;br /&gt;
				return;&lt;br /&gt;
&lt;br /&gt;
			var cleanup_callbacks = callbacks;&lt;br /&gt;
			callbacks = [];&lt;br /&gt;
			var sum = {};&lt;br /&gt;
			for (var i = 0; i &amp;lt; editstack.length; i++) {&lt;br /&gt;
				sum[editstack[i].summary] = true;&lt;br /&gt;
				if (editstack[i].after_save)&lt;br /&gt;
					cleanup_callbacks.push(editstack[i].after_save);&lt;br /&gt;
			}&lt;br /&gt;
			var summary = &amp;quot;&amp;quot;;&lt;br /&gt;
			for (var name in sum) {&lt;br /&gt;
				summary += name + &amp;quot; &amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			editstack = [];&lt;br /&gt;
			redostack = [];&lt;br /&gt;
			var saveLi = $(&amp;#039;&amp;lt;li&amp;gt;Saving:&amp;#039; + summary + &amp;#039;...&amp;lt;/li&amp;gt;&amp;#039;);&lt;br /&gt;
			withPresenceShowing(false, function(presence) {&lt;br /&gt;
				if (!$savelog) {&lt;br /&gt;
					$savelog = $(&amp;#039;&amp;lt;ul&amp;gt;&amp;#039;).css(&amp;quot;margin&amp;quot;, &amp;quot;0px -10px -10px -10px&amp;quot;)&lt;br /&gt;
						.css(&amp;quot;padding&amp;quot;, &amp;quot;10px&amp;quot;);&lt;br /&gt;
					// jQuery $.css destroys var(...)&lt;br /&gt;
					$savelog[0].style.backgroundColor = &amp;quot;var(--wikt-palette-palegreen, #DDFFDD)&amp;quot;;&lt;br /&gt;
					$(presence).append($savelog);&lt;br /&gt;
				}&lt;br /&gt;
				$savelog.append(saveLi);&lt;br /&gt;
&lt;br /&gt;
				if (originalText == currentText)&lt;br /&gt;
					return thiz.error(&amp;quot;No changes were made to the page.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
				else if (!currentText)&lt;br /&gt;
					return thiz.error(&amp;quot;ERROR: page has become blank.&amp;quot;);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			originalText = currentText;&lt;br /&gt;
			var nst = []&lt;br /&gt;
			var node;&lt;br /&gt;
			while (node = nodestack.pop()) {&lt;br /&gt;
				nst.push(node);&lt;br /&gt;
			}&lt;br /&gt;
			thiz.page.Save(currentText, {&lt;br /&gt;
				summary: summary + &amp;quot;([[WT:EDIT|Assisted]])&amp;quot;,&lt;br /&gt;
				notminor: true&lt;br /&gt;
			}).then(function(res) {&lt;br /&gt;
				if (res == null)&lt;br /&gt;
					return thiz.error(&amp;quot;An error occurred while saving.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
				try {&lt;br /&gt;
					saveLi.append(&lt;br /&gt;
						$(&amp;#039;&amp;lt;span&amp;gt;&amp;#039;)&lt;br /&gt;
						.append($(&amp;quot;&amp;lt;b&amp;gt;Saved&amp;lt;/b&amp;gt;&amp;quot;))&lt;br /&gt;
						.append($(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;).attr(&amp;quot;href&amp;quot;, mw.config.get(&amp;#039;wgScript&amp;#039;) +&lt;br /&gt;
								&amp;#039;?title=&amp;#039; + encodeURIComponent(mw.config.get(&amp;#039;wgPageName&amp;#039;)) +&lt;br /&gt;
								&amp;#039;&amp;amp;diff=&amp;#039; + encodeURIComponent(res.edit.newrevid) +&lt;br /&gt;
								&amp;#039;&amp;amp;oldid=&amp;#039; + encodeURIComponent(res.edit.oldrevid))&lt;br /&gt;
							.text(&amp;quot;(Show changes)&amp;quot;)));&lt;br /&gt;
				} catch (e) {&lt;br /&gt;
					if (res.error) {&lt;br /&gt;
						thiz.error(&amp;quot;Not saved: &amp;quot; + String(res.error.info));&lt;br /&gt;
					} else {&lt;br /&gt;
						thiz.error($(&amp;#039;&amp;lt;p&amp;gt;&amp;#039;).text(String(e))[0]);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				for (var i = 0; i &amp;lt; nst.length; i++)&lt;br /&gt;
					nst[i].style.cssText = &amp;quot;background-color: var(--wikt-palette-green-4,#0F0);border: 2px var(--wikt-palette-green-6,#0F0) solid;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
				window.setTimeout(function() {&lt;br /&gt;
					var node;&lt;br /&gt;
					while (node = nst.pop())&lt;br /&gt;
						node.style.cssText = &amp;quot;&amp;quot;;&lt;br /&gt;
				}, 400);&lt;br /&gt;
&lt;br /&gt;
				// restore any callbacks that were waiting for currentText before we started&lt;br /&gt;
				for (var i = 0; i &amp;lt; cleanup_callbacks.length; i++)&lt;br /&gt;
					thiz.withCurrentText(cleanup_callbacks[i]);&lt;br /&gt;
&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * A small amount of common code that can be usefully applied to adder forms.&lt;br /&gt;
 *&lt;br /&gt;
 * An adder is assumed to be an object that has:&lt;br /&gt;
 *&lt;br /&gt;
 * .fields  A object mapping field names to either validation functions used&lt;br /&gt;
 *          for text fields, or the word &amp;#039;checkbox&amp;#039;&lt;br /&gt;
 *&lt;br /&gt;
 * .createForm  A function () that returns a newNode(&amp;#039;form&amp;#039;) to be added to the&lt;br /&gt;
 *              document (by appending to insertNode)&lt;br /&gt;
 *&lt;br /&gt;
 * .onsubmit  A function (values, register (wikitext, callback)) that accepts&lt;br /&gt;
 *            the validated set of values and processes them, the register&lt;br /&gt;
 *            function accepts wikitext and a continuation function to be&lt;br /&gt;
 *            called with the result of rendering it.&lt;br /&gt;
 *&lt;br /&gt;
 * Before onsubmit or any validation functions are called, but after running&lt;br /&gt;
 * createForm, a new property .elements will be added to the adder which is a&lt;br /&gt;
 * dictionary mapping field names to HTML input elements.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {editor}  The current editor.&lt;br /&gt;
 * @param {adder}  The relevant adder.&lt;br /&gt;
 * @param {insertNode}  Where to insert this in the document.&lt;br /&gt;
 * @param {insertSibling} Where to insert this within insertNode.&lt;br /&gt;
 */&lt;br /&gt;
window.AdderWrapper = function(editor, adder, insertNode, insertSibling) {&lt;br /&gt;
	var form = adder.createForm()&lt;br /&gt;
	var status = $(&amp;#039;&amp;lt;span&amp;gt;&amp;#039;)[0];&lt;br /&gt;
&lt;br /&gt;
	form.appendChild(status);&lt;br /&gt;
	if (insertSibling)&lt;br /&gt;
		insertNode.insertBefore(form, insertSibling);&lt;br /&gt;
	else&lt;br /&gt;
		insertNode.appendChild(form);&lt;br /&gt;
&lt;br /&gt;
	adder.elements = {};&lt;br /&gt;
&lt;br /&gt;
	//This is all because IE doesn&amp;#039;t reliably allow form.elements[&amp;#039;name&amp;#039;]&lt;br /&gt;
	for (var i = 0; i &amp;lt; form.elements.length; i++) {&lt;br /&gt;
		adder.elements[form.elements[i].name] = form.elements[i];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	form.onsubmit = function() {&lt;br /&gt;
		try {&lt;br /&gt;
			var submit = true;&lt;br /&gt;
			var values = {}&lt;br /&gt;
&lt;br /&gt;
			status.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
			for (var name in adder.fields) {&lt;br /&gt;
				if (adder.fields[name] == &amp;#039;checkbox&amp;#039;) {&lt;br /&gt;
					values[name] = adder.elements[name].checked ? name : false;&lt;br /&gt;
				} else {&lt;br /&gt;
					adder.elements[name].style.border = &amp;#039;&amp;#039;; // clear error styles&lt;br /&gt;
					values[name] = adder.fields[name](adder.elements[name].value || &amp;#039;&amp;#039;, function(msg) {&lt;br /&gt;
						var element = $(&amp;#039;&amp;lt;span&amp;gt;&amp;#039;).append($(&amp;#039;&amp;lt;img&amp;gt;&amp;#039;).attr(&amp;#039;src&amp;#039;, &amp;#039;http://upload.wikimedia.org/wikipedia/commons/4/4e/MW-Icon-AlertMark.png&amp;#039;))&lt;br /&gt;
								.append(msg)&lt;br /&gt;
								.append($(&amp;#039;&amp;lt;br&amp;gt;&amp;#039;))[0];&lt;br /&gt;
						// jQuery $.css destroys var(...)&lt;br /&gt;
						element.style.color = &amp;quot;var(--wikt-palette-red, #ff0000)&amp;quot;;&lt;br /&gt;
						status.appendChild(element);&lt;br /&gt;
						adder.elements[name].style.border = &amp;quot;solid var(--wikt-palette-red,#CC0000) 2px&amp;quot;;&lt;br /&gt;
						return false&lt;br /&gt;
					});&lt;br /&gt;
&lt;br /&gt;
					if (values[name] === false)&lt;br /&gt;
						submit = false;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (!submit)&lt;br /&gt;
				return false;&lt;br /&gt;
&lt;br /&gt;
			var loading = $(&amp;#039;&amp;lt;span&amp;gt;Loading...&amp;lt;/span&amp;gt;&amp;#039;)[0];&lt;br /&gt;
			status.appendChild(loading);&lt;br /&gt;
&lt;br /&gt;
			adder.onsubmit(values, function(text, callback) {&lt;br /&gt;
				//text = &amp;quot;&amp;lt;p style=&amp;#039;display:inline;&amp;#039;&amp;gt;&amp;quot; + text + &amp;quot;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
				//text = &amp;quot;&amp;lt;div id=&amp;#039;editorjs-temp&amp;#039;&amp;gt;&amp;quot; + text + &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
				new mw.Api().parse(text, {&lt;br /&gt;
						title: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
						pst: true, //pst makes subst work as expected&lt;br /&gt;
						disablelimitreport: true&lt;br /&gt;
					})&lt;br /&gt;
					.then(function(r) {&lt;br /&gt;
						var cleanedHtml = $.parseHTML(r)[0].children[0].innerHTML; //first child of .mw-parser-output&lt;br /&gt;
						callback(cleanedHtml);&lt;br /&gt;
						status.removeChild(loading);&lt;br /&gt;
					}).fail(function(r) {&lt;br /&gt;
						if (r) console.log(&amp;quot;ERROR IN Editor.js:&amp;quot; + r);&lt;br /&gt;
						var errorElement = $(&amp;#039;&amp;lt;p&amp;gt;Could not connect to the server&amp;lt;/p&amp;gt;&amp;#039;)[0];&lt;br /&gt;
						// jQuery $.css destroys var(...)&lt;br /&gt;
						errorElement.style.color = &amp;quot;var(--wikt-palette-red, #ff0000)&amp;quot;;&lt;br /&gt;
						loading.appendChild(errorElement);&lt;br /&gt;
					});&lt;br /&gt;
			});&lt;br /&gt;
		} catch (e) {&lt;br /&gt;
			status.innerHTML = &amp;quot;ERROR:&amp;quot; + e.description;&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;/div&gt;</summary>
		<author><name>wikt&gt;Ioaxxere</name></author>
	</entry>
</feed>