User:Horologium/vector.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | The accompanying .css page for this skin is at User:Horologium/vector.css. |
/*
* Script to add namespace selector to Special:LinkSearch
* By MastCell
* Leverages code from a variety of sources, including ^demon's old CSD-rationale script
* ------
* TO DO:
* - Add comments
* - Namespace scoping/protection
* - Fix resulting wikilinks for secure server
*/
importScript('User:MastCell/api.js');
function addSelectAfter() {
var obj = document.getElementById('target');
// create select using included array
var sel = fillSelect();
sel.name = "nsOptions";
sel.id = "nsOptions";
sel.style.marginLeft = "10px";
// check for next sibling and insert before it or at the end
if (obj.nextSibling) {
obj.parentNode.insertBefore(sel, obj.nextSibling);
} else {
obj.parentNode.appendChild(sel);
}
}
function fillSelect() {
var namespaceList = [ {
"value" : "-99",
"display" : "All namespaces"
}, {
"value" : "0",
"display" : "Article"
}, {
"value" : "1",
"display" : "Talk"
}, {
"value" : "2",
"display" : "User"
}, {
"value" : "3",
"display" : "User Talk"
}, {
"value" : "4",
"display" : "Wikipedia"
}, {
"value" : "5",
"display" : "Wikipedia Talk"
}, {
"value" : "6",
"display" : "Image"
}, {
"value" : "7",
"display" : "Image Talk"
}, {
"value" : "8",
"display" : "MediaWiki"
}, {
"value" : "9",
"display" : "MediaWiki Talk"
}, {
"value" : "10",
"display" : "Template"
}, {
"value" : "11",
"display" : "Template Talk"
}, {
"value" : "12",
"display" : "Help"
}, {
"value" : "13",
"display" : "Help Talk"
}, {
"value" : "14",
"display" : "Category"
}, {
"value" : "15",
"display" : "Category Talk"
} ];
var sel = document.createElement("select");
sel.disabled = false;
for (var i = 0; i < namespaceList.length; i++) {
var opt = new Option(namespaceList[i].display, namespaceList[i].value);
// catches stupid IE error
if (opt.innerHTML != namespaceList[i].display) {
opt.innerHTML = namespaceList[i].display;
}
sel.appendChild(opt);
}
return sel;
}
function addEvent(obj, evType, fn, useCapture) {
if (obj.addEventListener) {
obj.addEventListener(evType, fn, useCapture);
return true;
} else if (obj.attachEvent) {
var r = obj.attachEvent("on" + evType, fn);
return r;
} else {
alert("Handler could not be attached");
}
}
function addSearchEventHandler() {
var linksearchForm = document.getElementById("mw-linksearch-form");
addEvent(linksearchForm, "submit", handleFormSubmission, true);
}
function handleFormSubmission(event) {
// Prevent default form submission (cross-browser)
if (event.preventDefault){
event.preventDefault();
} else {
event.returnValue = false;
}
// Disable the search button; will be re-enabled when AJAX query completes
document.getElementById("linksearch-submit-button").disabled = true;
var targetLink = document.getElementById("target").value;
var localAPI = JsMwApi();
var namespaceOpt = document.getElementById("nsOptions").value;
if (namespaceOpt == -99) {
localAPI({action: "query", list: "exturlusage", euquery: targetLink, eulimit: "1000"}, processELresults);
} else {
localAPI({action: "query", list: "exturlusage", euquery: targetLink, eulimit: "1000", eunamespace: namespaceOpt}, processELresults);
}
}
function processELresults(result) {
// Create a list for the results
var resultList = document.createElement("OL");
resultList.setAttribute("name", "result-list");
resultList.setAttribute("id", "result-list");
resultList.setAttribute("start", "1");
resultList.setAttribute("class", "special");
// Clear out the old list, if one exists
if (document.getElementById("result-list")) {
document.getElementById("result-list").parentNode.removeChild(document.getElementById("result-list"));
}
// Put the new list into the DOM
var elForm = document.getElementById("mw-linksearch-form");
if (elForm.nextSibling) {
elForm.parentNode.insertBefore(resultList, elForm.nextSibling);
} else {
elForm.parentNode.appendChild(resultList);
}
// If there are no links in the given namespace, say so
if (result.query.exturlusage.length == 0) {
var noneFound = "No links to ";
noneFound += document.getElementById("target").value;
noneFound += " were found in this namespace.";
resultList.innerHTML = noneFound;
} else {
// Fill up the list of links
for (var i = 0; i < result.query.exturlusage.length; i++) {
var nextListElem = document.createElement("LI");
var listItemContent = "<a href=\"";
listItemContent += result.query.exturlusage[i].url;
listItemContent += "\" class=\"external\">";
listItemContent += result.query.exturlusage[i].url;
listItemContent += "</a> is linked from <a href=\"/wiki/";
listItemContent += encodeURI(result.query.exturlusage[i].title);
listItemContent += "\" title=\"";
listItemContent += result.query.exturlusage[i].title;
listItemContent += "\">";
listItemContent += result.query.exturlusage[i].title;
listItemContent += "</a>";
nextListElem.innerHTML = listItemContent;
resultList.appendChild(nextListElem);
}
}
// Re-enable the search button
document.getElementById("linksearch-submit-button").disabled = false;
}
function attachIdToSubmitButton() {
// Will need to be able to access the submit button quickly, so attach an id
var formVar = document.getElementById("mw-linksearch-form");
for (var i = 0; i < formVar.elements.length; i++) {
if (formVar.elements[i].type == "submit") {
formVar.elements[i].setAttribute("id", "linksearch-submit-button");
formVar.elements[i].disabled = false;
}
}
}
$(function() {
if (mw.config.get('wgPageName') == "Special:LinkSearch") {
attachIdToSubmitButton();
addSelectAfter();
addSearchEventHandler();
}
});
//<pre>
//This function adds a link to the toolbox which, when clicked, displays the size of the page
//and the size of the prose. See the talk page for more details.
//
//To use this function add {{subst:js|User:Dr pda/prosesize.js}} to your monobook.js
//
function loadXMLDocPassingTemplate(url,handler, page)
{
// branch for native XMLHttpRequest object
if (window.XMLHttpRequest) {
var req = new XMLHttpRequest();
}
// branch for IE/Windows ActiveX version
else if (window.ActiveXObject) {
var req = new ActiveXObject("Microsoft.XMLHTTP");
}
if (req) {
req.onreadystatechange = function () {handler(req, page)};
req.open("GET", url, true);
req.send("");
}
}
function getWikiText(req, page) {
// only if req shows "loaded"
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {
// ...processing statements go here...
response = req.responseXML.documentElement;
var rev = response.getElementsByTagName('rev');
if(rev.length > 0){
result = rev[0].getAttribute('size');
if(result > 10240){
result = (result/1024).toFixed(0)+' kB';
}
else{
result = result+' B';
}
wiki_value = document.createElement("li");
wiki_value.id = "wiki-size";
wiki_value.innerHTML = '<b>Wiki text: </b>'+result;
var output = document.getElementById("document-size-stats");
prose_value = document.getElementById("prose-size");
output.insertBefore(wiki_value,prose_value);
}
else{
//alert("There was a problem using the Wikipedia Search to find the wiki text size\nEither the search is not working or the correct article did not appear on the first page of results");
wiki_value = document.createElement("li");
wiki_value.id = "wiki-size";
wiki_value.innerHTML = '<b>Wiki text: </b>Problem getting wiki text size';
var output = document.getElementById("document-size-stats");
prose_value = document.getElementById("prose-size");
output.insertBefore(wiki_value,prose_value);
}
} else {
alert("There was a problem retrieving the XML data:\n" +
req.statusText);
}
}
}
function getFileSize(req, page) {
// only if req shows "loaded"
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {
// ...processing statements go here...
var fsize = req.responseText.length;
window.status = fsize;
var total_value = document.createElement("li");
total_value.id = "total-size";
total_value.innerHTML='<b>File size: </b>'+(fsize/1024).toFixed(0)+' kB';
var output = document.getElementById("document-size-stats");
var prose_html_value = document.getElementById("prose-size-html");
output.insertBefore(total_value,prose_html_value);
} else {
alert("There was a problem retrieving the XML data:\n" +
req.statusText + "\n(" + url + ")");
}
}
}
function getLength(id){
var textLength = 0;
for(var i=0;i<id.childNodes.length; i++){
if(id.childNodes[i].nodeName == '#text'){
textLength += id.childNodes[i].nodeValue.length;
}
else if(id.childNodes[i].id == 'coordinates' || id.childNodes[i].className.indexOf('emplate') != -1){
//special case for {{coord}} and {{fact}}-like templates
//Exclude from length, and don't set background yellow
id.childNodes[i].style.cssText = 'background-color:white';
}
else{
textLength += getLength(id.childNodes[i]);
}
}
return textLength;
}
function getRefMarkLength(id,html){
var textLength = 0;
for(var i=0;i<id.childNodes.length; i++){
if(id.childNodes[i].className == 'reference'){
textLength += (html)? id.childNodes[i].innerHTML.length : getLength(id.childNodes[i]);
}
}
return textLength;
}
function getDocumentSize(){
contentDivName = '';
if(skin == 'vector' || skin == 'monobook' || skin == 'chick' || skin == 'myskin' || skin == 'simple'){
contentDivName = 'bodyContent';
}
else if (skin == 'modern'){
contentDivName = 'mw_contentholder';
}
else if (skin == 'standard' || skin == 'cologneblue' || skin == 'nostalgia'){
contentDivName = 'article';
}
else{
//fallback case; the above covers all currently existing skins
contentDivName = 'bodyContent';
}
//Same for all skins if previewing page
if(mw.config.get('wgAction') == 'submit') contentDivName = 'wikiPreview';
var bodyContent = document.getElementById(contentDivName);
if(document.getElementById("document-size-stats")){
//if statistics already exist, turn them off and remove highlighting
var output = document.getElementById("document-size-stats");
var oldStyle = output.className;
var pList = bodyContent.getElementsByTagName("p");
for(var i=0;i<pList.length; i++){
if(pList[i].parentNode.id == contentDivName) pList[i].style.cssText = oldStyle;
}
output.parentNode.removeChild(output);
var header = document.getElementById("document-size-header");
header.parentNode.removeChild(header);
}
else{
var output = document.createElement("ul");
output.id = "document-size-stats";
var prose_html_value = document.createElement("li");
prose_html_value.id = "prose-size-html";
output.appendChild(prose_html_value);
var ref_html_value = document.createElement("li");
ref_html_value.id = "ref-size-html";
output.appendChild(ref_html_value);
var prose_value = document.createElement("li");
prose_value.id = "prose-size";
output.appendChild(prose_value);
output.className = bodyContent.getElementsByTagName("p").item(0).style.cssText;
var ref_value = document.createElement("li");
ref_value.id = "ref-size";
output.appendChild(ref_value);
var dummy = document.getElementById("siteSub");
dummy.parentNode.insertBefore(output, dummy.nextSibling);
var header = document.createElement("span");
header.id = "document-size-header";
header.innerHTML = '<br/>Document statistics: <small><i>(See <a href="http://en.wikipedia.org/wiki/User_talk:Dr_pda/prosesize.js">here</a> for details.)<i></small>';
dummy.parentNode.insertBefore(header,output);
//File size not well defined for preview mode or section edit
if(mw.config.get('wgAction') != 'submit'){
//If browser supports document.fileSize property (IE)
if(document.fileSize){
var total_value = document.createElement("li");
total_value.id = "total-size";
total_value.innerHTML='<b>File size: </b>'+(document.fileSize/1024).toFixed(0)+' kB';
output.insertBefore(total_value,prose_html_value);
}
else{
loadXMLDocPassingTemplate(location.pathname,getFileSize,'')
}
}
//Get size of images only if browser supports filesize property (IE)
var iList = bodyContent.getElementsByTagName("img");
if(iList.length >0 && iList[0].fileSize){
//Get size of images included in document
var image_size = 0;
var first_magnify = true;
for (var i=0;i<iList.length; i++){
var im = iList[i];
if(im.getAttribute("src").indexOf("magnify-clip.png") != -1){
if(first_magnify){
image_size += im.fileSize*1;
first_magnify = false;
}
}
else{
image_size += im.fileSize*1;
}
}
var image_value = document.createElement("li");
image_value.id = "image-size";
image_value.innerHTML='<b>Images: </b>'+(image_size/1024).toFixed(0)+' kB';
output.appendChild(image_value);
}
//Calculate prose size and size of reference markers ([1] etc)
var pList = bodyContent.getElementsByTagName("p");
prose_size = 0;
prose_size_html = 0;
refmark_size = 0;
refmark_size_html = 0;
word_count = 0;
for(var i=0;i<pList.length; i++){
var para = pList[i];
if(para.parentNode.id == contentDivName){
prose_size += getLength(para);
prose_size_html += para.innerHTML.length;
refmark_size += getRefMarkLength(para,false);
refmark_size_html += getRefMarkLength(para,true);
word_count += para.innerHTML.replace(/(<([^>]+)>)/ig,"").split(' ').length
para.style.cssText = "background-color:yellow";
}
}
if((prose_size-refmark_size)>10240){
prose_value.innerHTML='<b>Prose size (text only): </b>'+((prose_size-refmark_size)/1024).toFixed(0)+' kB ('+word_count+' words) "readable prose size"';
}
else{
prose_value.innerHTML='<b>Prose size (text only): </b>'+(prose_size-refmark_size)+' B ('+word_count+' words) "readable prose size"';
}
if((prose_size_html-refmark_size_html)>10240){
prose_html_value.innerHTML='<b>Prose size (including all HTML code): </b>'+((prose_size_html-refmark_size_html)/1024).toFixed(0)+' kB';
}
else{
prose_html_value.innerHTML='<b>Prose size (including all HTML code): </b>'+(prose_size_html-refmark_size_html)+' B';
}
//Calculate size of references (i.e. output of <references/>)
var rList = bodyContent.getElementsByTagName("ol");
var ref_size = 0;
var ref_size_html = 0;
for (var i=0; i<rList.length; i++){
if(rList[i].className == "references"){
ref_size = getLength(rList[i]);
ref_size_html = rList[i].innerHTML.length;
}
}
if((ref_size+refmark_size)>10240){
ref_value.innerHTML='<b>References (text only): </b>'+((ref_size+refmark_size)/1024).toFixed(0)+' kB';
}
else{
ref_value.innerHTML='<b>References (text only): </b>'+(ref_size+refmark_size)+' B';
}
if((ref_size_html+refmark_size_html)>10240){
ref_html_value.innerHTML='<b>References (including all HTML code): </b>'+((ref_size_html+refmark_size_html)/1024).toFixed(0)+' kB';
}
else{
ref_html_value.innerHTML='<b>References (including all HTML code): </b>'+(ref_size_html+refmark_size_html)+' B';
}
//get correct name of article from wikipedia-defined global variables
var pageNameUnderscores = mw.config.get('wgPageName');
var pageNameSpaces = pageNameUnderscores.replace(/_/g,' ')
//if page is a permalink, diff, etc don't try to search
if(!location.pathname.match('/w/index.php')){
//Get revision size from API
var searchURL = mw.config.get('wgScriptPath') + '/api.php?action=query&prop=revisions&rvprop=size&format=xml&revids=' + mw.config.get('wgCurRevisionId');
loadXMLDocPassingTemplate(searchURL,getWikiText,pageNameSpaces);
}
else if(mw.config.get('wgAction') == 'submit'){
//Get size of text in edit box
result = document.getElementById('wpTextbox1').value.length;
if(result > 10240){
result = (result/1024).toFixed(0)+' kB';
}
else{
result = result+' B';
}
wiki_value = document.createElement("li");
wiki_value.id = "wiki-size";
wiki_value.innerHTML = '<b>Wiki text: </b>'+result;
var output = document.getElementById("document-size-stats");
prose_value = document.getElementById("prose-size");
output.insertBefore(wiki_value,prose_value);
}
}
}
$(function () {
if(mw.config.get('wgAction') == 'edit' || (mw.config.get('wgAction') == 'submit' && document.getElementById('wikiDiff')) ){
mw.util.addPortletLink('p-tb', 'javascript:alert("You need to preview the text for the prose size script to work in edit mode.")', 'Page size', 't-page-size', 'Calculate page and prose size', '', '');
document.getElementById("t-page-size").firstChild.style.cssText = "color:black;"
}
else if(mw.config.get('wgAction') == 'view' || mw.config.get('wgAction') == 'submit' || mw.config.get('wgAction') == 'purge'){
mw.util.addPortletLink('p-tb', 'javascript:getDocumentSize()', 'Page size', 't-page-size', 'Calculate page and prose size', '', '');
}
});
//</pre>
importScript('User:AzaToth/twinkle.js');
importScript('User:Smith609/toolbox.js');
importScript('User:Writ Keeper/Scripts/orangeBar.js'); //Linkback: [[User:Writ Keeper/Scripts/orangeBar.js]]