User:Liangent/Scripts/cat-a-lot.uncompressed.js
外观
< User:Liangent | Scripts
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
// from http://commons.wikimedia.org/wiki/MediaWiki:Gadget-Cat-a-lot.js
// Variables
var cat_a_lot_mark_color = "#3399FF" ;
var cat_a_lot_api_url = "/w/api.php" ;
var cat_a_lot_edit_url = "/w/index.php?title=" ;
var cat_a_lot_divtype = 'div' ;
var cat_a_lot_classname = 'gallerytext' ;
var cat_a_lot_searchmode = false ;
String.prototype.trim = function () {
return this.replace (/^\s+|\s+$/g, "");
}
String.prototype.ucFirst = function () {
return this.substr(0,1).toUpperCase() + this.substr(1,this.length);
}
String.prototype.lcFirst = function () {
return this.substr(0,1).toLowerCase() + this.substr(1,this.length);
}
String.prototype.replaceAll = function ( s , r ) {
return this.split(s).join(r);
}
if ( wgNamespaceNumber == 14 ) {
// document.addEventListener("DOMContentLoaded", init_cat_a_lot, false);
addOnloadHook ( init_cat_a_lot ) ;
}
if ( wgNamespaceNumber == -1 && wgCanonicalSpecialPageName == "Search" ) {
cat_a_lot_divtype = 'table' ;
cat_a_lot_classname = 'searchResultImage' ;
cat_a_lot_searchmode = true ;
addOnloadHook ( init_cat_a_lot ) ;
}
// Add this to URLs to get around cache issues
function cat_a_lot_dummy_time() {
var t = new Date () ;
return "&dummytime=" + t.getTime() ;
}
function init_cat_a_lot () {
var c1_div = document.getElementById("column-one") ;
if (!c1_div) return;
c1_div.innerHTML += '<div id="cat_a_lot" style="z-index:9999;display:block;background-color:white; position:fixed; bottom:0; right:0;">' +
'<div class="cat_a_lot_data" id="cat_a_lot_data" style="display:none;border:1px solid black">' +
'<div style="border-bottom:1px solid black">' +
'<form name="cat_a_lot_searchcat" method="post" onSubmit="return false;">' +
'<input type="text" input="8" name="cat_a_lot_searchcatname" />' +
'<input type="submit" name="cat_a_lot_go" value="Go" onclick="cat_a_lot_search_cat();"/>' +
'</form>' +
'</div>' +
'<div class="cat_a_lot_category_list" id="cat_a_lot_category_list" style="border-bottom:1px solid black;max-height:500px;overflow:auto"> </div>' +
'<div class="cat_a_lot_mark_counter" id="cat_a_lot_mark_counter"> </div>' +
'<div class="cat_a_lot_selections" id="cat_a_lot_selections" style="border-top:1px solid black">Select ' +
'<a href="#" onClick="cat_a_lot_mark_all(' + "'2'" + ');">all</a> / ' +
'<a href="#" onClick="cat_a_lot_mark_all(' + "'3'" + ');">none</a>' +
'</div>' +
'<div>' +
'<a href="#" onclick ="cat_a_lot_remove()"><b>Remove from this category</b></a>' +
'</div>' +
'<form name="cat_a_lot_edit" enctype="multipart/form-data" method="post" target="_blank">' +
'<input type="hidden" name="wpTextbox1" />' +
'<input type="hidden" name="wpSummary" />' +
'<input type="hidden" name="wpDiff" value="wpDiff" />' +
'<input type="hidden" name="wpStarttime" />' +
'<input type="hidden" name="wpEdittime" />' +
'</form>' +
'</div>' +
'<div id="cat_a_lot_head" class="pBody">' +
'<form><input id="cat_a_lot_mode" type="checkbox" onchange="run_cat_a_lot();"/><label for="cat_a_lot_mode">Cat-a-lot mode</label></form>' +
'</div></div>' ;
}
function cat_a_lot_get_marked_labels () {
var ret = new Array () ;
var divs = document.getElementsByTagName ( cat_a_lot_divtype ) ;
for ( i = 0 ; i < divs.length ; i++ ) {
if ( divs[i].className != cat_a_lot_classname ) continue ;
if ( divs[i].style.backgroundColor == "" ) continue ;
var files = divs[i].getElementsByTagName ( "a" ) ;
var t = files[0].title ;
if ( cat_a_lot_searchmode ) t = "File:" + t ;
ret.push ( t ) ;
}
return ret ;
}
function cat_a_lot_update_selection_counter () {
var cat_a_lot_mark_counter = document.getElementById("cat_a_lot_mark_counter") ;
var l = cat_a_lot_get_marked_labels () ;
cat_a_lot_mark_counter.innerHTML = l.length + " files selected." ;
}
function cat_a_lot_on_click_label ( title ) {
cat_a_lot_alter_label ( title , "onclick" ) ;
}
function cat_a_lot_invalidate_label ( title , mode ) {
cat_a_lot_alter_label ( title , mode ) ;
}
function cat_a_lot_alter_label ( title , mode ) {
var divs = document.getElementsByTagName ( cat_a_lot_divtype ) ;
for ( i = 0 ; i < divs.length ; i++ ) {
if ( divs[i].className != cat_a_lot_classname ) continue ;
var files = divs[i].getElementsByTagName ( "a" ) ;
if ( files.length == 0 ) continue ;
if ( files[0].title != title ) continue ;
if ( mode == "move" ) {
divs[i].innerHTML = "<div style='width:100%;color:white;background-color:red;text-align:center'>Moved to new category</div>" ;
divs[i].style.backgroundColor = "#FF0000" ;
} else if ( mode == "remove" ) {
divs[i].innerHTML = "<div style='width:100%;color:white;background-color:red;text-align:center'>Removed from category</div>" ;
divs[i].style.backgroundColor = "#FF0000" ;
} else if ( mode == "copy" ) {
divs[i].innerHTML += "<br/><b>Copied to new category!</b>" ;
}
// Clicked on this element
if ( divs[i].style.backgroundColor != "" ) {
divs[i].style.backgroundColor = "" ;
} else {
divs[i].style.backgroundColor = cat_a_lot_mark_color ;
}
cat_a_lot_update_selection_counter () ;
return ;
}
}
function cat_a_lot_fix_quotes ( text , quote ) {
return text.split(quote).join("\\"+quote) ;
}
function cat_a_lot_mark_all ( how ) {
var divs = document.getElementsByTagName ( cat_a_lot_divtype ) ;
for ( i = 0 ; i < divs.length ; i++ ) {
if ( divs[i].className != cat_a_lot_classname ) continue ;
var files = divs[i].getElementsByTagName ( "a" ) ;
if ( files.length == 0 ) continue ;
divs[i].style.backgroundColor = "" ; // Deselect
if ( how == 1 ) { // Activate
if ( cat_a_lot_searchmode )
divs[i] = divs[i].getElementsByTagName('div')[0] ;
eval("divs[i].onclick = function () { cat_a_lot_on_click_label('" + cat_a_lot_fix_quotes ( files[0].title , "'" ) + "'); };") ;
} else if ( how == 2 ) { // Select
divs[i].style.backgroundColor = cat_a_lot_mark_color ;
} else if ( how == 0 ) { // Deactivate
divs[i].onclick = "" ;
}
}
cat_a_lot_update_selection_counter () ;
}
function cat_a_lot_get_subcategories () {
var url = cat_a_lot_api_url + "?action=query&format=xml&list=categorymembers&cmnamespace=14&cmlimit=50&cmtitle=Category:" + cat_a_lot_current_category + cat_a_lot_dummy_time() ;
var xmlreq = new XMLHttpRequest() ;
xmlreq.open ( "GET" , url , false ) ;
xmlreq.send ( null ) ;
xml = xmlreq.responseXML ;
var cls = xml.getElementsByTagName('cm') ;
var ret = new Array () ;
for ( var i = 0 ; i < cls.length ; i++ ) {
var title = cls[i].getAttribute('title');
title = title.split(":",2)[1] ;
ret.push ( title ) ;
}
return ret ;
}
function cat_a_lot_get_parent_categories () {
var url = cat_a_lot_api_url + "?action=query&format=xml&prop=categories&titles=Category:" + cat_a_lot_current_category + cat_a_lot_dummy_time() ;
var xmlreq = new XMLHttpRequest() ;
xmlreq.open ( "GET" , url , false ) ;
xmlreq.send ( null ) ;
xml = xmlreq.responseXML ;
var cls = xml.getElementsByTagName('cl') ;
var ret = new Array () ;
for ( var i = 0 ; i < cls.length ; i++ ) {
var title = cls[i].attributes.getNamedItem("title").value ;
title = title.split(":",2)[1] ;
ret.push ( title ) ;
}
return ret ;
}
function cat_a_lot_replace_category ( text , sourcecat , targetcat , catname , ending ) {
// alert ( "[[" + catname + ":" + sourcecat + ending + " : " + "[[" + "Category:" + targetcat + ending ) ;
return text.replaceAll ( "[[" + catname + ":" + sourcecat + ending , "[[" + "Category:" + targetcat + ending ) ;
}
function cat_a_lot_fix_time ( time ) {
time = time.replace ( /:/g , "" ) ;
time = time.replace ( / /g , "" ) ;
time = time.replace ( /-/g , "" ) ;
time = time.replace ( /Z/g , "" ) ;
time = time.replace ( /T/g , "" ) ;
return time ;
}
function cat_a_lot_get_article_timestamp ( title ) {
var ret ;
var url = cat_a_lot_api_url + '?action=query&format=xml&prop=revisions&rvprop=timestamp&titles=' + title ;
var xmlreq = new XMLHttpRequest() ;
xmlreq.open ( "GET" , url , false ) ;
xmlreq.send ( null ) ;
var xml = xmlreq.responseXML ;
var rev = xml.getElementsByTagName('rev') ;
if ( rev.length == 0 ) return cat_a_lot_get_current_utc_timestamp () ;
ret = rev.item(0).getAttribute('timestamp') ;
ret = cat_a_lot_fix_time ( ret ) ;
return ret
}
function cat_a_lot_remove_category ( text , sourcecat , cat , ending ) {
text = " " + text ;
var parts = text.split ( "[[" + cat + ":" + sourcecat + ending ) ;
if ( parts.length == 1 ) return text.trim() ; // Not found
text = parts.shift () ;
while ( parts.length > 0 ) {
var s = parts.shift () ;
if ( ending == "|" ) s = s.split("]]",2).pop () ;
text += s ;
}
return text.trim() ;
}
function cat_a_lot_edit_move ( filename , targetcat , mode ) {
var sourcecat = wgTitle ;
var url = cat_a_lot_edit_url + filename + "&action=raw" + cat_a_lot_dummy_time() ;
var xmlreq = new XMLHttpRequest() ;
xmlreq.open ( "GET" , url , false ) ;
xmlreq.send ( null ) ;
var otext = xmlreq.responseText.trim() ;
// Check if that file is already in that category
if ( mode != "remove" ) {
if ( otext.indexOf ( "ategory:" + targetcat.ucFirst() ) != -1 ||
otext.indexOf ( "ategory:" + targetcat.lcFirst() ) != -1 ) {
alert ( filename + " is already in category " + targetcat + " - skipping." ) ;
return ;
}
}
// Fix text
var text = otext ;
if ( mode == 'copy' ) {
text += "\n[[" + "Category:" + targetcat + "]]\n" ;
} else if ( mode == 'move' ) {
text = cat_a_lot_replace_category ( text , sourcecat.ucFirst() , targetcat , "category" , "]]" ) ;
text = cat_a_lot_replace_category ( text , sourcecat.lcFirst() , targetcat , "category" , "]]" ) ;
text = cat_a_lot_replace_category ( text , sourcecat.ucFirst() , targetcat , "Category" , "]]" ) ;
text = cat_a_lot_replace_category ( text , sourcecat.lcFirst() , targetcat , "Category" , "]]" ) ;
text = cat_a_lot_replace_category ( text , sourcecat.ucFirst() , targetcat , "category" , "|" ) ;
text = cat_a_lot_replace_category ( text , sourcecat.lcFirst() , targetcat , "category" , "|" ) ;
text = cat_a_lot_replace_category ( text , sourcecat.ucFirst() , targetcat , "Category" , "|" ) ;
text = cat_a_lot_replace_category ( text , sourcecat.lcFirst() , targetcat , "Category" , "|" ) ;
} else if ( mode == 'remove' ) {
text = cat_a_lot_remove_category ( text , sourcecat.ucFirst() , "category" , "]]" ) ;
text = cat_a_lot_remove_category ( text , sourcecat.lcFirst() , "category" , "]]" ) ;
text = cat_a_lot_remove_category ( text , sourcecat.ucFirst() , "category" , "|" ) ;
text = cat_a_lot_remove_category ( text , sourcecat.lcFirst() , "category" , "|" ) ;
text = cat_a_lot_remove_category ( text , sourcecat.ucFirst() , "Category" , "]]" ) ;
text = cat_a_lot_remove_category ( text , sourcecat.lcFirst() , "Category" , "]]" ) ;
text = cat_a_lot_remove_category ( text , sourcecat.ucFirst() , "Category" , "|" ) ;
text = cat_a_lot_remove_category ( text , sourcecat.lcFirst() , "Category" , "|" ) ;
}
if ( text == otext ) {
alert ( "Could not find an occurrence of category " + sourcecat + " in description of file " + filename + " - skipping." ) ;
return ;
}
var time = new Date () ;
var last_version_timestamp = cat_a_lot_get_article_timestamp ( filename ) ;
var starttime = cat_a_lot_get_current_utc_timestamp () ;
var comment ;
if ( mode == "move" ) comment = "Moving from [[" + "Category:" + sourcecat + "]] to [[" + "Category:" + targetcat + "]]" ;
if ( mode == "copy" ) comment = "Copying from [[" + "Category:" + sourcecat + "]] to [[" + "Category:" + targetcat + "]]" ;
if ( mode == "remove" ) comment = "Removing from [[" + "Category:" + sourcecat + "]]" ;
url = cat_a_lot_edit_url + filename + "&action=edit" ;
document.cat_a_lot_edit.action = url ;
document.cat_a_lot_edit.wpSummary.value = comment ;
document.cat_a_lot_edit.wpTextbox1.value = text ;
document.cat_a_lot_edit.wpStarttime.value = starttime ;
document.cat_a_lot_edit.wpEdittime.value = last_version_timestamp ;
document.cat_a_lot_edit.submit () ;
cat_a_lot_invalidate_label ( filename , mode ) ;
}
// Generates current timestamp
function cat_a_lot_get_current_utc_timestamp () {
var today=new Date() ;
var y = "00" + today.getUTCFullYear() ;
var mo = today.getUTCMonth() + 1 ;
var d = "00" + today.getUTCDate() ;
mo = "00" + mo ;
var h = "00" + today.getUTCHours() ;
var m = "00" + today.getUTCMinutes() ;
var s = "00" + today.getUTCSeconds() ;
var ret = "" ;
ret += y.substr ( y.length - 4 ) ;
ret += mo.substr ( mo.length - 2 ) ;
ret += d.substr ( d.length - 2 ) ;
ret += h.substr ( h.length - 2 ) ;
ret += m.substr ( m.length - 2 ) ;
ret += s.substr ( s.length - 2 ) ;
return ret ;
}
function cat_a_lot_move_here ( targetcat ) {
cat_a_lot_do_something ( targetcat , 'move' ) ;
}
function cat_a_lot_copy_here ( targetcat ) {
cat_a_lot_do_something ( targetcat , 'copy' ) ;
}
function cat_a_lot_remove () {
cat_a_lot_do_something ( '' , 'remove' ) ;
}
function cat_a_lot_do_something ( targetcat , mode ) {
var files = cat_a_lot_get_marked_labels () ;
if ( files.length == 0 ) {
alert ( "No files selected." ) ;
return ;
}
for ( var i = 0 ; i < files.length ; i++ ) {
cat_a_lot_edit_move ( files[i] , targetcat , mode ) ;
}
}
function cat_a_lot_get_cat_links ( symbol , list ) {
var ret = "" ;
list.sort () ;
for ( var i = 0 ; i < list.length ; i++ ) {
ret += "<tr style='border:1px solid #AAAAAA'><td>" + symbol + "</td><td>" ;
ret += '<a href="#" onclick ="cat_a_lot_update_cats(\'' + list[i] + '\')">' + list[i] + '</a>' ;
ret += "</td><td>" ;
if ( list[i] != wgTitle ) { // Can't move to source category
ret += '<a href="#" onclick ="cat_a_lot_move_here(\'' + list[i] + '\')"><b>Move</b></a> ' ;
ret += '<a href="#" onclick ="cat_a_lot_copy_here(\'' + list[i] + '\')"><b>Copy</b></a>' ;
}
ret += "</td></tr>" ;
}
return ret ;
}
function cat_a_lot_show_category_list () {
var parcats = cat_a_lot_get_parent_categories () ;
var subcats = cat_a_lot_get_subcategories () ;
var thiscat = new Array () ;
thiscat.push ( cat_a_lot_current_category ) ;
var out = "<table border='0'>" ;
out += cat_a_lot_get_cat_links ( "↑" , parcats ) ;
out += cat_a_lot_get_cat_links ( "→" , thiscat ) ;
out += cat_a_lot_get_cat_links ( "↓" , subcats ) ;
out += "</table>" ;
catlist = document.getElementById("cat_a_lot_category_list") ;
catlist.innerHTML = out ;
document.body.style.cursor = 'auto' ;
}
function cat_a_lot_update_cats ( newcat ) {
document.body.style.cursor = 'wait' ;
cat_a_lot_current_category = newcat ;
catlist = document.getElementById("cat_a_lot_category_list") ;
catlist.innerHTML = '<div style="background-color:red;color:white">Loading...</div>' ;
window.setTimeout("cat_a_lot_show_category_list()", 0);
}
function cat_a_lot_search_cat() {
var newcat = document.cat_a_lot_searchcat.cat_a_lot_searchcatname.value ;
cat_a_lot_update_cats ( newcat ) ;
}
function run_cat_a_lot () {
cat_a_lot_data = document.getElementById("cat_a_lot_data") ;
cat_a_lot_mode = document.getElementById("cat_a_lot_mode").checked ;
if ( cat_a_lot_mode == false ) {
cat_a_lot_data.style.display = "none" ;
cat_a_lot_mark_all ( 0 ) ;
} else {
cat_a_lot_mark_all ( 1 ) ;
cat_a_lot_data.style.display = "block" ;
if ( cat_a_lot_searchmode ) cat_a_lot_update_cats ( "Pictures and images" ) ;
else cat_a_lot_update_cats ( wgTitle ) ;
}
}