MediaWiki:Gadget-LicenseReview.js
Appearance
From Wikimedia Commons, the free media repository
Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
- Report page listing warnings and errors.
// Original Flickrreview script written by [[User:Patstuart]] // Rewritten and extended by [[User:ZooFari]] // Special thanks to [[User:Krinkle]] and [[User:DieBuche]] for assistance // Large parts rewritten by [[User:Rillke]] // Taken over by Majora in June 2018 // Moved to the MediaWiki namespace in March 2020 // See talk page for documentation // <nowiki> /* jshint multistr:true */ /* global AjaxQuickDelete, licenseReviewer */ $(function(){ 'use strict'; varconf=mw.config.get(), userName=conf.wgUserName; if(conf.wgNamespaceNumber!==6)return; varcleanUp=function(input){ return$.trim(input .replace(/== ?Summary ?==/,'=={{int:filedesc}}==') .replace(/== ?Licensing ?==/,'=={{int:license-header}}==') // Remove problem since tags (X-To-DR string) .replace(/\{\{\s*[Nn]o[ _](source|(OTRS[ _])?permission|license)([ _]since)?\s*(\|[^}\n]+)?\}\}\s?/g,'') // Remove Copyvio (X-To-DR string) .replace(/\{\{\s*(Copyviol?|Copyright(?:ed)?|Screenshot|Icon|Logo|Logo-Germany|(?:Non-free video |DVD )?Cover|Db-f9|db-copyvio|Vio(?:lation)?)\s*(\|[^\n]+|[^}\n]*)\}\}\s?/i,'') // Remove Speedy (X-To-DR string) .replace(/\{\{\s*(Speedy(?:[ -]?delet(?:e|ion))?|Speedilydelete|Noncommercial|Nonderivative|löschen|db|spd|qd|Sdelete|SLA|Spdel|Ek|Destruir)\s*(\|[^\n]+|[^}\n]*)\}\}\s?/i,'') .replace(/\{\{\s*SD\s*(\|[^\n]+|[^}\n]*)\}\}\s?/,''));// Remove SD (not Sd) }, thxPatterns={flickr:'Thanks for licensing this image using a free license! \ Your choice of a free license has allowed us to add your image to <a href="https://commons.wikimedia.org/">Wikimedia Commons</a>. \ The image can now be used to illustrate <a href="https://commons.wikimedia.org/wiki/Special:GlobalUsage/%FILE%">pages</a> \ on <a href="https://en.wikipedia.org/">Wikipedia</a> and other free knowledge projects.'}, linkSanitizer=[ // Google+ // 1ドル: userID; 2ドル: albumID; 3ドル: photoID { match:/\/\/plus\.google\.[^\/]+\/photos\/(\d+)\/albums\/(\d+)\/(\d+)/g,replace:'//picasaweb.google.com/lh/sredir?uname=1ドル&target=PHOTO&id=3ドル&noredirect=1' } ], sanitizeLinks=function(textIn){ textIn=textIn||''; $.each(linkSanitizer,function(i,el){ textIn=textIn.replace(el.match,el.replace); }); returntextIn; }; $.extend(thxPatterns,window.LRThxPatterns); varlicenseReviewMaybeSave=function(val,summary,minor,justsave,oldtext){ document.editform.wpSummary.value=summary+' ([[MediaWiki talk:Gadget-LicenseReview.js|script]])'; document.editform.wpMinoredit.checked=minor; if(justsave){ document.editform.submit(); returntrue; } if(!oldtext)oldtext=val; // First Flickr-check vargotResult, $submitButton, thxPattern, match=oldtext.match(/\d{1,11}@\D\d{2}/); if(!match)match=oldtext.match(/flickr\.com\/people\/(\S+?)\/? /); if(!match)match=oldtext.match(/flickr\.com\/people\/(\S+)/); if(!match)match=oldtext.match(/flickr\.com\/photos\/(\S+?)\//); if(!match)match=oldtext.match(/flickr\.com\/photos\/(\S+)/); if(match) thxPattern=thxPatterns.flickr; varcheckBlacklistCB=function(isBad){ if(!isBad){ $submitButton.prop('disabled',false).removeClass('ui-state-disabled'); gotResult=true; } }; if(match){ match=(match[1]||match[0]); ajaxIsBadAuthor(match,checkBlacklistCB); if(thxPattern){ $('body').append('<div id="mw-licensereview-add" style="display:none" title="You may use this thank-you text">\ <textarea id="ProposalThankyoumessage" readonly="readonly" style="width:400px;height:130px;" rows="5" cols="50" onclick="select()">'+ mw.html.escape(thxPattern.replace(/\%FILE\%/g,conf.wgPageName.replace('File:','')))+ '</textarea>\ </div>' ); setTimeout(function(){// Delay to ensure scrolling has finished (start) $('#mw-licensereview-add').dialog({ position:{my:'center',at:'center',of:window}, buttons:{Ok:function(){ if(gotResult)document.editform.submit(); }}, modal:true, width:430 }); },300);// Delay to ensure scrolling has finished (end) $submitButton=$('.ui-dialog-buttonpane').find('button:first'); $submitButton.prop('disabled',true).addClass('ui-state-disabled'); $('#ProposalThankyoumessage').keyup(function(e){ if(((e.keyCode-0)===13))$submitButton.click(); }); } return; }else{ document.editform.submit(); returntrue; } }, getSource=function(val){ varret, r=val.match(/\|\s*Source\s*=(.+)/i); if(r&&r[1]) ret=$.trim(r[1]); if(!ret){ r=val.match(/https?:\/\/photozou.jp[^\s\]\|]+/i); if(r) ret=r[0]; } return((ret||'https://')); }, lrw=window.licenseReviewer={ promptForSource:function(prefill){ returnprompt('Link:',getSource(prefill)); }, // LRP - License review passed LicenseReview_P:function(){ vartb1=document.editform.wpTextbox1, noChanges=tb1.value; tb1.value=tb1.value.replace(/\{\{!}}/g,'|'); if(/\{\{Licen[cs]e ?review.*\}\}/i.test(noChanges)){ varLRsite=lrw.promptForSource(tb1.value); if(LRsite===null)returnmw.notify('License-review: Aborted'); tb1.value=tb1.value.replace(/\{\{[Ll]icen[cs]e ?[Rr]eview ?(\|.*= ?|\| ?)*\}\}/g,'{{LicenseReview|site='+LRsite+'|user='+userName+'|date={{subst:#time:Y-m-d}}}}'); tb1.value=tb1.value.replace(/\[\[Category:((Tasnim|Moj|Fars|Mehr|Nasim)news|SNN|CSS|Khamenei\.ir) review needed\]\]/g,''); tb1.value=tb1.value.replace(/\{\{ArrangedLicenseReview.*?\}\}/g,''); if(noChanges===tb1.value)alert('RegExp did not match. Likely no changes. Please report to [[MediaWiki talk:Gadget-LicenseReview.js]]'); tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:License review|License review]] passed',true,false,noChanges); }elseif(/\{\{(F|f)inna(R|r)eview\}\}/i.test(noChanges)){ varLRsite2=lrw.promptForSource(tb1.value); if(LRsite2===null)returnmw.notify('License-review: Aborted'); tb1.value=tb1.value.replace(/\{\{(F|f)inna(R|r)eview\}\}/g,'{{FinnaReview|site='+LRsite2+'|user='+userName+'|date={{subst:#time:Y-m-d}}}}'); if(noChanges===tb1.value)alert('RegExp did not match. Likely no changes. Please report to [[MediaWiki talk:Gadget-LicenseReview.js]]'); tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:License review|License review]] passed',true,false,noChanges); }elseif(/\{\{GODL-India/i.test(noChanges)){ varindex=noChanges.search('GODL-India'), substring1=noChanges.substring(index+10), index2=substring1.search('}}'), GODLparams=substring1.substring(0,index2); tb1.value=tb1.value.replace(/\{\{GODL-India(.+?|)}}/g,'{{GODL-India|status=confirmed|reviewer=~~~|date={{subst:#time:Y-m-d}}'+GODLparams+'}}'); if(noChanges===tb1.value)alert('RegExp did not match. Likely no changes. Please report to [[MediaWiki talk:Gadget-LicenseReview.js]]'); tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:License review|License review]] passed',true,false,noChanges); }elseif(/\{\{(I|i)(n|N)aturalist(R|r)eview\}\}/i.test(noChanges)){ varLRsite4=lrw.promptForSource(tb1.value); if(LRsite4===null)returnmw.notify('License-review: Aborted'); tb1.value=tb1.value.replace(/\{\{(I|i)(n|N)aturalist(R|r)eview\}\}/g,'{{subst:Inrw |site='+LRsite4+'|license= |author=}}'); if(noChanges===tb1.value)alert('RegExp did not match. Likely no changes. Please report to [[MediaWiki talk:Gadget-LicenseReview.js]]'); tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:License review|License review]] passed',true,false,noChanges); }elseif(/\{\{[Pp]ixabay.*\}\}/i.test(noChanges)){ varpbid; // First attempt: get id from {{pixabay|xxx}} varpbTemplateID=noChanges.match(/\{\{[Pp]ixabay.*[|=](\d+)}}/); if(pbTemplateID){ pbid=pbTemplateID[1]; }else{ vartryPbid=noChanges.match(/pixabay.com.*-(\d+)\/?/i); if(tryPbid)pbid=tryPbid[1]; elsepbid=lrw.promptForSource(tb1.value); } if(pbid===null)returnmw.notify('License-review: Aborted'); varurlRemoved=pbid.match(/(\d+)\/?$/)[1]; tb1.value=tb1.value.replace(/\{\{[Pp]ixabay.*}}/,'{{subst:pblr|1='+pbid+'}}'); if(noChanges===tb1.value)alert('RegExp did not match. Likely no changes. Please report to [[MediaWiki talk:Gadget-LicenseReview.js]]'); tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:License review|License review]] passed',true,false,noChanges); }elseif(/\{\{YouTube\s?Review/i.test(noChanges)){ varlineIndex=noChanges.search('YouTubeReview'), youtubeSubstring=noChanges.substring(lineIndex+13), lineIndex2=youtubeSubstring.search('}}'), YouTubeparams=youtubeSubstring.substring(0,lineIndex2); if(tb1.value.includes('|id=')){ tb1.value=tb1.value.replace(/\{\{YouTube\s?Review(.*?|)}}/ig,'{{YouTubeReview'+YouTubeparams+'|reviewer='+userName+'}}'); if(noChanges===tb1.value)alert('RegExp did not match. Likely no changes. Please report to [[MediaWiki talk:Gadget-LicenseReview.js]]'); tb1.value=cleanUp(tb1.value); licenseReviewMaybeSave(tb1.value,'[[Commons:License review|License review]] passed',true,false,noChanges); } else{ varLRsite3=tb1.value; if(LRsite3.match(/From YouTube/i)){ varid; varindexstart=LRsite3.substring(LRsite3.search(/From YouTube/i)); varindex3=indexstart.search('1='); varsubstring2=indexstart.substring(index3+2); varindex4=substring2.search('2='); if(index4===-1){ index4=substring2.search('}'); } id=substring2.substring(0,index4); } else{ varindex5=LRsite3.search('v='); varidtemp=LRsite3.substring(index5+2); varindex6=idtemp.indexOf('\n'); id=idtemp.substring(0,index6); } tb1.value=tb1.value.replace(/\{\{YouTube\s?Review(.*?|)}}/ig,'{{YouTubeReview|id='+id+YouTubeparams+'|date={{subst:#time:Y-m-d}}|reviewer='+userName+'}}'); if(noChanges===tb1.value)alert('RegExp did not match. Likely no changes. Please report to [[MediaWiki talk:Gadget-LicenseReview.js]]'); tb1.value=cleanUp(tb1.value); licenseReviewMaybeSave(tb1.value,'[[Commons:License review|License review]] passed',true,false,noChanges); } } else{ tb1.value=tb1.value .replace(/({{User:Flickr Review Bot.*?}})|({{(F|f)lickr(R|r)?eview.*?}})|({{(F|f)lickr no source.*?}})|({{User:FlickreviewR.*?}})/g,'{{Flickrreview|'+userName+'|{{subst:#time:Y-m-d}}}}') .replace(/({{User:Picasa Review Bot.*?}})|({{(P|p)icasar?eview}})/g,'{{Picasareview|'+userName+'|{{subst:#time:Y-m-d}}}}').replace(/{{(([^\}]*?))(P|p)icasareview}}/g,'{{1ドル}}{{Picasareview|'+userName+'|{{subst:#time:Y-m-d}}}}') .replace(/({{\s*(?:Template:)?((C|c)c-by-3.0-(IndiaFM|BollywoodHungama)|(B|b)ollywoodHungama)}})/g,'{{Cc-by-3.0-BollywoodHungama|status=confirmed|reviewer=~~~~}}') .replace(/({{\s*(?:Template:)?(C|c)c-by(?:-sa)?-3.0-FilmiTadka}})/g,'{{Cc-by-sa-3.0-FilmiTadka|passed|~~~~}}') .replace(/({{\s*(?:Template:)?(I|i)pernity(R|r)eview}})/g,'{{Ipernityreview|'+userName+'|{{subst:#time:Y-m-d}}}}') .replace(/({{\s*(?:Template:)?(I|i)ndafotó review}})/g,'{{Indafotó review|site=[https://indafoto.hu Indafotó]|user='+userName+'|date={{subst:#time:Y-m-d}}}}') .replace(/({{\s*(?:Template:)?(N|n)ROER}})/g,'{{NROER|status=confirmed|reviewer='+userName+'|date={{subst:#time:Y-m-d}}}}') .replace(/(\[\[(C|c)ategory:(P|d)D files for review\]\])/g,''); // if no replacements if(noChanges===tb1.value){ $('body').append('<div id="mw-licensereview-add" style="display:none" title="No template detected">\ <label for="mw-licensereview-pick">No template found. Add template:</label>\ <select id="mw-licensereview-pick" name="mw-licensereview-pick">\ <option value="LR">LicenseReview</option>\ <option value="PIX">Pixabayreview</option>\ <option value="FR">Flickrreview</option>\ <option value="PICR">Picasareview</option>\ <option value="IR">Ipernityreview</option>\ <option value="INR">iNaturalistReview</option>\ <option value="YTR">YouTubeReview</option>\ </select>\ </div>'); $('#mw-licensereview-add').dialog({ buttons:{Ok:function(){ licenseReviewer.LicenseReview_A($('#mw-licensereview-pick').val()); $(this).dialog('close'); }}, modal:true }); }else{ // if replacements tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:License review|License review]] passed',true,false,noChanges); } } }, // Add a License-review template LicenseReview_A:function(pick){ vartb1=document.editform.wpTextbox1; if(pick){ switch(pick){ case'FR':tb1.value+='{{Flickrreview|'+userName+'|{{subst:#time:Y-m-d}}}}'; tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:Flickr files|Flickr review]]',false); break; case'PICR':tb1.value+='{{Picasareview|'+userName+'|{{subst:#time:Y-m-d}}}}'; tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:License review|Picasa review]]',false); break; case'IR':tb1.value+='{{Ipernityreview|'+userName+'|{{subst:#time:Y-m-d}}}}'; tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:License review|Ipernity review]]',false); break; case'PIX': tb1.value=cleanUp(tb1.value); varpixabayID=tb1.value.match(/pixabay.com.*-(\d+)\/?/i)[1]; if(!pixabayID)returnmw.notify('License-review: Aborted, could not find ID'); tb1.value=tb1.value.replace(/\{\{[Pp]ixabay.*}}/,'{{subst:pblr|1='+pixabayID+'}}'); licenseReviewMaybeSave(tb1.value,'[[Commons:License review|Pixabay review]]',false); break; case'INR': varsite2=lrw.promptForSource(tb1.value); tb1.value+='{{subst:inrw|site='+site2+'}}'; tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:License review|iNaturalist review]]',false); break; case'LR':varsite=lrw.promptForSource(tb1.value); if(site===null)returnmw.notify('License-review: Aborted'); tb1.value+='{{LicenseReview|site='+site+'|user='+userName+'|date={{subst:#time:Y-m-d}}}}'; tb1.value=cleanUp(tb1.value); // submit licenseReviewMaybeSave(tb1.value,'[[Commons:License review|License review]]',false); break; case'YTR':// Handle YouTubeReview by adding a temporary YouTubeReview template // Check if there's an existing YouTube CC-BY template varccByMatch=tb1.value.match(/\{\{YouTube CC-BY.*?\}\}/i); if(ccByMatch){ // If a CC-BY template exists, find its position and insert YouTubeReview after it varccByIndex=tb1.value.indexOf(ccByMatch[0])+ccByMatch[0].length; tb1.value=tb1.value.slice(0,ccByIndex)+'\n{{YouTubeReview}}'+tb1.value.slice(ccByIndex); }else{ // If no CC-BY template is found, append YouTubeReview at the end tb1.value+='{{YouTubeReview}}'; } this.LicenseReview_P();// Call the main processing function to handle the new template to avoid duplicate code break; } } }, // LRF - License review failed LicenseReview_F:function(){ vartb1=document.editform.wpTextbox1, isBollyWood=/({{\s*(?:Template:)?((C|c)c-by-3.0-(IndiaFM|BollywoodHungama)|(B|b)ollywoodHungama)}})/.test(tb1.value), isFlickr=/[Ff]lickr/.test(tb1.value), isPixabay=/[Pp]ixabay/.test(tb1.value), options; options='<option value="NS">-- No source indicated --</option>'; if(isBollyWood){ options+='<option value="BOLLY">Screenshot of Bollywood image</option>'; }else{ options+='<option value="ARR">All rights reserved</option>\ <option value="NC">Non-commercial</option>\ <option value="ND">Non-derivative</option>\ <option value="NCD">Non-commercial + Non-derivative</option>\ <option value="NCS">Non-commercial-ShareAlike</option>\ <option value="PICASA?">Picasa review unnecessary</option>'; } if(isFlickr){ options+='<option value="ARR?">ARR (Puf)(Flickr-only)</option>\ <option value="NC?">NC (Puf)(Flickr-only)</option>\ <option value="ND?">ND (Puf)(Flickr-only)</option>\ <option value="NCD?">NC+D (Puf)(Flickr-only)</option>\ <option value="NCS?">NC-SA (Puf)(Flickr-only)</option>\ <option value="PDMARK">PD-Mark</option>'; } if(isPixabay){ options+='<option value="pixabay19">Pixabay upload after 2019年01月09日</option>'; } $('body').append('<div id="mw-licensereview-selector" style="display:none" title="Pick a license">\ <label for="mw-licensereview-pick">Which License?</label>\ <select id="mw-licensereview-pick" name="mw-licensereview-pick">'+ options+ '</select>\ </div>'); $('#mw-licensereview-selector').dialog({ buttons:{Ok:function(){ licenseReviewer.LicenseReview_C($('#mw-licensereview-pick').val()); $(this).dialog('close'); }}, modal:true }); }, // License review failed, got reason, processing LicenseReview_C:function(pick){ vartb1=document.editform.wpTextbox1, isFlickr=/[Ff]lickr/.test(tb1.value), reFlickr=/({{User:Flickr Review Bot.*?}})|({{(F|f)lickrr?eview.*?}})|({{User:FlickreviewR.*?}})/g, rePicasa=/({{User:Picasa Review Bot.*?}})|({{(P|p)icasar?eview}})/g, rePicasa2=/{{(([^\}]*?))(P|p)icasareview}}/g, reFlickr2=/{{(([^\}]*?))(F|f)lickrreview}}/g, reInat=/\{\{(I|i)(n|N)aturalist(R|r)eview\}\}/g, rePixabay=/\{\{[Pp]ixabay.*}}/g, reLR=/{{(L|l)icen[cs]e[ _]?(R|r)eview}}/g, reLicenses=/\{\{(?:Template:)?(cc-by(?:-sa)?-\d\.\d|pd-self)\}\}/gi, summary='', minor=false, userTag='';// You can create new templates if you want and add them to the switch in order to notify the user with a default template // First changing/ adding review-tags if(pick){ switch(pick){ case'ARR': if(isFlickr){ tb1.value='{{subst:Uffd|2=ARR}} \n'+tb1.value.replace(reFlickr,''); userTag='{{subst:unfreeflickrnote|1=%FILE%}}'; }else{ tb1.value=String(tb1.value.replace(reFlickr,'{{subst:Uffd|2=ARR}}') .replace(rePicasa,'{{picasareview|'+userName+'|{{subst:#time:Y-m-d}}|All Rights Reserved}}') .replace(rePicasa2,'{{1ドル}}{{picasareview|'+userName+'|{{subst:#time:Y-m-d}}|All Rights Reserved}}') .replace(reLR,'{{copyvio|1=Posted to source as All Rights Reserved. Only free files are allowed on Commons.}}') .replace(reFlickr2,'{{1ドル}}{{subst:Uffd|2=ARR}}') .replace(reInat,'{{subst:inrw|license=arr}}') ); } break; case'pixabay19': tb1.value=tb1.value.replace(rePixabay,'{{copyvio|1=Posted on Pixabay after January 9, 2019, which is not under free license.}}'); userTag='{{subst:image source|1=%FILE%}}'; break; case'NC': if(isFlickr){ tb1.value='{{subst:Uffd|2=NC}} \n'+tb1.value.replace(reFlickr,''); userTag='{{subst:unfreeflickrnote|1=%FILE%}}'; }else{ tb1.value=String(tb1.value.replace(reFlickr,'{{subst:Uffd|2=NC}}') .replace(rePicasa,'{{picasareview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-3.0}}') .replace(rePicasa2,'{{1ドル}}{{picasareview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-3.0}}') .replace(reLR,'{{copyvio|1=Posted to source as cc-by-nc. Non-commercial restriction is not allowed on Commons.}}') .replace(reFlickr2,'{{1ドル}}{{subst:Uffd|2=NC}}') .replace(reInat,'{{subst:inrw|license=cc-by-nc-4.0}}') ); } break; case'ND': if(isFlickr){ tb1.value='{{subst:Uffd|2=ND}} \n'+tb1.value.replace(reFlickr,''); userTag='{{subst:unfreeflickrnote|1=%FILE%}}'; }else{ tb1.value=String(tb1.value.replace(reFlickr,'{{subst:Uffd|2=ND}}') .replace(rePicasa,'{{picasareview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nd-3.0}}') .replace(rePicasa2,'{{1ドル}}{{picasareview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nd-3.0}}') .replace(reLR,'{{copyvio|1=Posted to source as cc-by-nd. Non-derivative restriction is not allowed on Commons.}}') .replace(reFlickr2,'{{1ドル}}{{subst:Uffd|2=ND}}') .replace(reInat,'{{subst:inrw|license=cc-by-nd-4.0}}') ); } break; case'NCD': if(isFlickr){ tb1.value='{{subst:Uffd|2=NCD}} \n'+tb1.value.replace(reFlickr,''); userTag='{{subst:unfreeflickrnote|1=%FILE%}}'; }else{ tb1.value=String(tb1.value.replace(reFlickr,'{{subst:Uffd|2=NCD}}') .replace(rePicasa,'{{picasareview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-nd-3.0}}') .replace(rePicasa2,'{{1ドル}}{{picasareview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-nd-3.0}}') .replace(reLR,'{{copyvio|1=Posted to source as cc-by-nc-nd. Non-derivative and non-commercial restriction are not allowed on Commons.}}') .replace(reFlickr2,'{{1ドル}}{{subst:Uffd|2=NCD}}') .replace(reInat,'{{subst:inrw|license=cc-by-nc-nd-4.0}}') ); } break; case'NCS': if(isFlickr){ tb1.value='{{subst:Uffd|2=NCS}} \n'+tb1.value.replace(reFlickr,''); userTag='{{subst:unfreeflickrnote|1=%FILE%}}'; }else{ tb1.value=String(tb1.value.replace(reFlickr,'{{subst:Uffd|2=NCS}}') .replace(rePicasa,'{{picasareview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-sa-3.0}}') .replace(rePicasa2,'{{1ドル}}{{picasareview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-sa-3.0}}') .replace(reLR,'{{copyvio|1=Posted to source as cc-by-nc-sa. Non-commercial restriction is not allowed on Commons.}}') .replace(reFlickr2,'{{1ドル}}{{subst:Uffd|2=NCS}}') .replace(reInat,'{{subst:inrw|license=cc-by-nc-sa-4.0}}') ); } break; case'NS': tb1.value='{{subst:nsd}} \n'+tb1.value .replace(reFlickr,'{{Flickr no source|'+userName+'|{{subst:#time:Y-m-d}}}}') .replace(rePicasa,'{{1ドル}}{{Picasa no source|'+userName+'|{{subst:#time:Y-m-d}}}}') .replace(reLR,'{{LicenseReview|site=?}}') .replace(reFlickr2,'{{1ドル}}{{Flickr no source|'+userName+'|{{subst:#time:Y-m-d}}}}'); userTag='{{subst:image source|1=%FILE%}}'; break; case'PICASA':tb1.value=String(tb1.value.replace(/({{User:Picasa Review Bot.*?}})|({{(P|p)icasar?eview}})/g,'{{Picasareviewunnecessary}}')); break; case'ARR?':tb1.value=String(tb1.value.replace(reFlickr,'{{flickrreview|'+userName+'|{{subst:#time:Y-m-d}}|All rights reserved}}').replace(/{{(([^\}]*?))(F|f)lickrreview}}/g,'{{1ドル}}{{Flickrreview|'+userName+'|{{subst:#time:Y-m-d}}|All Rights Reserved}}')); break; case'NC?':tb1.value=String(tb1.value.replace(reFlickr,'{{flickrreview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-2.0}}').replace(/{{(([^\}]*?))(F|f)lickrreview}}/g,'{{1ドル}}{{Flickrreview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-2.0}}')); break; case'ND?':tb1.value=String(tb1.value.replace(reFlickr,'{{flickrreview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nd-2.0}}').replace(/{{(([^\}]*?))(F|f)lickrreview}}/g,'{{1ドル}}{{Flickrreview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nd-2.0}}')); break; case'NCD?':tb1.value=String(tb1.value.replace(reFlickr,'{{flickrreview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-nd-2.0}}').replace(/{{(([^\}]*?))(F|f)lickrreview}}/g,'{{1ドル}}{{Flickrreview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-nd-2.0}}')); break; case'NCS?':tb1.value=String(tb1.value.replace(reFlickr,'{{flickrreview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-sa-2.0}}').replace(/{{(([^\}]*?))(F|f)lickrreview}}/g,'{{1ドル}}{{Flickrreview|'+userName+'|{{subst:#time:Y-m-d}}|cc-by-nc-sa-2.0}}')); break; case'BOLLY':tb1.value='{{Copyvio|1=[[Commons:License review|License review]] of Bollywood Hungama failed: Image is a screenshot, wallpaper or promotional poster. See [[Template:Cc-by-3.0-BollywoodHungama]]. ~~~~}}'+tb1.value.replace(/({{\s*(?:Template:)?((C|c)c-by-3.0-(IndiaFM|BollywoodHungama)|(B|b)ollywoodHungama)}})/ig,'{{Cc-by-3.0-BollywoodHungama}}'); break; case'PDMARK': tb1.value='{{subst:Flickr-public domain mark/subst}}\n'+tb1.value .replace(reFlickr,'') .replace(reLR,'{{LicenseReview|site=?}}') .replace(reFlickr2,'{{1ドル}}') .replace(reLicenses,''); break; } } // Then, adding edit summary if(pick){ switch(pick){ case'NS': summary='[[Commons:License review|License review]] failed: Source not found'; break; case'PICASA': summary='[[Commons:Picasa Web Albums files|Picasa review]] not required'; break; case'PDMARK': summary='[[Commons:License review|License review]]: Provide a specific reason for the public domain status, please.'; break; default: summary='[[Commons:License review|License review]] failed'; } } if(userTag){ ajaxNotifyUploader(userTag,licenseReviewMaybeSave,[tb1.value,summary,minor,true]); }else{ // Finally, submit licenseReviewMaybeSave(tb1.value,summary,minor,true); } }, // Change license LicenseReviewChange:function(){ $('body').append('<div id="mw-licensereview-changer" style="display:none" title="Pick a license">\ <label for="mw-licensereviewc-pick">Change to:</label><br>\ <select id="mw-licensereviewc-pick" name="mw-licensereviewc-pick">\ <option value="BY2">cc-by-2.0</option>\ <option value="BY21jp">cc-by-2.1-jp</option>\ <option value="SA2">cc-by-sa-2.0</option>\ <option value="PD">No known restrictions (Flickr only)</option>\ <option value="PDMo">PDMark owner (Flickr only)</option>\ <option value="CCz">Cc-zero</option>\ <option value="BY3">cc-by-3.0</option>\ <option value="SA3">cc-by-sa-3.0</option>\ <option value="BY4">cc-by-4.0</option>\ <option value="SA4">cc-by-sa-4.0</option>\ </select>\ </div>'); $('#mw-licensereview-changer').dialog({ buttons:{Ok:function(){ licenseReviewer.LicenseReview_L($('#mw-licensereviewc-pick').val()); $(this).dialog('close'); }}, modal:true }); }, LicenseReview_L:function(pick){ vartb1=document.editform.wpTextbox1; if(pick){ varpattern=/({{(C|c)c-by-(sa-|)(2|3|4)\.\d.*?}})|({{(C|c)c-zero}})|({{(F|f)lickr-no known copyright restrictions}})|({{(R|r)emove this line and insert a public domain copyright tag instead}})/g, doReplacement=function(replace,summaryText){ tb1.value=String(tb1.value.replace(pattern,replace)); document.editform.wpSummary.value='[[Commons:License review|License review]]: Change to '+summaryText+' ([[MediaWiki talk:Gadget-LicenseReview.js|script]])'; document.editform.wpMinoredit.checked=false; }; switch(pick){ case'BY2': doReplacement('{{cc-by-2.0}}','CC-BY-2.0'); break; case'BY21jp': doReplacement('{{cc-by-2.1-jp}}','CC-BY-2.1-JP'); break; case'SA2': doReplacement('{{cc-by-sa-2.0}}','CC-BY-SA-2.0'); break; case'PD': doReplacement('{{Flickr-no known copyright restrictions}}','Flickr-no known copyright restrictions'); break; case'PDMo': doReplacement('{{PDMark-owner}}','Flickr-PDMark owner'); break; case'CCz': doReplacement('{{Cc-zero}}','Cc-zero'); break; case'BY3': doReplacement('{{cc-by-3.0}}','CC-BY-3.0'); break; case'SA3': doReplacement('{{cc-by-sa-3.0}}','CC-BY-SA-3.0'); break; case'BY4': doReplacement('{{cc-by-4.0}}','CC-BY-4.0'); break; case'SA4': doReplacement('{{cc-by-sa-4.0}}','CC-BY-SA-4.0'); break; } } }, // License migration code (part 1) (GFDL --> Cc-by-sa-3.0) installMig:function($node){ var$migDiv=$('div.LMR'), $migIntro=$('<label>',{text:'Migration Review:'}).attr({'for':'lrwMigSel'}).appendTo($migDiv), $migSelect=$('<select>').attr({ id:'lrwMigSel',size:1,style:'vertical-align:middle' }).appendTo($migDiv), $migOptEmpty=$('<option>',{ text:' ',value:'' }).appendTo($migSelect), $migOptRelicense=$('<option>',{ text:'relicense',value:'relicense' }).appendTo($migSelect), $migOptRedundant=$('<option>',{ text:'redundant',value:'redundant' }).appendTo($migSelect), $migOptInelibible=$('<option>',{ text:'not eligible',value:'not-eligible' }).appendTo($migSelect), $migOptReviewNeeded=$('<option>',{ text:'needs review',value:'needs-review' }).appendTo($migSelect), $migOptOut=$('<option>',{ text:'opt-out',value:'opt-out' }).appendTo($migSelect), $migReason=$('<input>').attr({ type:'text',size:60,value:'[[Template:License migration|License migration]]: ' }).appendTo($migDiv), $saveButton=$('<button>',{text:'Save'}).attr({ type:'button',role:'button' }).button({icons:{primary:'ui-icon-disk'}}).appendTo($migDiv), $editButton=$('<button>',{text:'Edit'}).attr({ type:'button',role:'button' }).button({icons:{primary:'ui-icon-pencil'}}).appendTo($migDiv); $migSelect.change(function(){ $migReason.val('[[Template:License migration|License migration]]: '+$migSelect.val()); }); var$nodeChild=$node.children('tbody'); if($nodeChild.length) $nodeChild.append($('<tr>').append($('<td>').attr({colspan:3}).append($migDiv))); else $migDiv.prependTo($node); varmigReplace=function(wikiText,cb){ mw.loader.using('ext.gadget.libWikiDOM',function(){ varnwe=mw.libs.wikiDOM.nowikiEscaper(wikiText), nt; // First try to replace the migration parameter nwe.secureReplace(/\|\s*[Mm]igration\s*=\s*(?:needs[\- _]review|review)?\s*([\|\}])/,'|migration='+$migSelect.val()+'1ドル'); nt=nwe.getText(); if(nt!==wikiText)returncb(nt); // If nothing was replaced, then replace templates without params nwe.secureReplace(/\{\{\s*(Bild\-GFDL|GFDL|GFDL\-1.3|Gfdl|GNU FDL|Eigenwerk|Gdfl|GFDL\-no\-disclaimers|GFDL\-with\-disclaimers|GNU|ГЛСД\-без\-одрицања|CopyrightGFDL|مجوز گنو|Јд\-јас|ГЛСД|ГЛСД\-без одрицања|GFDL\-lastno|GFDl|GFDL\-Self|GFDL\-user|GFDL\-user\-w|GNU[ _]Free[ _]Documentation[ _]License|GFDL-\D\D\D?|GFDL-user-\D\D\D?|YAM|OsborneFossils)\s*\}\}/i,'{{1ドル|migration='+$migSelect.val()+'}}'); nt=nwe.getText(); if(nt!==wikiText)returncb(nt); // If nothing was replaced, try with params nwe.secureReplace(/\{\{\s*(Bild\-GFDL|GFDL|GFDL\-1.3|Gfdl|GNU FDL|Eigenwerk|Gdfl|GFDL\-no\-disclaimers|GFDL\-with \-disclaimers|GNU|ГЛСД\-без\-одрицања|CopyrightGFDL|مجوز گنو|Јд\-јас|ГЛСД|ГЛСД\-без одрицања|GFDL\-lastno|GFDl|GFDL\-Self|GFDL\-user|GFDL\-user\-w|GNU[ _]Free[ _]Documentation[ _]License|GFDL-\D\D\D?|GFDL-user-\D\D\D?)\s*(\|[^\}]*)?\}\}/i,'{{1ドル2ドル|migration='+$migSelect.val()+'}}'); nt=nwe.getText(); if(nt!==wikiText)returncb(nt); // If nothing was replaced, try {{self}} nwe.secureReplace(/\{\{\s*self2?\s*\|(.*?\|?)(?:GFDL|GNU[ _]FDL|GNU[ _]Free[ _]Documentation[ _]License)(\s*\|.*?)?(.*)}}/i,'{{self|1ドルGFDL2ドル3ドル|migration='+$migSelect.val()+'}}'); nt=nwe.getText(); if(nt!==wikiText)returncb(nt); thrownewError('Could not migrate license because the template for license migration was not detected.'); }); }; $editButton.click(function(/* e*/){ varonMigEdit=function(){ var$tb1=$(document.editform.wpTextbox1), $sum=$(document.editform.wpSummary); migReplace($tb1.val(),function(nt){ $tb1.val(nt); $sum.val($migReason.val()); }); }; mw.loader.load('ext.gadget.libWikiDOM'); execEdit(onMigEdit); }); $saveButton.click(function(/* e*/){ mw.loader.using(['ext.gadget.AjaxQuickDelete','ext.gadget.libWikiDOM'],function(){ varaqd=AjaxQuickDelete; aqd.initialize(); aqd.addTask('getMoveToken'); aqd.addTask('lrwTextModifyProxy'); aqd.addTask('reloadPage'); aqd.lrwTextModifyProxy=function(){ migReplace(aqd.pageContent,function(nc){ varpage={ title:conf.wgPageName.replace(/_/g,' '), text:nc, starttimestamp:aqd.starttimestamp, timestamp:aqd.timestamp, editType:'text', watchlist:'nochange' }; aqd.showProgress('Changing template parameter to '+$migSelect.val()); aqd.savePage(page,$migReason.val(),'nextTask'); }); }; aqd.nextTask(); }); }); }, // End license migration code (part 1) // installLLinks:function(undef){ var$passHref=$(mw.libs.commons.ui.addEditLink('#','license +','lPlus','License-review: Pass file.','+',undef,'p-cactions')).find('a'), $failHref=$(mw.libs.commons.ui.addEditLink('#','license -','lMinus','License-review: Review failed.','-',undef,'p-cactions')).find('a'); $passHref.click(function(e){ e.preventDefault(); execEdit(licenseReviewer.LicenseReview_P); }); $failHref.click(function(e){ e.preventDefault(); execEdit(licenseReviewer.LicenseReview_F); }); var$changeHref, $lrNode=$('div.LR'); if($lrNode.length){ $lrNode.css('text-align','center'); $changeHref=$('<a>',{ href:'#',text:'change license' }); $changeHref.click(function(e){ e.preventDefault(); execEdit(licenseReviewer.LicenseReviewChange); }); $lrNode.append($('<span>',{id:'lChange'}).append(' [',$changeHref,'] ')); $lrNode.append($('<span>',{id:'lPlus2'}).append(' [',$passHref.clone(true).removeAttr('id'),'] ')); $lrNode.append($('<span>',{id:'lMinus2'}).append(' [',$failHref.clone(true).removeAttr('id'),'] ')); // Sanitizing Google+ Links to PicasaWeb because no license info is displayed on G+ $('.hproduct').find('a[href^="http"]').each(function(i,el){ var$el=$(el), href=$el.attr('href'); $el.attr('href',sanitizeLinks(href.replace(/^http:/,'https:'))); }); } if(document.editform&&document.editform.wpTextbox1)document.editform.wpTextbox1.value=sanitizeLinks(document.editform.wpTextbox1.value); // License migration review (part 2) var$migImage=$('img[alt="Licensing update unknown"]'), hasMigImage=!!$migImage.length; if(hasMigImage){ $('span.licensetpl_short').each(function(i,el){ var$el=$(el); if(['GFDL','GFDL 1.3'].indexOf($el.text())>-1&&$('img[alt="Licensing update unknown"]').length){ licenseReviewer.installMig($migImage.parents('.licensetpl')); returnfalse; } }); } }// End of license migration review (part 2) },// End of Object (licenseReviewer) execEdit=function(cb){ if(['edit','submit'].indexOf(conf.wgAction)<0){ // scroll to top $('html,body').animate({scrollTop:0},1000); // switch to pseudo-edit-mode vargotEditHTML=function(html){ $('#bodyContent').replaceWith($(html).find('#bodyContent')); document.editform.wpTextbox1.value=sanitizeLinks(document.editform.wpTextbox1.value); mw.config.set('wgAction','edit'); document.title='Editing '+document.title; $('#ca-edit').addClass('selected'); cb(); }; $('#bodyContent').prepend($('<h2>',{text:'Loading ...'})); $.get(mw.util.wikiScript('index'),{ action:'submit',title:conf.wgPageName.replace(/ /g,'_') },gotEditHTML); }else{ // execute cb(); } }, /** * Notify the initial uploader about a non-free image upload. * * @example * ajaxNotifyUploader('{{subst:unfreeflickrnote|%FILE%}}', someFunction, arguments to pass along); * * @param tag {String} Tag to add to the user's talk page * @param callback {Function} Pointer to a callback function on ready or error. * * @context {window} * @return n/d */ ajaxNotifyUploader=function(tag,callback,args){ if(!tag)return; varerrDisplay=function(err){ alert(err); callback.apply(this,args); }, didEdit=function(result){ try{ if(result.edit.spamblacklist) thrownewError('Spamblacklisted. Sorry.'); elseif(result.error) thrownewError('API returned error: '+result.error.code+'\n'+result.error.info); alert('User notified.'); callback.apply(this,args); return; }catch(err){ errDisplay('Something went wrong while notifying the user.'); return; } }, doEdit=function(user){ if(/(:?^[Bb]ot)|(:?[Bb]ot$)/.test(user)){ errDisplay('User who created this page is very likely a bot and is NOT notified.'); return; } varpage={ action:'edit', format:'json', title:conf.wgFormattedNamespaces[3]+':'+user, summary:'Notification of possible unfree file. ([[MediaWiki talk:Gadget-LicenseReview.js|script]])', appendtext:'\n'+tag.replace('%FILE%',conf.wgPageName.replace(/_/g,' '))+' ~~'+'~~', token:mw.user.tokens.get('csrfToken') }; jQuery.post(mw.util.wikiScript('api'),page,didEdit); }, gotUser=function(result){ try{ for(varidinresult.query.pages){ varpg=result.query.pages[id]; doEdit(pg.revisions[0].user); } }catch(err){ errDisplay('Error notifying user. Do it yourself.'); return; } }, // query first revision (in Lupo-Style :D) query={ action:'query', format:'json', prop:'revisions', rvprop:'user', rvdir:'newer', rvlimit:1, titles:conf.wgPageName.replace(/_/g,' ') }; $.getJSON(mw.util.wikiScript('api'),query,gotUser); }, /** * Determine whether the flickr-user is a "bad-author". * * @example * ajaxIsBadAuthor('11121189@N04', someFunction); * * @param author {String} The flckr-user's ID * @param callback {Function} Pointer to a callback function on ready or error. Should take one argument. * * @context {window} * @return n/d */ ajaxIsBadAuthor=function(author,callback){ vargotList=function(result,useRx){ pendingCalls--; if(result){ varrx=useRx?(newRegExp('\\|\\s*'+mw.RegExp.escape(author)+'\\s*\\|','')): (newRegExp(mw.RegExp.escape(author),'')); if(rx.test(result)){ isBad=isBad||true; if(pendingCalls)return; if(isBad)alert('Warning! The Flickr-Uploader is blacklisted.'); callback(isBad); return; }else{ if(pendingCalls)return; if(isBad)alert('Warning! The Flickr-Uploader is blacklisted.'); callback(isBad); return; } }else{ alert('Error retrieving bad-author-list from server.'); } }, pendingCalls=0, isBad=false, doCall=function(page,useRx){ pendingCalls++; $.ajax({ url:mw.util.wikiScript('index'), data:{ title:page, action:'raw', dataType:'text', // Allow caching for 1/4h maxage:900, smaxage:900 }, cache:true, type:'GET', success:function(r){ gotList(r,useRx); }, error:function(){ gotList(); } }); }; doCall('Commons:Questionable_Flickr_images/Users',true); doCall('User:FlickreviewR/bad-authors',false); }; // Install mw.loader.using(['jquery.ui','ext.gadget.editDropdown'],function(){ licenseReviewer.installLLinks(); mw.loader.load(['mediawiki.user','mediawiki.util']); }); }); // </nowiki>