Přeskočit na obsah

Wikipedista:Dvorapa/tools.js

Z Wikipedie, otevřené encyklopedie

Poznámka: Po uložení musíte vyprázdnit mezipaměť vašeho prohlížeče, jinak změny neuvidíte.

/* <onlyinclude> __NOEDITSECTION__
'''Mikroudělátka''' k vložení do uživatelského skriptu (na stránce [[Speciální:Moje stránka/common.js|common.js]]). Pokud chcete využít některé z následujících mikroudělátek, '''následujte návod [[#Instalace]]'''.

Většina mikroudělátek pochází od [[Wikipedista:Mormegil|Mormegila]] ([[Wikipedista:Mormegil/tools.js.help|zdroj]]), některá bohužel již nejsou funkční, postupně ale budou vylepšována a opravována.

Pokud chcete sledovat změny, opravy chyb a nové funkce v udělátcích, případně zkoušet nová udělátka, neklikejte na hvězdičku nahoře, ale klikněte [https://cs.wikipedia.org/w/index.php?title=Wikipedista:Dvorapa/tools.js&action=watch sem].
</onlyinclude>

****************************************************************************
****************************************************************************
**                                                                        **
** Dokumentaci si můžete přečíst na [[Wikipedista:Dvorapa/tools.js/doc]]. **
**                                                                        **
****************************************************************************
****************************************************************************

<onlyinclude>
== Instalace ==
Pokud chcete jakékoliv z následujících mikroudělátek používat, musíte nejprve na začátek [[Speciální:Moje stránka/common.js|svého souboru ''common.js'']] vložit odkaz na '''tento soubor'''. K tomu slouží následující řádek kódu:
<pre>
importScript("Wikipedista:Dvorapa/tools.js");
</pre>

Dále si tam vložte řádky podle toho, která mikroudělátka chcete použít (viz „Použití“ u každého mikroudělátka):

__TOC__
</onlyinclude><pre> */
// TODO: nahradit následující funkce mw.* funkcemi
// najít element s nadpisem stránky
function findFirstHeading() {
	var eContent = document.getElementById('content');
	if (eContent === null) return null;
	var elems = eContent.getElementsByTagName("h1");
	if (elems.length === 0) return null;
	return elems[0];
}
// zjistit nadpis stránky
function getPagetitle() {
	var eHeading = findFirstHeading();
	if (eHeading === null) return "";
	var title = eHeading.innerHTML;
	// TODO: vyřešit stránky, kde se nečte článek (editace, přesouvání, …)
	return title;
}
// získat (enkódované) lokální URL nějaké stránky (obdoba localurl:)
function getLocalURL(text) {
	text = text.substring(0, 1).toUpperCase() + text.substring(1);
	return "/wiki/" + encodeURIComponent(text.replace(/ /g, "_")).replace(/%2f/gi, "/");
}
// Appends a new tab.
// Převzato z [[commons:MediaWiki:Extra-tabs.js]].
function appendTab(url, name) {
	var na = document.createElement('a');
	na.setAttribute('href', url);
	var txt = document.createTextNode(name);
	na.appendChild(txt);
	var li = document.createElement('li');
	li.appendChild(na);
	// Grab the element we want to append the tab and append the tab to it.
	var c1 = document.getElementById(mw.config.get('skin') === 'vector' ? 'p-cactions' : 'column-one');
	if (!c1) return;
	var tabs = c1.getElementsByTagName('div')[0].getElementsByTagName('ul')[0];
	tabs.appendChild(li);
}
/* </pre><onlyinclude>
== Tlačítka shrnutí ==
; Funkce
: Pod editační okno přidá panel s tlačítky pro vložení často používaných shrnutí editace (převzato částečně z udělátka na [[:sk:MediaWiki:Gadget-edit-summaries.js|skwiki]] a převážně z udělátka na [[:he:מדיה_ויקי:Gadget-Summarieslist.js|hewiki]].
; Použití
:Základní:
 jQuery(function($) { addSummaryToolbar(); });
:Vlastní:
 jQuery(function($) {
 	addSummaryToolbar(
 		["vlastní", {"title": "ahoj", "content": "Vloží ahoj"}, {"title": "svět", "content": "Vloží svět"},
 		"další", {"title": "ahoj světe", "content": "Vloží ahoj světe"}],
 		["diskuse", {"title": "re", "content": "Vloží re"}],
 		["ahoj", "re"]
 	);
 });
; Parametry
:* První parametr obsahuje nadpisy a seznamy dvojic {"title": "shrnutí", "content": "popisek"} oddělené čárkou.
:* Druhý parametr může být buď prázdný řetězec, nebo nadpisy a seznamy dvojic pro diskusní stránky.
:* Třetí parametr může být buď prázdný řetězec, nebo seznam shrnutí, při jejichž vložení se automaticky zaškrtne tlačítko malé editace. Při vložení jiného než zde uvedeného shrnutí se znovu samo odškrtne.
</onlyinclude><pre> */
function addSummaryToolbar(main, talk, minor) {
	var installed = false;

	function installSummary($summaryBox, smallArea) {
		if (installed) return;
		installed = true;

		function addSummary() {
			var summary = $(this).data('summary');
			var text = summary.title;
			var sum = $summaryBox,
				curr = sum.val();
			var comma = curr.length > 0 && curr.charAt(curr.length - 2) != "/";
			sum.val(curr + (comma ? ', ' : '') + text).trigger('input');
			$("#wpMinoredit").prop('checked', summary.minor || $.inArray(text, minorSummaries) + 1);
		}

		var summaries = window.summaries || [];
		if (main === ("" || undefined)) {
			summaries = summaries.concat([
				"malé",
				{"title": "překlepy", "content": "Oprava překlepů"},
				{"title": "odkazy", "content": "Úprava odkazů na jiné články Wikipedie"},
				{"title": "kategorie", "content": "Úprava kategorií"},
				{"title": "externí odkazy", "content": "Úprava externích odkazů"},
				"běžné",
				{"title": "pravopis", "content": "Oprava pravopisu"},
				{"title": "gramatika", "content": "Oprava gramatiky"},
				{"title": "typografie", "content": "Oprava typografie"},
				{"title": "formulace", "content": "Úprava formulace"},
				{"title": "aktualizace", "content": "Aktualizace údajů"},
				{"title": "rozšíření", "content": "Rozšíření článku"},
				"technické",
				{"title": "obrázek", "content": "Přidání, změna, smazání obrázku" },
				{"title": "infobox", "content": "Vložení/úprava infoboxu"},
				{"title": "šablona", "content": "Vložení šablony"}
			]);
		} else {
			summaries = summaries.concat(main);
		}
		if (mw.config.get('wgNamespaceNumber') % 2 == 1 || mw.config.get('wgNamespaceNumber') == 4) {
			if (talk === ("" || undefined)) {

				summaries = summaries.concat([
					"diskuse",
					{"title": "odpověď", "content": "Odpověď"},
					{"title": "návrh", "content": "Návrh"},
					{"title": "dotaz", "content": "Dotaz"}
				]);

			} else {

				summaries = summaries.concat(talk);

			}
		}
		var minorSummaries = [];
		if (minor === ("" || undefined)) {
			minorSummaries = ["překlepy", "odkazy", "kategorie", "externí odkazy"];
		} else {
			minorSummaries = minor;
		}
		var div = $("<div>", {
				id: "summariesList"
			})
			.css({
				width: (smallArea ? "100%" : "65%"),
				padding: "2px",
				fontSize: "85%",
				lineHeight: "18px"
			});

		for (var i = 0; i < summaries.length; i++) {
			var summary = summaries[i];
			var summaryButton = $('<span>').css({
				marginLeft: '0.4em',
				whiteSpace: 'nowrap'
			}).data({
				summary: summary
			});
			if (typeof summary == "string") {
				div.append(smallArea ? '<br>' : ' '); //allow text wrap here
				summaryButton.text(summary + ':');
			} else {
				summaryButton.html('&nbsp' + summary.title + '&nbsp')
					.addClass('clickable-edit-summary')
					.attr('title', summary.content || '')
					.css({
						'background-color': '#f9f9f9',
						border: 'dotted 1px #708090',
						cursor: 'pointer'
					})
					.click(addSummary);
				if (smallArea) div.append(' ');
			}
			div.append(summaryButton);
		}

		$summaryBox.after(div);
	}

	if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) + 1) {
		installSummary($('.editOptions #wpSummary'), false);
	}

	mw.hook('ve.saveDialog.stateChanged').add(function() {
		var target = ve.init.target;
		var $summaryBox = target.saveDialog.$body.find('.ve-ui-mwSaveDialog-summary textarea');
		installSummary($summaryBox, true);
	});

}
/* </pre><onlyinclude>
== Odkazy na oblíbené stránky ==
; Funkce
: Do horní lišty přidá odkazy na oblíbené stránky.
; Použití
:Základní:
 jQuery(function($) { addLinktoolbar([["Portál:Historie", "Portál"], ["Wikipedie:Pod lípou", "Pod lípou"]]); });
:Pokročilé:
 jQuery(function($) { addLinktoolbar([["Wikipedie:Žádost o práva správce", "RfA"], ["Wikipedie:Hlasování o smazání", "VfD"]], "Speciální:Poslední změny", "Pracovní", "p-tb", "t-upload"); });
; Parametry
:* První parametr obsahuje seznam dvojic ["odkaz na stránku", "zobrazený text odkazu"] oddělených čárkou. Pokud je místo dvojice prázdná položka "", vloží se na její místo oddělovač.
:* Druhý parametr může být buď prázdný řetězec, nebo název stránky, na které se pouze mají tyto odkazy zobrazit.
:* Třetí parametr může být buď prázdný řetězec, nebo nadpis lišty
:* Čtvrtý parametr může být buď prázdný řetězec, nebo ID jiného prvku, na začátek kterého se mají odkazy vložit.
:* Pátý parametr může být buď prázdný řetězec, nebo ID jiného prvku, před který se mají odkazy vložit.
</onlyinclude><pre> */
function addLinktoolbar(items, page, caption, parent, next) {
	if (page !== ("" || undefined) && getPagetitle() !== page) return;
	if (parent === ("" || undefined)) parent = 'p-personal';
	if (next === ("" || undefined)) next = 'pt-preferences';
	if (caption !== ("" || undefined)) {
		mw.util.addPortletLink(
			parent,
			getPagetitle(),
			caption,
			'pt-caption',
			caption,
			null,
			'#' + next
		);
	}
	for (var i = 0; i < items.length; i++) {
		mw.util.addPortletLink(
			parent,
			getLocalURL(items[i][0]),
			items[i][1],
			'pt-' + items[i][1],
			items[i][1],
			null,
			'#' + next
		);
	}
}
/* </pre><onlyinclude>
== Oblíbená interwiki ==
; Funkce
: Přeuspořádá interwiki odkazy tak, aby vybrané jazyky byly navrchu a případně buď ještě zvýrazní vybrané jazyky nebo skryje odkazy na ostatní jazyky.
; Použití
 jQuery(function($) { reorderInterwiki(['en', 'de', 'sk'], false); });
; Parametry
:* První parametr obsahuje seznam jazykových kódů cizojazyčných Wikipedií oddělených čárkou.
:* Druhý parametr obsahuje <code>true</code> pokud se mají zobrazovat ''pouze'' vybrané jazyky nebo <code>false</code> pokud se mají zobrazovat i ostatní a vybrané se mají jen zobrazovat navrchu a tučně.
</onlyinclude><pre> */
function reorderInterwiki(priorityLanguages, removeOthers) {
	langBox = document.getElementById('p-lang');
	if (!langBox) return;
	langList = langBox.getElementsByTagName('ul');
	if (!langList) return;
	langList = langList[0];
	langItems = langList.getElementsByTagName('li');
	priorityList = [];
	for (var l = 0; l < priorityLanguages.length; l++) {
		var reLanguageMatch = new RegExp('(^|\\s)interwiki-' + priorityLanguages[l] + '(\\s|$)');
		for (var i = 0; i < langItems.length; i++) {
			var item = langItems[i];
			if (reLanguageMatch.test(item.className)) {
				langList.removeChild(item);
				priorityList.push(item);
				break;
			}
		}
	}
	if (removeOthers) {
		while (langList.hasChildNodes()) {
			langList.removeChild(langList.childNodes[0]);
		}
	}
	if (langList.hasChildNodes()) {
		var firstNode = langList.childNodes[0];
		for (var i = 0; i < priorityList.length; i++) {
			langList.insertBefore(priorityList[i], firstNode);
			priorityList[i].style.fontWeight = 'bold';
		}
	} else {
		for (var i = 0; i < priorityList.length; i++) {
			langList.appendChild(priorityList[i]);
		}
	}
}
/* </pre><onlyinclude>
== Odkazy na jiné Wikipedie při chybějícím interwiki ==
; Funkce
: U stránky bez interwiki zobrazí odkazy na stejně pojmenované stránky na vybraných cizojazyčných Wikipediích.
; Použití
 jQuery(function($) { showDefaultInterwiki(['cs', 'en', 'sk']); });
; Parametry
: Buď seznam jazykových kódů cizojazyčných Wikipedií oddělených čárkou, nebo <code>null</code> pro nějaké výchozí
</onlyinclude><pre> */
function showDefaultInterwiki(langs) {
	if (!langs || langs.length == 0) {
		langs = ['cs', 'en', 'de', 'sk', 'pl', 'fr'];
	}
	// stránky, které už interwiki mají
	var langBox = document.getElementById('p-lang');
	if (!langBox || document.getElementById('wbc-linkToItem-link')) return;
	// bez editací, historie atd., s výjimkou situace, kdy stránka dosud ani neexistuje (a ošetřit NS MediaWiki)
	if (!document.getElementById('t-cite') && document.getElementById('ca-history') && mw.config.get('wgNamespaceNumber') !== 8) return;
	if (!langBox) {
		langBox = document.createElement('div');
		langBox.id = 'p-lang';
		langBox.className = mw.config.get('skin') === 'vector' ? 'portal' : 'portlet';
		var caption = document.createElement('h5');
		caption.appendChild(document.createTextNode('totéž jinde'));
		langBox.appendChild(caption);
	}
	var langBody = document.createElement('div');
	langBody.className = mw.config.get('skin') === 'vector' ? 'body' : 'pBody';
	langBox.appendChild(langBody);
	var langList = document.createElement('ul');
	langBody.appendChild(langList);
	for (var i = 0; i < langs.length; ++i) {
		var lang = langs[i];
		if (lang == mw.config.get('wgContentLanguage')) continue;
		var item = document.createElement('li');
		item.className = 'interwiki-' + lang;
		langList.appendChild(item);
		var link = document.createElement('a');
		var ns = mw.config.get('wgCanonicalNamespace');
		if (ns.length > 0) ns += ':';
		var title = mw.config.get('wgTitle');
		if (ns === 'Special') title = mw.config.get('wgCanonicalSpecialPageName');
		link.href = '//' + lang + '.wikipedia.org' + getLocalURL(ns + title);
		link.appendChild(document.createTextNode(lang));
		item.appendChild(link);
	}
	var columnOne = document.getElementById(mw.config.get('skin') === 'vector' ? 'mw-panel' : 'column-one');
	columnOne.appendChild(langBox);
}
/* </pre><onlyinclude>
== Odkazy na kapitoly článku ==
; Funkce
: Do článků přidá před každý nadpis odkaz, který vede na nadpis. Užitečné, pokud chcete někoho odkázat přímo na určitou sekci a nechce se vám ji hledat v (třeba příliš dlouhém) obsahu.
; Použití
 jQuery(function($) { addLinksBeforeHeadings(); });
</onlyinclude><pre> */
function addLinksBeforeHeadings() {
	$('.mw-headline').each(function(headline) {
		small = document.createElement('small');
		link = document.createElement('a');
		headline = $(this);
		$(link).attr('href', function() {
			return '#' + $(headline).attr('id');
		});
		$(link).text('#');
		$(small).append(link);
		$(small).append('&nbsp;');
		$(this).before(small);
	});
}
/* </pre><onlyinclude>
== Dodatečné záložky ==
'''{{Námitka}} Sloučit s ''Odkazy na oblíbené stránky'''''
; Funkce
: Přidá některé užitečné záložky: U anonymů odkaz na WHOIS, u neexistujících a zamčených stránek odkaz na log
; Použití
 jQuery(function($) { addAdditionalTabs(); });
</onlyinclude><pre> */
// TODO: zkontrolovat funkčnost
function addAdditionalTabs() {
	var title = mw.config.get('wgPageName');
	var username = null;
	var addWhois = false,
		addLog = false;
	var ns = mw.config.get('wgCanonicalNamespace');
	if (ns === 'User' || ns === 'User_talk') {
		// uživatelská stránka nebo diskuse (příp. podstránka)
		username = title;
		addWhois = true;
		addLog = true;
	} else if (ns === 'Special' && mw.config.get('wgCanonicalSpecialPageName') == 'Contributions') {
		// příspěvky uživatele
		for (var i = 0; i < document.forms.length; ++i) {
			var form = document.forms[i];
			if (form.elements['target']) username = form.elements['target'].value;
			if (username) break;
		}
		if (!username) return;
		username = 'User:' + username;
		addWhois = true;
	} else if (ns !== 'Special') {
		// normální, nespeciální stránka
		if (!document.getElementById('ca-history') || !document.getElementById('ca-edit')) {
			// neexistující nebo zamčená stránka – přidat odkaz na log
			appendTab('/w/index.php?title=Special:Log&page=' + title, "Log");
		}
		return;
	} else return;
	username = username.substring(username.indexOf(':') + 1);
	username = username.replace(/\/.*$/, '');
	if (addLog) appendTab('/w/index.php?title=Special:Log&page=User:' + username, "Log");
	if (username.match(/([0-9]{1,3}\.){3}[0-9]{1,3}/)) {
		// anonymní uživatel
		if (addWhois) appendTab("http://toolserver.org/~chm/whois.php?ip=" + username, "Whois");
	}
}
/* </pre><onlyinclude>
== Odkaz na index ==
'''{{Námitka}} Sloučit s ''Odkazy na oblíbené stránky'''''
; Funkce
: Na každou stránku přidá odkaz do stránky [[Speciální:Všechny stránky]] zobrazující okolí aktuální stránky.
; Použití
 jQuery(function($) { addIndexLink(); });
</onlyinclude><pre> */
// TODO: zkontrolovat funkčnost
function addIndexLink() {
	if (mw.config.get('wgCanonicalNamespace') === "Special") return;
	var pageName = mw.config.get('wgPageName');
	appendTab(getLocalURL('Special:Allpages/' + pageName.substring(0, pageName.length - 1)), 'Index');
}
/* </pre> */