User:Ahecht/Scripts/CVD.js
/* Modified from User:Technical 13/Scripts/CVD.js */
/* Define which tools to use */
if(typeof(dupdet) === "undefined"){ var dupdet = false; }// Currently defaulted to FALSE due to User talk:Dcoetzee#Dupe Detector OK? and the fact it may open a lot of tabs.
if(typeof(copyvios) === "undefined"){ var copyvios = true; }// Defaulted to TRUE as it opens just one tab
/* Set up debugging */
if(typeof(cvdebug) === "undefined"){ var cvdebug = false; }//Define "var cvdebug = true;"" in common.js/global.js to enable debugging to console
/* Get links for dupdet */
var externalLinks = [];
var uniqueLinks = [];
var uniqueURLs = [];
if(dupdet === true){
/* Get links from page */
$('a.external').each(function(){
externalLinks[externalLinks.length] = $(this).attr('href');
});
/* Clean out the duplicates */
externalLinks.sort().reverse();
$.each( externalLinks, function( i, el ){
if($.inArray(el + '/', uniqueLinks) === -1 && $.inArray(el, uniqueLinks) === -1) uniqueLinks.push(el);
});
uniqueLinks.reverse();
/* Filter out the invalid ones */
$.each( uniqueLinks, function( i, el ){
if(
/* Internal WMF links */
el.search(/\/\/(enwp|([\w]{2}|test|meta)\.wiki[mp]edia)\.org\/?(w|wiki)?(\/index.php\?)?/i) === -1 &&/* Wikipedias */
el.search(/\/\/en\.wikichecker\.com\/user\//i) === -1 &&/* Wikichecker */
el.search(/\/\/tool(forge|server|s\.wmflabs)\.org\/?/i) === -1 &&/* Tools and Labs */
/* Stats.grok.[\w]{2} */
el.search(/\/\/stats\.grok\.[\w]{2}\/?/i) === -1 &&
/* Wikiblame */
el.search(/\/\/wikipedia\.ramselehof\.de\/wikiblame\.php/i) === -1 &&
/* Google and Bing searches */
el.search(/\/\/(scholar|www).(bing|google).com\/(images|scholar|search|webhp)\?([\w_#&]*)?=/i) === -1 &&
/* jstor search */
el.search(/\/\/www\.jstor\.org\/action\/doBasicSearch\?Query=/i) === -1 &&
/* Webchat / IRC */
el.search(/(irc:\/\/|\/\/webchat.freenode.net\/?)/i) === -1 &&
/* edwardbetts find link tool */
el.search(/\/\/edwardbetts\.com\/find_link\?q=/i) === -1
){
if(el.search(/https?:/i) === -1){
el= 'http:' + el;
}
uniqueURLs.push(el);
}
});
}
/* TRON report */
function lpad(n, e, d) {
var o = ''; if(typeof(d) === 'undefined'){ d='0'; } if(typeof(e) === 'undefined'){ e=2; }
if(n.length < e){ for(var r=0; r < e - n.length; r++){ o += d; } o += n; } else { o=n; }
return o;
}
/* Debugging output to Javascript console */
if(cvdebug){
var loadTS = new Date;
loadTS = lpad(loadTS.getUTCFullYear().toString(), 4) + lpad((loadTS.getUTCMonth()+1).toString(), 2) + lpad(loadTS.getUTCDate().toString(), 2) + lpad(loadTS.getUTCHours().toString(), 2) + lpad(loadTS.getUTCMinutes().toString(), 2) + lpad(loadTS.getUTCSeconds().toString(), 2);
var taskBUG = '== CVD bug report for ' + mw.config.get('wgPageName') + ' by ' + mw.config.get('wgUserName').replace(/ /g,'_') + ' ==\n';
taskBUG += '{'+'{User8|' + mw.config.get('wgUserName') + '}} (usergroups) loaded ' + mw.config.get('wgPageName').replace(/_/g,' ') + ' at {'+'{#time: H:i:s, F j, Y|' + loadTS + '}} (UTC).\n' + mw.config.get('wgUserName') + ' is ';
if(copyvios === true && dupdet === true){ taskBUG += 'opening all links using both copyvios and dupdet tools.'; }else if(copyvios === true && dupdet === false){ taskBUG += 'only opening all links using copyvios.'; }else if(copyvios === false && dupdet === true){ taskBUG += 'only opening all links using dupdet.'; }else{ taskBUG += 'not gaining any benefit from using this script'; if(confirm('You have installed the CVD script by User:Ahecht, but have disabled all of its features.\nPlease contact User:Ahecht if you need assistance in setting up this script.'/* + '\n\nClick "OK" to request assistance or "Cancel" to dismiss.'*/)){/* OPEN MY USER TALK PAGE WITH A NEW SECTION IN EDIT MODE */} }
if(dupdet === true){
taskBUG += 'The script found the following ' + externalLinks.length.toString() + ' link(s) and filtered out ' + (externalLinks.length - uniqueLinks.length).toString() + ' duplicate(s) and ' + (uniqueLinks.length - uniqueURLs.length).toString() + ' invalid link(s). This left the ' + uniqueURLs.length + ' URL(s) listed below.';
var linkBUG = '{'+'{Hst|reason=Links}}\n{'+'{Div col start|2}}\n# ' + externalLinks.join('\n# ') + '\n{'+'{Div col end}}\n{'+'{Hsb}}';
var urlBUG = '; URLs\n{'+'{Div col start|2}}\n# ' + uniqueURLs.join('\n# ') + '\n{'+'{Div col end}}';
if(externalLinks.length > 0){ var eL = true; } else { var el = false; } if(uniqueURLs.length > 0){ var eU = true; } else { var eU = false; } if(eL && eU){ var bugBUG = '{'+'{Hst|reason='; } if(eL){ bugBUG += 'Links'; } if(eL && eU){ bugBUG += ' and '; } if(eU){ bugBUG += 'URLs' } if(eL && eU){ bugBUG += ' returned by script}}\n'; } if(eL){ bugBUG += linkBUG; } if(eL && eU){ bugBUG += '\n'; } if(eU){ bugBUG += urlBUG; } if(eL && eU){ bugBUG += '\n{'+'{Hsb}}'; }
} else { taskBUG += 'Link detection not performed because dupdet === false.'; }
console.info('\n%s\n%s\n', taskBUG, bugBUG);
}
/* report TROFF */
var toolTip = 'Scan for copyright violations';
if(uniqueURLs.length !== 0) {
toolTip += ' in the '+ uniqueURLs.length + ' unique URL';
if(uniqueURLs.length !== 1){ toolTip += 's'; }
toolTip += ' detected';
}
toolTip += ' using '
if(dupdet === true){
toolTip += 'Derrick Coetzee\'s Duplication Detector';
if(copyvios === true){
var countURLs = ' (' + (uniqueURLs.length +1) + ')';
toolTip += ' & Earwig\'s Copyvio Detector tools. (';
if(uniqueURLs.length > 9){ toolTip += 'WARNING: '; }
toolTip += 'This will open ' + (uniqueURLs.length +1) + ' new tabs/windows.)';
}else{
var countURLs = ' (' + uniqueURLs.length + ')';
toolTip += ' tool. (';
if(uniqueURLs.length > 9){ toolTip += 'WARNING: '; }
toolTip += 'This will open ' + (uniqueURLs.length) + ' new tabs/window';
if(uniqueURLs.length !== 1){ toolTip += 's'; }
toolTip += '.)';
}
}else{
if(copyvios === true){
var countURLs = '';
toolTip += 'Earwig\'s Copyvio Detector tool. (This will open in a new tab/window)';
}else{
var countURLs = '';
toolTip += 'no tools.';
}
}
var scanCV = mw.util.addPortletLink(
'p-tb',
'#',
'CVDetector' + countURLs,
'p-cv-detector',
toolTip
);
$( scanCV ).click( function ( e ) {
e.preventDefault();
if(dupdet === true){
if(uniqueURLs.length > 19){
var lottaTabs = confirm('Are you SURE that you want to open ' + (uniqueURLs.length +1) + ' new tabs?');
if(lottaTabs === true){
for(var i=0; i < uniqueURLs.length; i++){
window.open('https://dupdet.toolforge.org/compare.php?url1=' + encodeURIComponent('https:' + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + mw.config.get('wgPageName')) + '&url2=' + encodeURIComponent(uniqueURLs[i]), '_blank');
}
} else {
alert('Only opening tabs for the first five links then');
for(var i=0; i < 5; i++){
window.open('https://dupdet.toolforge.org/compare.php?url1=' + encodeURIComponent('https:' + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + mw.config.get('wgPageName')) + '&url2=' + encodeURIComponent(uniqueURLs[i]), '_blank');
}
}
} else {
for(var i=0; i < uniqueURLs.length; i++){
window.open('https://dupdet.toolforge.org/compare.php?url1=' + encodeURIComponent('https:' + mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php?title=' + mw.config.get('wgPageName')) + '&url2=' + encodeURIComponent(uniqueURLs[i]), '_blank');
}
}
}
if(copyvios === true){
var siteName = mw.config.get('wgSiteName').toLowerCase();
if(!/mediawiki|wikibooks|wikidata|wikimedia|wikinews|wikipedia|wikiquote|wikisource|wikiversity|wikivoyage|wiktionary/.test(siteName)) { siteName = 'wikipedia'; }
window.open('https://copyvios.toolforge.org/?lang=' + mw.config.get('wgContentLanguage') + '&project=' + siteName + '&title=' + encodeURIComponent(mw.config.get('wgPageName')), '_blank');
}
});
/* Ping API */// Disabling for now per request of User:The Earwig because it is too many queries on the API due to cost concerns
/*
var CopyViosAPIQ = {
action: 'search',
project: mw.config.get('wgNoticeProject'),
lang: mw.config.get('wgPageContentLanguage'),
oldid: mw.config.get('wgRevisionId')
};
$.get("//copyvios.toolforge.org/api.json", CopyViosAPIQ, function(CopyViosAPIR){
console.log(CopyViosAPIR.best.confidence);
var bestMatchPercent = " (" + Math.round(CopyViosAPIR.best.confidence*1000)/10 + "%)";
$( '#p-cv-detector' ).html($( '#p-cv-detector' ).html() + bestMatchPercent)
});
- /