MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
No edit summary |
||
Line 14: | Line 14: | ||
for (var i=0; i<tags.length; i++) pops( bc.getElementsByTagName( tags[i] ) ); | for (var i=0; i<tags.length; i++) pops( bc.getElementsByTagName( tags[i] ) ); | ||
} ); | } ); | ||
/*Inject a search bar to filter elements in lists, where the list filterer template is used*/ | /*Inject a search bar to filter elements in lists, where the list filterer template is used*/ | ||
Line 61: | Line 65: | ||
} | } | ||
} ); | } ); | ||
/*Auto redirect (for template "Preview redirect")*/ | /*Auto redirect (for template "Preview redirect")*/ | ||
Line 87: | Line 95: | ||
}, 1000) | }, 1000) | ||
console.log('redirecting to: '+targetForRedirect+' in '+timeForRedirect+' second(s).'); | console.log('redirecting to: '+targetForRedirect+' in '+timeForRedirect+' second(s).'); | ||
} | |||
/*Mediawiki editing rules enforcement*/ | |||
var getAllPatternMatches = function(subject, pattern) { | |||
var results = []; | |||
var matches = [...subject.matchAll(pattern)]; | |||
for (var match of matches) { | |||
results.push(match); | |||
} | |||
return results; | |||
} | |||
var getSurroundingText = function(subject, startIndex, length) { | |||
var buffer = 40 | |||
var start = Math.max(0, startIndex-buffer); | |||
var end = Math.min(subject.length, startIndex+length+buffer); | |||
return subject.substring(start, end); | |||
} | |||
var rules = {'Avoid <br>': { 'regex': /(<br(\s[^>]*)*>(\s)*)+/ig, 'warning':'There is an instance of a manual <br>.'}}; | |||
var getRulesResults = function() { | |||
var results = {}; | |||
for (var ruleName in rules) { | |||
var rule = rules[ruleName]; | |||
var results = []; | |||
if (rule['regex']) { | |||
var newResults = getAllPatternMatches(content, rule['regex']); | |||
} | |||
if ( newResults.length > 0 ) { | |||
results[ruleName] = newResults; | |||
} | |||
} | |||
return results; | |||
} | |||
var convertResultsToDom = function(results) { | |||
var $output = $('<div class=\'editResults\'></div>'); | |||
if ( Object.values(results).length > 0 ) { | |||
for (var resultName in results) { | |||
var rule = rules[ruleName]; | |||
var text = rule['error'] ? rule['error'] : rule['warning']; | |||
$results = $('<div></div>'); | |||
$results.append('<span class=\'editResultsHeader\'></span>').text(text); | |||
var ruleResults = results[resultName]; | |||
for (var result of ruleResults) { | |||
var stringResult = getSurroundingText(content, result['index'], result[0].length); | |||
//var stringResult = stringResult.replace(/[\u00A0-\u9999<>\&]/gim, function(i) { | |||
// return '&#' + i.charCodeAt(0) + ';'; | |||
//}); | |||
$results.append( $('<p></p>').text(stringResult) ); | |||
} | |||
$output.append($results); | |||
} | |||
} | |||
return $output; | |||
} | |||
var reportResults = function( results ) { | |||
var $dom = convertResultsToDom( results ); | |||
$('.editButtons').find('.editResults').remove(); | |||
$('.editButtons').prepend( $dom ); | |||
console.log($dom); | |||
} | |||
var checkAndReportResults = function() { | |||
var content = $('textarea').val(); | |||
var results = getRulesResults( content ); | |||
reportResults( results ); | |||
} | } |
Revision as of 07:52, 28 February 2022
/* Any JavaScript here will be loaded for all users on every page load. */
/* For every span, div, table, td, or th, if that element has the class "pops", then all anchor links (e.g. from [] or [[]] syntax) should open in a new tab/window. */
$( function() {
var pops = function( elems ) {
for (var i=0; i<elems.length; i++) {
if ( !(' '+elems[i].className+' ').match( / pops / ) ) continue;
var anchs = elems[i].getElementsByTagName('a');
for (var j=0; j<anchs.length; j++) anchs[j].target = '_blank';
}
};
var bc = document.getElementById('bodyContent');
var tags = ['span', 'div', 'table', 'td', 'th'];
for (var i=0; i<tags.length; i++) pops( bc.getElementsByTagName( tags[i] ) );
} );
/*Inject a search bar to filter elements in lists, where the list filterer template is used*/
$( function() {
var filterFunction = function(searchterm) {
var searchterm = this.parentElement.getElementsByClassName('list-filterer-input')[0].value;
var searchtarget = this.parentElement.getElementsByClassName(this.getAttribute('data-list'));
var searchin = searchtarget.length>0?searchtarget:[this.parentElement.parentElement];
var el = 'li';
var e = this.parentElement.getElementsByTagName(el);
for ( var i=0;i<searchin.length;i++) {
var e = searchin[i].getElementsByTagName(el);
for ( var i=0;i<e.length;i++ ) {
if (e[i].title.includes(searchterm) || e[i].textContent.includes(searchterm) ) {
e[i].style.removeProperty('display');
} else {
e[i].style.display='none';
}
}
}
};
var s = document.getElementsByClassName('list-filterer');
for ( var i=0; i<s.length; i++ ) {
if (s[i].getAttribute('data-ready')) continue;
var input = document.createElement('input');
var button = document.createElement('input');
input.setAttribute('class', 'list-filterer-input ' +s[i].getAttribute('class'));
input.setAttribute('type', 'search');
input.setAttribute('placeholder', s[i].getAttribute('data-placeholder'));
button.setAttribute('class', 'list-filterer-button ' +s[i].getAttribute('class'));
button.setAttribute('type', 'submit');
button.setAttribute('value', s[i].getAttribute('data-value'));
if (s[i].getAttribute('data-list')) {
button.setAttribute('data-list', s[i].getAttribute('data-list'));
}
s[i].insertBefore(input, null);
s[i].insertBefore(button, null);
input.onchange = filterFunction;
button.onclick = filterFunction;
s[i].setAttribute('data-ready', 'ready');
input.setAttribute('data-ready', 'ready');
button.setAttribute('data-ready', 'ready');
}
} );
/*Auto redirect (for template "Preview redirect")*/
if (autoRedirectDiv = document.getElementById('automaticRedirect')) {
try {
var targetForRedirect = autoRedirectDiv.getElementsByTagName('a')[0].href
var timeForRedirect = (autoRedirectDiv.getElementsByClassName('timeToRedirect')[0].getInnerHTML())
} catch (err) {
console.error(err);
}
var intervalId = setInterval(function(){
try {
var targetForRedirect = autoRedirectDiv.getElementsByTagName('a')[0].href
var timeForRedirect = (autoRedirectDiv.getElementsByClassName('timeToRedirect')[0].getInnerHTML())
if (timeForRedirect <= 1 && timeForRedirect > 0) {
(autoRedirectDiv.getElementsByClassName('timeToRedirect')[0].innerHTML = 0);
console.log('redirecting to: '+targetForRedirect+' now.');
window.location = targetForRedirect;
} else {
(autoRedirectDiv.getElementsByClassName('timeToRedirect')[0].innerHTML = timeForRedirect-1);
console.log('redirecting to: '+targetForRedirect+' in '+timeForRedirect+' second(s).');
}
} catch (err) {
console.error(err);
}
}, 1000)
console.log('redirecting to: '+targetForRedirect+' in '+timeForRedirect+' second(s).');
}
/*Mediawiki editing rules enforcement*/
var getAllPatternMatches = function(subject, pattern) {
var results = [];
var matches = [...subject.matchAll(pattern)];
for (var match of matches) {
results.push(match);
}
return results;
}
var getSurroundingText = function(subject, startIndex, length) {
var buffer = 40
var start = Math.max(0, startIndex-buffer);
var end = Math.min(subject.length, startIndex+length+buffer);
return subject.substring(start, end);
}
var rules = {'Avoid <br>': { 'regex': /(<br(\s[^>]*)*>(\s)*)+/ig, 'warning':'There is an instance of a manual <br>.'}};
var getRulesResults = function() {
var results = {};
for (var ruleName in rules) {
var rule = rules[ruleName];
var results = [];
if (rule['regex']) {
var newResults = getAllPatternMatches(content, rule['regex']);
}
if ( newResults.length > 0 ) {
results[ruleName] = newResults;
}
}
return results;
}
var convertResultsToDom = function(results) {
var $output = $('<div class=\'editResults\'></div>');
if ( Object.values(results).length > 0 ) {
for (var resultName in results) {
var rule = rules[ruleName];
var text = rule['error'] ? rule['error'] : rule['warning'];
$results = $('<div></div>');
$results.append('<span class=\'editResultsHeader\'></span>').text(text);
var ruleResults = results[resultName];
for (var result of ruleResults) {
var stringResult = getSurroundingText(content, result['index'], result[0].length);
//var stringResult = stringResult.replace(/[\u00A0-\u9999<>\&]/gim, function(i) {
// return '&#' + i.charCodeAt(0) + ';';
//});
$results.append( $('<p></p>').text(stringResult) );
}
$output.append($results);
}
}
return $output;
}
var reportResults = function( results ) {
var $dom = convertResultsToDom( results );
$('.editButtons').find('.editResults').remove();
$('.editButtons').prepend( $dom );
console.log($dom);
}
var checkAndReportResults = function() {
var content = $('textarea').val();
var results = getRulesResults( content );
reportResults( results );
}