Benutzer:Lustiger seth/unsigned.js
aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen
Zur Suche springen
Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.
- Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
- Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
- Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
/* ******** unsigned.js ******** */ // // Usage: // * see http://de.wikipedia.org/wiki/user_talk:lustiger_seth/unsigned.js#Benutzung // Just put the following line // mw.loader.load('//de.wikipedia.org/w/index.php?title=user:lustiger_seth/unsigned.js&action=raw&ctype=text/javascript&smaxage=2678400'); // without the beginning "// " to your [[Special:MyPage/common.js]] (or [[m:Special:MyPage/global.js]]) // // Description: // * MARK SEMI-AUTOMATICALLY UNSIGNED COMMENTS ON TALK PAGES // // Authors: // * based on [[user:Olliminatore/unsigned.js]] (old and buggy version 1.3) which was based on [[:en:User:Invitatious/unsigned2.js]]. // * updated/changed by [[user:lustiger_seth|seth]] // // New features in this version (compared to [[user:Olliminatore/unsigned.js]]): // * You can now choose any signature (it doesn't need to be one of the last 10 any longer). Used signatures will be marked. Some bugfixes, see history (here and monobook.js) and talk page. // * compatible with vector and monobook // //<pre><nowiki> // Dual-licensed under the terms of the GFDL v1.2 or the GPL v2. if(mw.config.get('wgNamespaceNumber')>0&& (mw.config.get('wgAction')==='edit' ||mw.config.get('wgAction')==='submit')){ varssubst=(typeofssubst=='undefined'||ssubst)?'subst:':''; varmax_history_entries= (typeofmax_history_entries!='number' ||max_history_entries>36 ||max_history_entries<1)?36:max_history_entries; vardisplay_used=(display_used!=0&&display_used!=1)?1:display_used; varmax_nofe=500;// number of fetched edits functionget_last_sunday_of_month(year,month){ varlast_sunday=-1; vard=newDate(year,month,22); for(varday=1;month==d.getUTCMonth();++day){ if(d.getDay()==0)last_sunday=22-1+day; d=newDate(Date.UTC(year,month,22,0,0,0)+day*24*60*60*1000); } returnlast_sunday; } // is_daylight_saving_time functionis_dst(year,month,day,hours){ varto_check=Date.UTC(year,month,day,hours,0,0); // 2 = march varbegin_dst=Date.UTC(year,2,get_last_sunday_of_month(year,2),1,0,0); // 9 = october varend_dst=Date.UTC(year,9,get_last_sunday_of_month(year,9),1,0,0); return(begin_dst<=to_check&&to_check<end_dst); } functionis_elem_of_arr(elem,arr){ for(vari=0;i<arr.length;++i){ if(arr[i]==elem) return1; } return0; } functionget_all_sig_dates_from_textarea(){ varsigs=newArray(); if(document.editform){ vartxtarea=document.editform.wpTextbox1.value; // localizable strings start if(mw.config.get('wgContentLanguage')=='de') sigs=txtarea.match(/\d?\d[:.]\d\d, \d?\d\. (?:jan|feb|mär|apr|mai|jun|jul|aug|sep|okt|nov|dez)\.? 2\d{3}(?: \(CES?T\))?|2\d{3}-\d\d-\d\d[T ]?\d\d:\d\d(?:Z|[-+]\d\d:\d\d)?/gi); else sigs=txtarea.match(/\d?\d[:.]\d\d, \d?\d (?:january|february|march|april|may|june|july|august|september|october|november|december) 2\d{3}(?: \(UTC\))?|2\d{3}-\d\d-\d\d[T ]?\d\d:\d\d(?:Z|[-+]\d\d:\d\d)?/gi); // localizable strings end } return(sigs==null)?newArray():sigs; } functionsig2ms(sigs){ varsigs_ms=newArray(); varmonths=newObject(); varre_normal; // localizable strings start if(mw.config.get('wgContentLanguage')=='de'){ months["jan"]=1; months["feb"]=2; months["mär"]=3; months["apr"]=4; months["mai"]=5; months["jun"]=6; months["jul"]=7; months["aug"]=8; months["sep"]=9; months["okt"]=10; months["nov"]=11; months["dez"]=12; re_normal=/(\d?\d)[:.](\d\d), (\d?\d)\. (jan|feb|mär|apr|mai|jun|jul|aug|sep|okt|nov|dez)\.? (2\d{3})((?: \((?:UTC|CES?T)\))?)/i; }else{ months["january"]=1; months["february"]=2; months["march"]=3; months["april"]=4; months["may"]=5; months["june"]=6; months["july"]=7; months["august"]=8; months["september"]=9; months["october"]=10; months["november"]=11; months["december"]=12; re_normal=/(\d?\d)[:.](\d\d), (\d?\d) (january|february|march|april|may|june|july|august|september|october|november|december) (2\d{3})((?: \(UTC\))?)/i; } // localizable strings end varre_iso=/(2\d{3})-(\d\d)-(\d\d)[T ]?(\d\d):(\d\d)((?:Z|[-+]\d\d:\d\d)?)/; varyear,month,day,h,min,date_obj,offset; for(vari=0;i<sigs.length;++i){ if(re_normal.exec(sigs[i])){ h=RegExp.1ドル; min=RegExp.2ドル; day=RegExp.3ドル; month=RegExp.4ドル; month=months[month.toLowerCase()]; year=RegExp.5ドル; offset=RegExp.6ドル; offset=(offset==' (CEST)')?2: ((offset==' (CET)')?1: ((offset==' (UTC)')?0: '?')); }elseif(re_iso.exec(sigs[i])){ year=RegExp.1ドル; month=RegExp.2ドル; day=RegExp.3ドル; h=RegExp.4ドル; min=RegExp.5ドル; offset=RegExp.6ドル; offset=(offset=='Z')?0: ((offset=='')?'?': ((offset.substr(0,1)=='-')?-1:1 )*((1*offset.substr(1,2))+(offset.substr(4,2)/60))); } date_obj=newDate(year,month-1,day,h,min,0); if(offset=='?'){ sigs_ms.push(date_obj.getTime()-1*60*60*1000); sigs_ms.push(date_obj.getTime()-2*60*60*1000); }else sigs_ms.push(date_obj.getTime()-offset*60*60*1000); } returnsigs_ms; } functiontimestamp2ms(t){ varyear=t.substring(0,4); varmonth=t.substring(4,6); varday=(t.substring(6,8)-0); varhours=parseInt(t.substring(8,10),10); varmin=parseInt(t.substring(10,12),10); ms=newDate(year,month-1,day,hours,min,0).getTime(); returnms; } functionaddSigWikiCode(){ // from rev 28011729 of // [[:en:Wikipedia:WikiProject_User_scripts/Scripts/Get_tidy_title]] functionaswcGet_tidy_title(){// get the URL version of the page title vareditlk= document.getElementById('ca-edit').getElementsByTagName('a')[0].href; // cut everything up to "title=" from the start and everything past // "&action=edit" from the end editlk=editlk.substring( editlk.indexOf('title=')+6, editlk.lastIndexOf('&action=edit') ); returneditlk;// the result from this function might be needed unescape()ed }; // localizable strings start varlsMonth_names=["January ","February ","March ","April ","May ", "June ","July ","August ","September ","October ","November ", "December "], lsConflict="Edit conflict.", lsDialog1="Please select an edit below or type '>' for older edits:\n\n", lsDialog2="Unsigned edit number:", lsInvalid1="Please enter a valid number or cancel this operation.", lsNoRev="No revisions found. Does the page exist?", lsNoXMLHTTP="Couldn't get XMLHTTP!", lsMinor="m "; if(mw.config.get('wgContentLanguage')=='de'){ lsMonth_names=["Jan. ","Feb. ","Mär. ","Apr. ","Mai ","Jun. ","Jul. ", "Aug. ","Sep. ","Okt. ","Nov. ","Dez. "]; } if(mw.config.get('wgUserLanguage')=='de'){ lsConflict="Edit-Konflikt.", lsDialog1="Bitte wähle einen Edit oder tippe '>' für ältere Edits:\n\n", lsDialog2="Unsigned Edit-Nummer:", lsInvalid1="Bitte eine gültige Zahl eintragen oder diese Operation abbrechen.", lsNoRev="Keine Veränderung gefunden. Besteht die Seite?", lsMinor="K "; } // localizable strings end // try to use native XMLHTTP varxmlhttp=window.XMLHttpRequest?newXMLHttpRequest():false; if(!xmlhttp&&window.ActiveXObject){// ActiveX XMLHTTP xmlhttp=newActiveXObject("Msxml2.XMLHTTP"); if(!xmlhttp) xmlhttp=newActiveXObject("Microsoft.XMLHTTP"); } if(!xmlhttp) returnalert(lsNoXMLHTTP);// No XMLHTTP // get timestamp, user, summary of last x edits xmlhttp.open("GET",mw.config.get('wgScriptPath')+ "/api.php?format=xml&action=query&prop=revisions&rvlimit="+max_nofe+ "&rvcomments&titles="+aswcGet_tidy_title()); varhistory_offset=0; xmlhttp.onreadystatechange=function(){ if(xmlhttp.readyState!=4) return; if(!xmlhttp) returnalert("Error: "+lsNoXMLHTTP+"\n"+xmlhttp.status+": "+ xmlhttp.statusText);// no XMLHTTP varxmldoc=xmlhttp.responseXML; // IE workaround suggested by [[User:Olliminatore]] // !FIXME: IE6 can't read XML??? if(!xmldoc.documentElement&&window.ActiveXObject){ document.body.style.backgroundColor="#CCCCFF";// debugging aid xmldoc=newActiveXObject("Microsoft.XMLDOM"); xmldoc.async=false; xmldoc.loadXML(xmlhttp.responseText); } // get the revisions varrevisions=xmldoc.documentElement.getElementsByTagName("rev"); if(revisions.length<1) returnalert(lsNoRev);// no revisions // get rid of non-numeric characters in timestamp vart=revisions[0].getAttribute("timestamp").replace(/[^0-9]/g,""); // detect an edit conflict if(t!=document.editform.wpEdittime.value) returnalert(lsConflict); vardialog_text; varedit_data=[]; varminor; varis_used; varnos2n;// mapping of number of signatures -> number of all entries varsigdates=sig2ms(get_all_sig_dates_from_textarea()); varupdate_dialog_text=1; while(true){ if(update_dialog_text){ update_dialog_text=0; dialog_text=lsDialog1; nos2n=[]; // extract edit data and build dialog text for(varn=history_offset;n<revisions.length;++n){ minor=(revisions[n].getAttribute("minor")!=null)?lsMinor:""; edit_data[n]={ timestamp:revisions[n].getAttribute("timestamp").replace(/[^0-9]/g,""), user:revisions[n].getAttribute("user"), comment:revisions[n].getAttribute("comment") }; is_used= (is_elem_of_arr(timestamp2ms(edit_data[n].timestamp),sigdates))? '(used) ':''; if(is_used==''||display_used==1){ nos2n.push(n); dialog_text+=("["+ (nos2n.length-1).toString(max_history_entries).toUpperCase()+ "] "+ edit_data[n].timestamp.replace( /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/g, "1ドル-2ドル-3ドル 4ドル:5ドル:6ドル" )+ " "+is_used+edit_data[n].user+": "+minor+ ((edit_data[n].comment==null)?"–": edit_data[n].comment) ).substring(0,80)+"\n"; } if(nos2n.length==max_history_entries) break; } } varunsigned_edit_choice=null; if(edit_data.length==1) unsigned_edit_choice=0;// no choice else// if(is_gecko) // for Mozilla, def in wikibits.js unsigned_edit_choice=prompt(dialog_text+"\n"+lsDialog2,"0"); //else{ // for IE or other // alert(dialog_text); // var unsigned_edit_choice = prompt(lsDialog2, "0"); //} if(unsigned_edit_choice==null){ return;// Cancel button }elseif(unsigned_edit_choice=='>'){ history_offset=Math.min(revisions.length-1,nos2n[nos2n.length-1]); update_dialog_text=1; continue; }elseif(unsigned_edit_choice=='<'){ // actually that's not correct, but it should be sufficient history_offset=Math.max(0,history_offset-max_history_entries); update_dialog_text=1; continue; }elseif(isNaN(unsigned_edit_choice= parseInt(unsigned_edit_choice,max_history_entries))){ returnalert(lsInvalid1);// non-numeric input }else{ varunsigned_edit=edit_data[nos2n[unsigned_edit_choice]]; } t=unsigned_edit.timestamp;// So the full name doesn't have to be used varyear=t.substring(0,4); varmonth=t.substring(4,6); varday=(t.substring(6,8)-0); varhours=parseInt(t.substring(8,10),10); vartzcode='UTC';// the data returned by app.php is UTC // localizable strings start if(mw.config.get('wgContentLanguage')=='de'){ // add timezone offset // daylight saving time (true, false) vartime_offset=(is_dst(year,month-1,day,hours))?2:1; // localizable strings end tzcode=(time_offset==2)?'CEST':'CET'; // get UTC time in msec nd=newDate(year,month-1,day,hours).getTime(); // create new Date object for different // using timezone offset nd=newDate(nd+3600000*time_offset); year=nd.getFullYear(); month=1+nd.getMonth(); day=nd.getDate(); hours=nd.getHours(); day=''+day+'.'; } if(hours<10) hours='0'+hours; // format and insert the tag // see https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/jQuery.plugin.textSelection-method-encapsulateSelection $('#wpTextbox1').textSelection('encapsulateSelection',{pre:"{{"+ssubst+"unsigned|"+unsigned_edit.user+"|"+hours+":"+ t.substring(10,12)+", "+day+" "+lsMonth_names[month-1]+ year+" ("+tzcode+")|ALT=nicht}}"}); return; } }; xmlhttp.send(null); }; jQuery( function(){ mw.loader.using(["jquery.textSelection","mediawiki.util"], function(){ varunsigned_title='Unsigned'; varunsigned_tooltip='add a missing signature'; if(mw.config.get('wgUserLanguage')=='de'){ unsigned_title='Unsigniert'; unsigned_tooltip='Trage eine fehlende Signatur nach.'; } if(!mw.config.get('wgIsArticle')){ mw.util.addPortletLink( 'p-cactions', "javascript:addSigWikiCode();", /* localizable strings start */ unsigned_title, "ca-unsigned", unsigned_tooltip,"" /* localizable strings end */ ); } } ); } ); } //</nowiki></pre>