User:Qwerfjkl/scripts/massUnsigned.js

// not currently functional (as of 17:16, 19 April 2022 (UTC)) var UnsignedHelper={ months:['January','February','March','April','May','June','July','August','September','October','November','December'],

makeUnsignedTemplate:function(user,ts,anon){ ts=new Date(ts); var h=ts.getUTCHours; if(h<10) h='0'+h; var m=ts.getUTCMinutes; if(m<10) m='0'+m; ts=h+':'+m+', '+ts.getUTCDate+' '+UnsignedHelper.months[ts.getUTCMonth]+' '+ts.getUTCFullYear+' (UTC)'; if(anon){ return '\x7b\x7bsubst:UnsignedIP|'+user+'|'+ts+'\x7d\x7d'; } else { return '\x7b\x7bsubst:Unsigned|'+user+'|'+ts+'\x7d\x7d'; }   },

addUnsignedTemplate:function(evt, pos){ mw.loader.using(['mediawiki.util','jquery.ui'], function{           var f=document.getElementById('editform');            var e=f.elements.wpTextbox1;            var pos=$(e).textSelection('getCaretPosition', {startAndEnd:true});            var txt;            if(pos[0]!=pos[1]){                txt=e.value.substring(pos[0],pos[1]);                pos=pos[1];            } else {                pos=pos[1];                if(pos<=0) pos=e.value.length;                txt=e.value.substr(0,pos);                txt=txt.replace(new RegExp('[\\s\\S]*\\d\\d:\\d\\d, \\d+ ('+UnsignedHelper.months.join('|')+') \\d\\d\\d\\d \\(UTC\\)'), );                txt=txt.replace(/[\s\S]*\n=+.*=+\s*\n/, );            }            txt=txt.replace(/^\s+|\s+$/g, '');

var rvct=1; var dialog=$(' Examining revision 1... ').dialog({               buttons:{ Cancel:function{ dialog.dialog('close'); } },                modal:true,                title:'Adding \x7b\x7bunsigned\x7d\x7d'            });

var revid, user, ts, comment, anon; var q={ url:mw.util.wikiScript('api'), dataType:'json', type:'POST', data:{ format:'json', action:'query', titles:mw.config.get('wgPageName'), prop:'revisions', rvprop:'ids|timestamp|user|parsedcomment|content', rvlimit:1, rawcontinue:1 },               success:function(r,sts,xhr){ if(!dialog.dialog('isOpen')) return;

if(!r.query || !r.query.pages){ dialog.html(' Error: Bad response from API '); if(window.console && typeof(window.console.error)=='function') window.console.error("Bad response", r); return; }

for(var k in r.query.pages){ var rr=r.query.pages[k].revisions[0]; var cont = function { if(r['query-continue'] && r['query-continue'].revisions){ dialog.html('Evaluating revision '+(++rvct)+'...'); q.data.rvcontinue=r['query-continue'].revisions.rvcontinue; $.ajax(q); } else { var t=UnsignedHelper.makeUnsignedTemplate(user,ts,anon); var tt=e.value.substr(0,pos).replace(/\s*$/,' ')+t; e.value=tt+e.value.substr(pos); $(e).textSelection('setSelection', { start:tt.length }); dialog.dialog('close'); }                       };

if(typeof(rr['*'])!='undefined' && rr['*'].indexOf(txt)<0){ if(!user){ dialog.html(' Error: Text was not found in the starting revision! Did you edit it? '); return; }                           var cb = function  { var t=UnsignedHelper.makeUnsignedTemplate(user,ts,anon); var tt=e.value.substr(0,pos).replace(/\s*$/,' ')+t; e.value=tt+e.value.substr(pos); $(e).textSelection('setSelection', { start:tt.length }); dialog.dialog('close'); };                           if(/reverted|undid/i.test(comment)){ var dialog2 = $( ' ' ) .append(                                       'The ',                                        $( '' ).prop( { href: '/w/index.php?diff=prev&oldid=' + revid, target: '_blank' } ).text( 'found revision' ),                                        ' may be a revert: ',                                        comment                                    ) .dialog( {                                       title: "Possible revert!",                                        modal: true,                                        buttons: {                                            "Use that revision": function  { dialog2.dialog( 'close' ); cb; },                                            "Keep looking": function  { dialog2.dialog( 'close' ); cont; },                                            "Cancel": function  { dialog2.dialog( 'close' ); dialog.dialog( 'close' ); },                                        }                                    } ); } else { cb; }                       } else { revid=rr.revid; user=rr.user; ts=rr.timestamp; comment=rr.parsedcomment; anon=(typeof(rr.anon)!='undefined'); cont; }                       return; }                   dialog.html(' Error: No revisions found in the page! '); },               error:function(xhr,textStatus,errorThrown){ if(!dialog.dialog('isOpen')) return; dialog.html(' Error: '+textStatus+' '+errorThrown+' '); }           };            if(f.elements.baseRevId) q.data.rvstartid=f.elements.baseRevId.value; $.ajax(q); });       evt.preventDefault;        evt.stopPropagation;        return false;    },    getUnsignedText: function {    	var text=document.getElementById('editform').elements.wpTextbox1;    	const sectionsRegexp = /==.+?==[\s\S]+(?!\n *==)/; // needs negative lookahead    	sections = text.match(sectionsRegexp)    	for (const section in sections) {    		// check for timestamp (easier than signature)    		// for sections without signature, get position (start/end) & addUnsignedTemplate    	} // Match gives //      [ match, //        capture, //        captures..., //        index:, //        input:  ]

// 'see Chapter 3.4.5.1' is the whole match. // 'Chapter 3.4.5.1' was captured by '(chapter \d+(\.\d)*)'. // '.1' was the last value captured by '(\.\d)'. // The 'index' property (22) is the zero-based index of the whole match. // The 'input' property is the original string that was parsed. } };

if(!window.charinsertCustom) window.charinsertCustom={}; if(!window.charinsertCustom['Insert']) window.charinsertCustom['Insert']=''; window.charinsertCustom['Insert']+=' \x7b\x7bunsigned\x7d\x7d\x10UnsignedHelper.addUnsignedTemplate'; if(!window.charinsertCustom['Wiki markup']) window.charinsertCustom['Wiki markup']=''; window.charinsertCustom['Wiki markup']+=' \x7b\x7bunsigned\x7d\x7d\x10UnsignedHelper.addUnsignedTemplate'; if(window.updateEditTools) window.updateEditTools;