பயனர்:Shriheeran/js/stub.js

கட்டற்ற கலைக்களஞ்சியமான விக்கிப்பீடியாவில் இருந்து.

குறிப்பு - சேமித்த பின்னர், நீங்கள் செய்த மாற்றங்களைக் காண்பதற்கு உங்கள் உலவியின் இடைமாற்று அகற்றப்பட வேண்டும்.

  • மொஸில்லா பயர்பாக்ஸ் / சபாரி: Shift+Reload, அல்லது Ctrl-F5 அல்லது Ctrl-R (⌘-R Mac ல்)
  • கூகிள் குரோம் Ctrl-Shift-R அழுத்தவும். (⌘-Shift-R Mac ல்) ;
  • இண்டர்நெட் எக்ஸ்ப்ளோரர்: Ctrl-Refresh அல்லது Ctrl-F5 ஐ அழுத்தவும்.
  • ஒபேரா: Tools → Preferences இல் இடைமாற்றை அகற்றவும்;
//Dokumentation unter [[Benutzer:Schnark/js/stub]] <nowiki>
/*global mediaWiki*/
(function ($, mw) {
"use strict";

var l10n = {
//jscs:disable maximumLineLength
	en: {
		'schnark-stub-creator': 'Create stub',
		'schnark-stub-creator-tooltip': 'Create a stub from available data to be expanded manually',
		'schnark-stub-creator-step1': 'This function will create a stub from available data.\nPlease make sure that there already is a Wikidata-item for the article you wish to create\n(if label and description are missing you should add them first,\nand also add missing properties)\nand enter its ID (Q1234):',
		'schnark-stub-creator-step2': 'Please enter which template should be used to create the article.\nIn most cases you can just accept the template that was determined automatically.\nThe template must be a subpage of $1.',
		'schnark-stub-creator-step3': 'The stub for the new article was created. Now it\'s your turn.\nPlease expand the stub with more information and do *not* save the stub in its present state!\nPerhaps some wrong or superfluous things were added from other languages,\nplease review the content carefully before saving.\n$1',
		'schnark-stub-creator-warnings': 'Please pay special attention to the following issues:\n$1',
		'schnark-stub-creator-warning-item': '* $1\n',
		'schnark-stub-creator-missing-function': 'The used function "$1" is not defined!',
		'schnark-stub-creator-missing-config': 'No configuration was found on this wiki!'
	},
	de: {
		'schnark-stub-creator': 'Stub erstellen',
		'schnark-stub-creator-tooltip': 'Erzeugt ein Grundgerüst aus vorhandenen Daten zum weiteren Ausbau',
		'schnark-stub-creator-step1': 'Diese Funktion erzeugt ein Grundgerüst für einen neuen Artikel aus vorhandenen Daten.\nStelle bitte zunächst sicher, dass ein Wikidata-Item zu dem gewünschten Artikel bereits vorliegt\n(falls Titel und Beschreibung fehlen, solltest du diese zunächst ergänzen,\nebenso noch fehlende Eigenschaften)\nund gib dessen ID (Q1234) an:',
		'schnark-stub-creator-step2': 'Gib bitte an, welches Gerüst zum Erstellen des Artikels verwendet werden soll.\nIn den meisten Fällen kannst du einfach das automatisch ermittelte Gerüst akzeptieren.\nDas Gerüst muss eine Unterseite von $1 sein.',
		'schnark-stub-creator-step3': 'Das Grundgerüst des neuen Artikels wurde erstellt. Nun bist du an der Reihe.\nBitte ergänze das Gerüst mit weiteren Informationen und speichere den Stub *nicht* in diesem Zustand ab!\nMöglicherweise wurden auch falsche oder unnötige Dinge aus anderen Sprachen übernommen,\nbitte prüfe den Inhalt vor dem Abspeichern genau.\n$1',
		'schnark-stub-creator-warnings': 'Beachte bitte vor allem folgende Punkte:\n$1',
		'schnark-stub-creator-missing-function': 'Die verwendete Funktion "$1" ist nicht defniert!',
		'schnark-stub-creator-missing-config': 'Es wurde keine Konfiguration auf diesem Wiki gefunden!'
	},
	'de-formal': {
		'schnark-stub-creator-step1': 'Diese Funktion erzeugt ein Grundgerüst für einen neuen Artikel aus vorhandenen Daten.\nStellen Sie bitte zunächst sicher, dass ein Wikidata-Item zu dem gewünschten Artikel bereits vorliegt\n(falls Titel und Beschreibung fehlen, sollten Sie diese zunächst ergänzen,\nebenso noch fehlende Eigenschaften)\nund geben Sie dessen ID (Q1234) an:',
		'schnark-stub-creator-step2': 'Geben Sie bitte an, welches Gerüst zum Erstellen des Artikels verwendet werden soll.\nIn den meisten Fällen können Sie einfach das automatisch ermittelte Gerüst akzeptieren.\nDas Gerüst muss eine Unterseite von $1 sein.',
		'schnark-stub-creator-step3': 'Das Grundgerüst des neuen Artikels wurde erstellt. Nun sind Sie an der Reihe.\nBitte ergänzen Sie das Gerüst mit weiteren Informationen und speichern Sie den Stub *nicht* in diesem Zustand ab!\nMöglicherweise wurden auch falsche oder unnötige Dinge aus anderen Sprachen übernommen,\nbitte prüfen Sie den Inhalt vor dem Abspeichern genau.\n$1',
		'schnark-stub-creator-warnings': 'Beachten Sie bitte vor allem folgende Punkte:\n$1'
	}
//jscs:enable maximumLineLength
};

function initL10N (l10n) {
	var i, chain = mw.language.getFallbackLanguageChain();
	for (i = chain.length - 1; i >= 0; i--) {
		if (chain[i] in l10n) {
			mw.messages.set(l10n[chain[i]]);
		}
	}
}

function getContents (title, base) {
	var d = $.Deferred();
	if (base) {
		base += '?callback=?';
	} else {
		base = mw.util.wikiScript('api');
	}
	$.getJSON(base, {
		action: 'query',
		prop: 'revisions',
		titles: title,
		rvprop: 'content',
		format: 'json',
		formatversion: 2
	}).done(function (json) {
		if (
			!json || !json.query || !json.query.pages || !json.query.pages[0] ||
			!json.query.pages[0].revisions || !json.query.pages[0].revisions[0]
		) {
			d.reject();
			return;
		}
		d.resolve(json.query.pages[0].revisions[0].content || '');
	}).fail(function () {
		d.reject();
	});
	return d.promise();
}

function Wikidata (q) {
	q = String(q);
	q = q.toUpperCase();
	if (q.charAt(0) !== 'Q') {
		q = 'Q' + q;
	}
	this.q = q;
	this.cache = {};
	this.lang = mw.config.get('wgContentLanguage');
}

Wikidata.prototype = {
	getJSON: function () {
		var self = this;
		if (!('wikidatawiki' in this.cache)) {
			this.cache.wikidatawiki = $.Deferred();
			$.getJSON('https://www.wikidata.org/w/api.php?callback=?', {
				action: 'wbgetentities',
				ids: self.q,
				props: 'info|sitelinks|sitelinks/urls|aliases|labels|descriptions|claims|datatype',
				languages: self.lang,
				languagefallback: true,
				format: 'json',
				formatversion: 2
			}).always(function (data) {
				if (data && data.entities && data.entities[self.q]) {
					self.cache.wikidatawiki.resolve(data.entities[self.q]);
				} else {
					self.cache.wikidatawiki.resolve({});
				}
			});
		}
		return this.cache.wikidatawiki.promise();
	},
	getSource: function (wiki) {
		var self = this;
		if (!(wiki in this.cache)) {
			this.cache[wiki] = $.Deferred();
			this.getJSON().done(function (data) {
				if (data.sitelinks && data.sitelinks[wiki]) {
					getContents(
						data.sitelinks[wiki].title,
						data.sitelinks[wiki].url.replace(/\/wiki\/.*/, '/w/api.php')
					).done(self.cache[wiki].resolve).fail(self.cache[wiki].reject);
				} else {
					self.cache[wiki].reject();
				}
			});
		}
		return this.cache[wiki].promise();
	},
	getLabel: function () {
		var d = $.Deferred(), self = this;
		this.getJSON().done(function (data) {
			if (data.labels && data.labels[self.lang]) {
				d.resolve(data.labels[self.lang].value);
			} else {
				d.reject();
			}
		});
		return d.promise();
	},
	getAliases: function () {
		var d = $.Deferred(), self = this;
		this.getJSON().done(function (data) {
			if (data.aliases && data.aliases[self.lang]) {
				d.resolve($.map(data.aliases[self.lang], function (item) {
					return item.value;
				}));
			} else {
				d.reject();
			}
		});
		return d.promise();
	},
	getDescription: function () {
		var d = $.Deferred(), self = this;
		this.getJSON().done(function (data) {
			if (data.descriptions && data.descriptions[self.lang]) {
				d.resolve(data.descriptions[self.lang].value);
			} else {
				d.reject();
			}
		});
		return d.promise();
	},
	getArticle: function () {
		var d = $.Deferred(), self = this;
		this.getJSON().done(function (data) {
			if (data.sitelinks && data.sitelinks[self.lang + 'wiki']) {
				d.resolve(data.sitelinks[self.lang + 'wiki'].title);
			} else {
				d.reject();
			}
		});
		return d.promise();
	},
	getProperty: function (prop, options) {
		var d = $.Deferred(), self = this;
		this.getJSON().done(function (data) {
			if (data.claims && data.claims[prop]) {
				d.resolve(self.parseProperty(data.claims[prop], options || {}));
			} else {
				d.reject();
			}
		});
		return d.promise();
	},
	parseProperty: function (prop, options) {
		var i, best = 0;
		function formatOne (p) {
			var type = p.mainsnak.datavalue.type, value = p.mainsnak.datavalue.value, res;
			switch (type) {
			case 'wikibase-entityid':
				return new Wikidata(value['numeric-id']);
			case 'time':
				res = /([+\-])0*(\d+)-0*(\d+)-0*(\d+)T(.*)Z/.exec(value.time);
				return [res[4], res[3], res[2] * (res[1] === '-' ? -1 : 1), res[5], value.calendermodel, value.precision];
			case 'globecoordinate':
				return [value.latitude, value.longitude];
			default:
				return value;
			}
		}
		if ((options.which || 'best') === 'best') {
			for (i = 1; i < prop.length; i++) {
				if (prop[i].rank > prop[best].rank) { //'deprecated' < 'normal' < 'preferred'
					best = i;
				}
			}
			return formatOne(prop[best]);
		} else {
			if (options.which !== 'all') {
				prop = $.grep(prop, function (item) {
					return options.which === item.rank;
				});
			}
			return $.map(prop, formatOne);
		}
	}
};

function FakeWikidata () {
	this.source = {
		enwiki: '\'\'\'FakeObject\'\'\' is something.\n\n== External links ==\n* [http://example.org Example link]'
	};
	this.properties = {
	};
}

FakeWikidata.prototype = {
	getSource: function (wiki) {
		if (wiki in this.source) {
			return $.Deferred().resolve(this.source[wiki]).promise();
		}
		return $.Deferred().reject().promise();
	},
	getLabel: function () {
		return $.Deferred().resolve('Fake-Objekt').promise();
	},
	getAliases: function () {
		return $.Deferred().reject().promise();
	},
	getDescription: function () {
		return $.Deferred().resolve('Test-Objekt für stub.js-Skript').promise();
	},
	getArticle: function () {
		return $.Deferred().reject().promise();
	},
	getProperty: function (prop/*, options*/) {
		//FIXME
		if (prop in this.properties) {
			return $.Deferred().resolve(this.properties[prop]).promise();
		}
		return $.Deferred().reject().promise();
	}
};

function Variables (wikidata, functions) {
	this.wikidata = wikidata;
	this.functions = functions;
	this.values = {};
	this.warnings = [];
}

Variables.prototype = {
	get: function (name) {
		return this.values[name];
	},
	getBool: function (name) {
		var val = this.get(name);
		if ($.isArray(val) && val.length === 0) {
			return false;
		}
		return !!val;
	},
	getString: function (name) {
		if (!this.getBool(name)) {
			return '';
		}
		return String(this.get(name));
	},
	getWarnings: function () {
		return this.warnings;
	},
	exec: function (f, params) {
		if (!(f in this.functions)) {
			return $.Deferred().reject(mw.msg('schnark-stub-creator-missing-function', f)).promise();
		}
		var ret = this.functions[f].apply(this, params);
		if (ret && $.isFunction(ret.done)) {
			return ret;
		}
		return $.Deferred().resolve(ret).promise();
	},
	evalJSON: function (data, empty) {
		var i = 0, d = $.Deferred(), self = this;
		function next () {
			if (i === data.length) {
				d.resolve();
				return;
			}
			var name = data[i][0], f = data[i][1], params = data[i].slice(2);
			i++;
			if (self.getBool(name)) {
				next();
				return;
			}
			self.exec(f, params).done(function (val) {
				if (name === '') {
					if (empty && val) {
						d.resolve(val);
						i = data.length;
					}
				} else {
					self.values[name] = val;
				}
			}).fail(function (warning) {
				if (warning) {
					self.warnings.push(warning);
				}
			}).always(next);
		}
		next();
		return d.promise();
	}
};

function Template (fake) {
	fake = fake || 0;
	this.fakeWD = fake === 1 || fake === 3;
	this.fakeTemplate = fake === 2 || fake === 3;
	this.prefix = mw.config.get('wgFormattedNamespaces')[2] + ':Schnark/js/stub.js/';
	this.functions = {};
}

Template.prototype = {
	addFunction: function (name, f) {
		this.functions[name] = f;
	},
	getPage: function (name, type) {
		return this.fakeTemplate ? this.getPageFake(name, type) : this.getPageReal(name, type);
	},
	getPageFake: function (name, type) {
		/*jshint quotmark: double*/
		//jscs:disable validateQuoteMarks, maximumLineLength
		var data = {
			mainjson: [ //gehört als optional in <syntaxhighlight> gepacktes JSON nach [[Benutzer:Schnark/js/stub.js/main/json]]
				["weblinksList", "re", "enwiki", "\\*\\s*\\[?((?:https?:)?//\\S*)", "g"],
				["weblinks", "format-array", "weblinksList", "* $0", "\n"],
				["title", "wikidata-label"],
				["description", "wikidata-description"],
				["is-a", "wikidata", "P31"],
				["is-a-label", "wikidata-label", "is-a"],
				["", "map", "is-a-label", {"Mensch": "person"}, "default"]
			],
			personjson: [
				["geschlecht-wd", "wikidata", "P21"],
				["geschlecht", "wikidata-label", "geschlecht-wd"],
				["eineine", "map", "geschlecht", {"weiblich": "eine"}, "ein"],
				["geschlechtKat", "map", "geschlecht", {"weiblich": "Frau", "männlich": "Mann"}, "Geschlecht unbekannt"],

				["ansetzung", "input", "Bitte gib den Namen in der Form „Nachname, Vorname“ an:"],
				["gnd", "wikidata", "P227"],
				["lccn", "wikidata", "P244"],
				["lccn-warnung", "map", "lccn", {"": ""}, "Bitte prüfe das Format der LCCN und füge gegebenenfalls Schrägstriche ein!"],
				["", "warn", "lccn-warnung"],
				["viaf", "wikidata", "P214"],

				["geburtsort-wd", "wikidata", "P19"],
				["geburtsort-label", "wikidata-label", "geburtsort-wd"],
				["geburtsort-link", "wikidata-article", "geburtsort-wd"],
				["geburtsort-link", "format-string", "$0", "geburtsort-label"],
				["geburtsort", "format-link", "geburtsort-link", "geburtsort-label"],
				["sterbeort-wd", "wikidata", "P20"],
				["sterbeort-label", "wikidata-label", "sterbeort-wd"],
				["sterbeort-link", "wikidata-article", "sterbeort-wd"],
				["sterbeort-link", "format-string", "$0", "sterbeort-label"],
				["sterbeort", "format-link", "sterbeort-link", "sterbeort-label"],

				["geb", "wikidata", "P569"],
				["gest", "wikidata", "P570"],
				["geburtskat", "format-date", "geb", "[[Kategorie:Geboren %Y]]\n"],
				["sterbekat", "format-date", "gest", "[[Kategorie:Gestorben %Y]]\n"],
				["istwar", "map", "sterbekat", {"": "ist"}, "war"],
				["geburtsdatum", "format-date", "geb"],
				["sterbedatum", "format-date", "gest"],
				["geburtsdatum-link", "format-date", "geb", "link"],
				["sterbedatum-link", "format-date", "gest", "link"],

				["geborenText", "format-string", "* $0 in $1", "geburtsdatum-link", "geburtsort"],
				["geborenText", "format-string", "* in $0", "geburtsort"],
				["geborenText", "format-string", "* $0", "geburtsdatum-link"],
				["gestorbenText", "format-string", "† $0 in $1", "sterbedatum-link", "sterbeort"],
				["gestorbenText", "format-string", "† in $0", "sterbeort"],
				["gestorbenText", "format-string", "† $0", "sterbedatum-link"],
				["bioklammmer", "format-string", "($0; $1) ", "geborenText", "gestorbenText"],
				["bioklammmer", "format-string", "($0) ", "geborenText"],
				["bioklammmer", "format-string", "($0) ", "gestorbenText"]
			],
			person: "'''$title''' $bioklammmer$istwar $eineine $description.\n\n== Weblinks ==\n$weblinks\n\n{{Normdaten|TYP=p|GND=$gnd|LCCN=$lccn|VIAF=$viaf}}\n\n{{SORTIERUNG:$ansetzung}}\n$geburtskat$sterbekat[[$:Kategorie:$geschlechtKat]]\n\n{{Personendaten\n|NAME=$ansetzung\n|ALTERNATIVNAME=\n|KURZBESCHREIBUNG=$description\n|GEBURTSDATUM=$geburtsdatum\n|GEBURTSORT=$geburtsort\n|STERBEDATUM=$sterbedatum\n|STERBEORT=$sterbeort\n}}",
			defaultjson: [],
			"default": "'''$title''' ist $description.\n\n== Weblinks ==\n$weblinks" //gehört als Wikitext nach [[Benutzer:Schnark/js/stub.js/default]]
		};
		/*jshint quotmark: single*/
		//jscs:enable validateQuoteMarks, maximumLineLength
		return $.Deferred().resolve(data[name + (type || '')]).promise();
	},
	getPageReal: function (name, type) {
		var d = $.Deferred();
		getContents(this.prefix + name + (type === 'json' ? '/json' : '')).done(function (content) {
			if (type === 'json') {
				try {
					d.resolve(JSON.parse(content
						.replace(/^[\s\S]*<(?:syntaxhighlight|source)[^<>]*>/, '')
						.replace(/<\/(?:syntaxhighlight|source)>[\s\S]*$/, '')
					));
				} catch (e) {
					d.resolve([]);
				}
			} else {
				d.resolve(content);
			}
		}).fail(function () {
			if (type === 'json') {
				d.resolve([]);
			} else {
				d.resolve('');
			}
		});
		return d.promise();
	},
	replace: function (template) {
		var self = this;
		return template.replace(/\$(\w+|\$|:)/g, function (all, name) {
			if (name === '$') {
				return '$';
			}
			if (name === ':') {
				return '';
			}
			return self.variables.getString(name);
		});
	},
	getTemplateName: function (q) {
		var d = $.Deferred(), self = this;
		this.variables = new Variables(this.fakeWD ? new FakeWikidata() : new Wikidata(q), this.functions);
		this.getPage('main', 'json').done(function (json) {
			if (json.length === 0) {
				d.reject();
			} else {
				self.variables.evalJSON(json, true).done(d.resolve);
			}
		});
		return d.promise();
	},
	fillTemplate: function (name) {
		var d = $.Deferred(), self = this;
		this.getPage(name, 'json').done(function (json) {
			self.variables.evalJSON(json).done(function () {
				self.getPage(name).done(function (page) {
					d.resolve(self.replace(page));
				});
			});
		});
		return d.promise();
	},
	getWarnings: function () {
		return this.variables.getWarnings();
	}
};

function addFunctions (t) {
	t.addFunction('input', function (label) {
		return window.prompt(label);
	});
	t.addFunction('re', function (wiki, re, flags) {
		var d = $.Deferred();
		flags = flags || '';
		this.wikidata.getSource(wiki).done(function (source) {
			try {
				re = new RegExp(re, flags);
			} catch (e) {
				d.reject(e);
				return;
			}
			function normaliseResult (result) {
				var arr = [], i;
				for (i = 1; i < result.length; i++) {
					arr.push(result[i]);
				}
				return arr.length === 1 ? arr[0] : arr;
			}
			if (flags.indexOf('g') > -1) {
				var array = [], result;
				/*jshint boss: true*/
				while (result = re.exec(source)) {
					array.push(normaliseResult(result));
				}
				/*jshint boss: false*/
				d.resolve(array);
			} else {
				d.resolve(normaliseResult(re.exec(source)));
			}
		}).fail(d.reject);
		return d.promise();
	});
	t.addFunction('translate', function (lang, title) {
		var d = $.Deferred();
		title = this.getString(title);
		if (!title) {
			return;
		}
		$.getJSON('https://' + lang + '.wikipedia.org/w/api.php?callback=?', {
			action: 'query',
			prop: 'langlinks',
			titles: title,
			lllimit: 1,
			lllang: mw.config.get('wgContentLanguage'),
			format: 'json',
			formatversion: 2
		}).always(function (data) {
			try {
				d.resolve(data.query.pages[0].langlinks[0].title);
			} catch (e) {
				d.resolve(title);
			}
		});
		return d.promise();
	});
	t.addFunction('format-link', function (page, label) {
		page = this.getString(page);
		if (!page) {
			return;
		}
		if (label === '') {
			label = page.replace(/ \(.*\)$/, '');
		} else {
			label = this.getString(label || '') || page;
		}
		if (page === label) {
			return '[[' + page + ']]';
		}
		if (label.indexOf(page) === 0) {
			return '[[' + page + ']]' + label.slice(page.length);
		}
		return '[[' + page + '|' + label + ']]';
	});
	t.addFunction('format-array', function (array, format, join) {
		array = this.get(array);
		if (!$.isArray(array) || array.length === 0) {
			return;
		}
		return $.map(array, function (item) {
			return format.replace(/\$(\d+)/g, function (all, n) {
				return $.isArray(item) ? item[n] : item;
			});
		}).join(join);
	});
	t.addFunction('format-date', function (date, format) {
		date = this.get(date);
		if (!$.isArray(date)) {
			return;
		}
		if (format === 'link') {
			format = '[[%j. %F]] [[%Y]]';
		} else if (!format) {
			format = '%j. %F %Y';
		}
		var invalid = false, result = format.replace(/%(.)/g, function (all, c) {
			switch (c) {
			case '%': return '%';
			case 'Y':
				if (
					date[5] < 9 ||
					(date[2] <= 0 && mw.config.get('wgContentLanguage') !== 'de') //FIXME lokalisieren
				) {
					invalid = true;
					break;
				}
				return date[2] <= 0 ? (1 - date[2]) + ' v. Chr.' : date[2];
			case 'M':
				if (date[5] < 10) {
					invalid = true;
					break;
				}
				var monthNamesShort = ["", "சன", "பெப்", "மார்", "ஏப்", "மே", "சூன்", "சூலை", "ஆக", "செப்", "அக்", "நவ", "டிச"];
				return monthNamesShort[date[1]];
			case 'F':
				if (date[5] < 10) {
					invalid = true;
					break;
				}
				return mw.config.get('wgMonthNames')[date[1]];
			case 'm':
				if (date[5] < 10) {
					invalid = true;
					break;
				}
				return date[1] < 10 ? '0' + String(date[1]) : date[1];
			case 'n':
				if (date[5] < 10) {
					invalid = true;
					break;
				}
				return date[1];
			case 'j':
				if (date[5] < 11) {
					invalid = true;
					break;
				}
				return date[0];
			case 'd':
				if (date[5] < 11) {
					invalid = true;
					break;
				}
				return date[0] < 10 ? '0' + String(date[0]) : date[0];
			default:
				invalid = true;
			}
		});
		if (!invalid) {
			return result;
		}
	});
	t.addFunction('format-coord', function (coord, nswo) {
		coord = this.get(coord);
		if (!$.isArray(coord)) {
			return;
		}
		coord = coord[nswo ? 0 : 1];
		var ret = [];
		nswo = coord > 0 ? (nswo ? 'N' : mw.config.get('wgContentLanguage') === 'de' ? 'O' : 'E') : (nswo ? 'S' : 'W');
		coord = Math.abs(coord);
		ret.push(Math.floor(coord));
		coord -= ret[0];
		coord *= 60;
		ret.push(Math.floor(coord));
		coord -= ret[1];
		coord *= 60;
		ret.push(Math.round(coord));
		if (ret[2] === 60) {
			ret[2] = 0;
			ret[1]++;
		}
		if (ret[1] === 60) {
			ret[1] = 0;
			ret[0]++;
		}
		ret.push(nswo);
		return ret.join('/');
	});
	t.addFunction('format-string', function (format, a /*, b, ...*/) {
		if (!a) {
			return format;
		}
		var array = this.get(a), self = this, invalid = false;
		if (!$.isArray(array)) {
			array = $.map(arguments, function (x, i) {
				if (i > 0) {
					invalid = invalid || !self.getBool(x);
					return self.getString(x);
				}
			});
			if (invalid) {
				return;
			}
		}
		return format.replace(/\$(\d+)/g, function (all, n) {
			return array[n];
		});
	});
	t.addFunction('map', function (a, map, fallback) {
		a = this.getString(a);
		return (a in map) ? map[a] : fallback;
	});
/*
	t.addFunction('and', function (a, b) {
		return this.getBool(a) && this.getBool(b);
	});
	t.addFunction('or', function (a, b) {
		return this.getBool(a) || this.getBool(b);
	});
	t.addFunction('not', function (a) {
		return !this.getBool(a);
	});
	t.addFunction('if', function (a, b, c) {
		return this.getBool(a) ? this.get(b) : this.get(c);
	});
*/
	t.addFunction('wikidata', function (p, options) {
		return this.wikidata.getProperty(p, options);
	});
	t.addFunction('wikidata-label', function (wd) {
		wd = wd ? this.get(wd) : this.wikidata;
		if (!wd) {
			return;
		}
		return wd.getLabel();
	});
	t.addFunction('wikidata-description', function (wd) {
		wd = wd ? this.get(wd) : this.wikidata;
		if (!wd) {
			return;
		}
		return wd.getDescription();
	});
	t.addFunction('wikidata-aliases', function (wd) {
		wd = wd ? this.get(wd) : this.wikidata;
		if (!wd) {
			return;
		}
		return wd.getAliases();
	});
	t.addFunction('wikidata-article', function (wd) {
		wd = wd ? this.get(wd) : this.wikidata;
		if (!wd) {
			return;
		}
		return wd.getArticle();
	});
	t.addFunction('warn', function (w) {
		return $.Deferred().reject(this.getString(w)).promise();
	});
}

function main ($edit) {
	var template = new Template(), q = window.prompt(mw.msg('schnark-stub-creator-step1'));
	addFunctions(template);
	template.getTemplateName(q).done(function (name) {
		name = window.prompt(mw.msg('schnark-stub-creator-step2', template.prefix), name);
		template.fillTemplate(name).done(function (result) {
			var warnings = template.getWarnings();
			if (warnings.length) {
				warnings = mw.msg('schnark-stub-creator-warnings', $.map(warnings, function (item) {
					return mw.msg('schnark-stub-creator-warning-item', item);
				}).join(''));
			} else {
				warnings = '';
			}
			$edit.textSelection('setContents', result);
			window.alert(mw.msg('schnark-stub-creator-step3', warnings));
		});
	}).fail(function () {
		window.alert(mw.msg('schnark-stub-creator-missing-config'));
	});
}

function init () {
	$(mw.util.addPortletLink('p-tb', '#',
		mw.msg('schnark-stub-creator'), 'p-stub',
		mw.msg('schnark-stub-creator-tooltip'))
	).click(function (e) {
		e.preventDefault();
		main($('#wpTextbox1'));
	});
}

function isCompatible () {
	return !!(window.JSON && JSON.parse);
}

if (isCompatible() && mw.config.get('wgAction') === 'edit') {
	mw.loader.using(['mediawiki.util', 'mediawiki.language', 'jquery.textSelection'], function () {
		initL10N(l10n);
		$(init);
	});
}

})(jQuery, mediaWiki);
//</nowiki>
"https://ta.wikipedia.org/w/index.php?title=பயனர்:Shriheeran/js/stub.js&oldid=2932170" இலிருந்து மீள்விக்கப்பட்டது