ميډياويکي:Gadget-U2693.js

د ويکيسيند لخوا

يادښت: د غوره توبونو د خوندي کولو وروسته، خپل د کتنمل (بروزر) ساتل شوې حافظه تازه کړی.

  • فايرفاکس/ سفري: په دې کتنمل کې د Reload د ټکوهلو په وخت د Shift تڼۍ نيولې وساتی، او يا هم Ctrl-F5 يا Ctrl-Rتڼۍ کېښکاږۍ (په Apple Mac کمپيوټر باندې ⌘-R کېښکاږۍ)
  • گووگل کروم: په دې کتنمل کې د Ctrl-Shift-R تڼۍ کېښکاږۍ (د مک لپاره ⌘-Shift-R)
  • انټرنټ اېکسپلورر: په دې کتنمل کې د Refresh د ټکوهلو په وخت کې د Ctrl تڼۍ کېښکاږلې ونيسۍ، او يا هم د Ctrl-F5 تڼۍ کېښکاږۍ
  • اوپرا: په دې کتنمل کې د خپل براوزر ساتل شوې حافظه پدې توگه سپينولی شی Tools→Preferences
/*jshint undef:true, latedef:true, shadow:true, boss:true, scripturl:true */
/*global mw, jQuery */
'use strict'; // <nowiki>
jQuery(document).ready(function () {

function createAnchorLink(label, href, wikilink, title) {
	var span = document.createElement('span');
	var link = document.createElement('a');
	
	link.href = href;
	link.addEventListener('click', function (ev) {
		ev.preventDefault();
		// IE
	    if (window.clipboardData && window.clipboardData.setData) {
	        window.clipboardData.setData('text', wikilink);
	        mw.util.jsMessage('Wikitext copied to the clipboard.');
	        return;
	    }
    	// XXX: there is a brand new shiny ClipboardEvent API, but I could not get it to work on my browser.
    	// plus, there is no graceful fallback if it fails to work. going back to good ol' prompt().
		prompt('Hit Ctrl-C to copy this to your clipboard', wikilink);
	}, false);
	
	link.appendChild(document.createTextNode(label));
	link.title = title;

	span.appendChild(document.createTextNode('['));
	span.appendChild(link);
	span.appendChild(document.createTextNode(']'));
	span.className = 'mw-editsection';
	
	return span;
}

// XXX: not ideal; it may over-unescape things, but it usually works as intended
function unescapeAnchor(anchor) {
	anchor = anchor.replace(/_/g, ' ');
	try {
		return decodeURIComponent(anchor.replace(/\.([0-9A-F][0-9A-F])/g, '%$1'));
	} catch (e) {
		return anchor;
	}
}

function forEachHeader(callback) {
	var headers = document.getElementsByClassName('mw-headline');

	for (var i = 0; i < headers.length; ++i) {
		var links = headers[i].parentNode.getElementsByTagName('a');
		var title = null;
		for (var j = 0; j < links.length; ++j) {
			try {
				var u = new mw.Uri(links[j].href);
				if ((u.host === location.host) && (u.path === mw.config.get('wgScript')) && (u.query.action === 'edit') && !u.query.redlink) {
					title = new mw.Title(u.query.title);
				}
			} catch (e) {
				/* screw it */
			}
		}
		if (!title)
			continue;
		
		callback(headers[i], title);
	}
}

function getRevInfo(oldid, callback) {
	// XXX: of course I have it right on the page, but I cannot rely on it being in any particular format.
	// hence wasting bandwidth on an API request.

	mw.loader.using(['mediawiki.api', 'mediawiki.util'], function () {
		var api = new mw.Api();
		
		api.get({
			'action': 'query',
			'pageids': mw.config.get('wgArticleId'),
			'prop': 'revisions',
			'rvprop': 'user|timestamp',
			'rvstartid': oldid,
			'rvlimit': 1
		}).then(function (result) {
			var revobj = result.query.pages[mw.config.get('wgArticleId')].revisions[0];

			callback(revobj);
		});
	});
}

function createUnsignedLink(revobj) {
	var userpart = (mw.util.isIPv4Address(revobj.user) || mw.util.isIPv6Address(revobj.user) ? '{{unsigned-ip|' : '{{unsigned|') + revobj.user;
	var datepart = '}}';

	var m;
	if (m = /^(\d+)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z$/.exec(revobj.timestamp)) {
		var monthNames = [
			'January', 'February', 'March', 'April', 'May', 'June',
			'July', 'August', 'September', 'October', 'November', 'December'
		];
		datepart = '|' + m[4] + ':' + m[5] + ', ' + m[3].replace(/^0+/, '') + ' ' + monthNames[parseInt(m[2], 10) - 1] + ' ' + m[1] + ' (UTC)}}';
	}
	
	return createAnchorLink('✎',
		'javascript:void window.warranty',
		userpart + datepart,
		'{{unsigned}}'
	);
}

if (mw.config.get('wgAction') !== 'view')
	return;

if (mw.util.getParamValue('diff')) { // viewing a diff
	var oldid, newid;
	var ot = document.getElementById('mw-diff-otitle1');
	var nt = document.getElementById('mw-diff-ntitle1');
	if (ot) { ot = new mw.Uri(ot.getElementsByTagName('a')[0].href); oldid = ot.query.oldid; }
	if (nt) { nt = new mw.Uri(nt.getElementsByTagName('a')[0].href); newid = nt.query.oldid; }	
	
	document.getElementById('firstHeading').appendChild(createAnchorLink('⚓',
		mw.config.get('wgScript') + '?oldid=' + oldid + '&diff=' + newid,
		'[[Special:Diff/' + oldid + '/' + newid + ']]',
		'Link to this diff'
	));

	if ((document.getElementsByClassName('diffmulti').length === 0) && (mw.config.get('wgArticleId'))) {
		getRevInfo(newid, function (revobj) {
			document.getElementById('firstHeading').appendChild(createUnsignedLink(revobj));
		});
	}
} else if (mw.util.getParamValue('oldid')) { // viewing an old page revision
	var oldid = mw.util.getParamValue('oldid');

	document.getElementById('firstHeading').appendChild(createAnchorLink('⚓',
		mw.config.get('wgScript') + '?oldid=' + oldid,
		'[[Special:Permalink/' + oldid + ']]',
		'Link to this revision'
	));
	
	getRevInfo(oldid, function (revobj) {
		document.getElementById('firstHeading').appendChild(createUnsignedLink(revobj));
	});
} else if (mw.config.get('wgRevisionId') === mw.config.get('wgCurRevisionId')) {

// 100 = appendix, 114 = citations
if ([0, 100, 114].indexOf(mw.config.get('wgNamespaceNumber')) === -1)
forEachHeader(function(header, title){
	header.parentNode.appendChild(createAnchorLink('⚓',
		mw.util.getUrl(title.getPrefixedDb()) + '#' + header.id,
		'[[' + title.getPrefixedText() + '#' + unescapeAnchor(header.id) + ']]'
	));
});
	
}

});