User:Ahecht/Scripts/TemplateSearch.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/*<onlyinclude><syntaxhighlight lang="javascript">/*
Based on [[User:SiBr4/TemplateSearch.js]] by [[User:SiBr4]], with added support for the Vector 2022 and Minerva Neue skins.

Allows using "TP:" and "{{" as shortcuts for "Template:" in the search box. See
[[Wikipedia:Village pump (proposals)/Archive 127#Prefix suggestion: TP: for Template:]].

Install by adding the following row to your Special:MyPage/common.js, Special:MyPage/skin.js, or meta:Special:MyPage/global.js:

mw.loader.load( "//en.wikipedia.org/w/index.php?title=User:Ahecht/Scripts/TemplateSearch.js&action=raw&ctype=text/javascript" ); // Linkback: [[:en:User:Ahecht/Scripts/TemplateSearch.js]]
*/

function addSearchBoxChangeListener(searchboxes) {
	searchboxes.forEach(function (searchbox) {
		if (searchbox.classList.contains("cdx-text-input__input") || searchbox.classList.contains("search") || searchbox.id == "searchInput") {
			searchbox.setAttribute("onkeyup","replaceBracesInSearch(this);");
			searchbox.setAttribute("onpaste","replaceBracesInSearch(this);");
			replaceBracesInSearch(searchbox);
		}
	} );
}

var SearchRegexes = SearchRegexes || {"^(\\\{\\\{|[Tt][Pp]:)":"Template:","\\\}\\\}$":""};
function replaceBracesInSearch(box) {
	for (var search in SearchRegexes) {
		re = new RegExp(search);
		if(re.test(box.value)) {
			box.value=box.value.replace(re,SearchRegexes[search]);
			box.dispatchEvent(new Event('input'));
		}
	}
}

$.when( mw.loader.using( 'mediawiki.util' ), $.ready ).then(function() {
	addSearchBoxChangeListener(document.getElementsByName("search"));
	var x = new MutationObserver(function () {
		addSearchBoxChangeListener(document.getElementsByName("search"));
	});
	document.querySelectorAll(".search-box, .vector-search-box").forEach(function (box) {
		x.observe(box, { subtree: true, childList: true });
	} );
} );
//</syntaxhighlight></onlyinclude>