MediaWiki:Common.js: Difference between revisions

From Tygron Preview Support Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(19 intermediate revisions by the same user not shown)
Line 35: Line 35:
/*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*/
$( function() {
$( function() {
     function sleep(ms) {
      
      return new Promise(resolve => setTimeout(resolve, ms));
    }
     var filterFunction = function(input) {
     var filterFunction = function(input) {
    var searchterm = input.value;
    var searchterm = input.value;
    var searchtarget = document.getElementById('mw-content-text').getElementsByClassName(input.getAttribute('data-list'));
    var searchtarget = document.getElementById('mw-content-text').getElementsByClassName(input.getAttribute('data-list'));
    var searchin = searchtarget.length>0?searchtarget:[input.parentElement.parentElement];
    var searchin = searchtarget.length>0?searchtarget:[input.parentElement.parentElement];
    var el = 'li';
       
    var el = 'ul';
         for ( var i=0;i<searchin.length;i++) {
         for ( var i=0;i<searchin.length;i++) {
        var e = searchin[i].getElementsByTagName(el);
        var uls = searchin[i].getElementsByTagName(el);
             for ( var j=0;j<e.length;j++ ) {
             for ( var j=0;j<uls.length;j++ ) {
               if (e[j].title.toLowerCase().includes(searchterm.toLowerCase()) || e[j].textContent.toLowerCase().includes(searchterm.toLowerCase()) ) {
 
          e[j].style.removeProperty('display');
              var show = false;
      } else {
              var lis = uls[j].children;
          e[j].style.display='none';
             
      }
               for(var k = 0; k<lis.length; k++){
 
                  var lie = lis[k];
                  if (lie.title.toLowerCase().includes(searchterm.toLowerCase()) || lie.textContent.toLowerCase().includes(searchterm.toLowerCase()) ) {
              lie.style.removeProperty('display');
                      show=true;             
          } else {
              lie.style.display='none';                 
          }                   
              }
              if(uls[j].parentNode){
                  /*uls[j].parentNode.style.display= show? 'inherit':'none'; */
              }
             }
             }
    }
    }
          
 
      console.log("searchterm = " + searchterm);
         localStorage['tygron-wiki-searchterm'] = searchterm;          
      localStorage['tygron-wiki-searchterm']= searchterm;
      console.log("stored?" + localStorage['tygron-wiki-searchterm']);
           
     };
     };


Line 67: Line 75:
         var input = document.createElement('input');
         var input = document.createElement('input');
         var button = document.createElement('input');
         var button = document.createElement('input');
 
         input.setAttribute('class', 'list-filterer-input ' +s[i].getAttribute('class'));
         input.setAttribute('class', 'list-filterer-input ' +s[i].getAttribute('class'));
         input.setAttribute('type', 'search');
         input.setAttribute('type', 'search');
Line 91: Line 99:
         var searchTerm = localStorage['tygron-wiki-searchterm'];
         var searchTerm = localStorage['tygron-wiki-searchterm'];
         if(searchTerm){
         if(searchTerm){
             console.log("searchTerm = " + searchTerm);
             window.scrollTo(0, 0);
             input.value = searchTerm;
             input.value = searchTerm;
             sleep(2000).then()=>{
             filterFunction(input);
                filterFunction(input);
            });
         }
         }
     }
     }

Latest revision as of 14:00, 29 February 2024

/* Any JavaScript here will be loaded for all users on every page load. */

/*Render protected emails*/
$( function() {
    var emunp = function( elems ) {
        for (var i=0; i<elems.length; i++) {
            if ( !(' '+elems[i].className+' ').match( / protected-email / ) ) continue;
            elems[i].className = elems[i].className.replace( 'protected-email', '' )
            elems[i].innerHTML = elems[i].getAttribute('data-u') + '@' + '<span class="protected-email-scrape">honeypot.</span>' +  elems[i].getAttribute('data-d');
        }
    }

    var bc = document.getElementById('bodyContent');
    emunp( bc.getElementsByTagName( 'span' ) );
} );

/* 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(input) {
	    var searchterm = input.value;
	    var searchtarget = document.getElementById('mw-content-text').getElementsByClassName(input.getAttribute('data-list'));
	    var searchin = searchtarget.length>0?searchtarget:[input.parentElement.parentElement];
        
	    var el = 'ul';
        for ( var i=0;i<searchin.length;i++) {
	        var uls = searchin[i].getElementsByTagName(el);
            for ( var j=0;j<uls.length;j++ ) {

               var show = false;
               var lis = uls[j].children;
               
               for(var k = 0; k<lis.length; k++){

                   var lie = lis[k];
                   if (lie.title.toLowerCase().includes(searchterm.toLowerCase()) || lie.textContent.toLowerCase().includes(searchterm.toLowerCase()) ) {
		               lie.style.removeProperty('display');
                       show=true;               
		           } else {
		               lie.style.display='none';                  
		           }                    
               }
               if(uls[j].parentNode){
                   /*uls[j].parentNode.style.display= show? 'inherit':'none'; */ 
               }  
            }
	    }

        localStorage['tygron-wiki-searchterm'] = searchterm;           
    };

    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'));
		input.setAttribute('data-list', s[i].getAttribute('data-list'));

        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 = function() {filterFunction(input);};
		button.onclick = function() {filterFunction(input);};
		
        s[i].setAttribute('data-ready', 'ready');
        input.setAttribute('data-ready', 'ready');
        button.setAttribute('data-ready', 'ready');

        var searchTerm = localStorage['tygron-wiki-searchterm'];
        if(searchTerm){
             window.scrollTo(0, 0);
             input.value = searchTerm;
             filterFunction(input);
        }
    }
});





/*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*/
$( function() {

	var skipEditingCheck = '';
	if ( !$('form.mw-editform' ).length) {
		skipEditingCheck = true;
		
	} else {
		var checkEditingExcludes = ['MediaWiki:', 'Template:'];
		for ( var i = 0; i < checkEditingExcludes.length; i++ ) {
			if ( $('h1#firstHeading.firstHeading').text().indexOf( checkEditingExcludes[i]) >= 0) {
				skipEditingCheck = 'Article in namespace ' + checkEditingExcludes[i];
				break;
			}
		}
	}
skipEditingCheck = 'Awaiting explicit activation';
	if (skipEditingCheck) {
		if ( skipEditingCheck !== true ) {
			console.log( 'Skipping the editing style check: '+skipEditingCheck );
		}
		return;
	}
	
	
	var getAllPatternMatches = function(subject, pattern) {
		var results = [];
		var matches = subject.matchAll(pattern);
		var match = null;
		while( match = matches.next() ) {
			if (match.done) {
				break;
			}
			results.push(match.value);
		}
		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 getEditingRulesHits = function(content) {
		var results = {};
		for (var ruleName in rules) {
			var rule = rules[ruleName];
			var newResults = [];
			if (rule['regex']) {
				var newResults = getAllPatternMatches(content, rule['regex']);
			}
			if ( newResults.length > 0 ) {
				for (var resultIndex in newResults) {
					var result = newResults[resultIndex];
					result['surroundingText'] = getSurroundingText(content, result['index'], result[0].length);
				}
				results[ruleName] = newResults;
			}
		}
		return results;
	};

	var convertResultsToDom = function(results) {
		if ( Object.values(results).length === 0 ) {
			return null;
		}
		var $output = $('<div></div>').addClass('editRulesResults');
		if ( Object.values(results).length > 0 ) {
			for (var resultName in results) {
				var rule = rules[resultName];
				var text = rule['error'] ? rule['error'] : rule['warning'];
				$results = $('<div></div>')
					.addClass('editRulesResult');
				$results.append(
						$('<span></span>')
						.addClass('editRulesResultHeader')
						.text(text)
					);
				
				var ruleResults = results[resultName];
		
				for (var resultIndex in ruleResults) {
			var result = ruleResults[resultIndex];
					var stringResult = result.surroundingText;
					$results.append( $('<div></div>')
							.addClass('editRulesResultEntry')
							.text(stringResult)
						);
				}
				$output.append($results);
			}
		}
		return $output;
	};

	var addResultsToDom = function( results ) {
		var $dom = convertResultsToDom( results );
		$('.editButtons').find('.editRulesResults').remove();
		$('.editButtons').prepend( $dom );
	};

	var checkAndReportRules = function( content ) {
		var content = $('textarea').val();
		var results = getEditingRulesHits( content );
		addResultsToDom( results );
		return Object.values(results).length;
	};
	
	var addRulesOverrideCheckboxToDom = function(  ) {
		var $overrideCheckbox = $('#mw-editpage-watch').clone();
		$overrideCheckbox.attr('id', 'mw-editpage-overridechecks');
		$overrideCheckbox.find('#wpWatchThisWidget')
			.attr('id','wpOverridCheckseWidget');
		$overrideCheckbox.find('input[type=\'checkbox\']')
			.attr('id','wpOverrideChecks')
			.attr('name','wpOverrideChecks')
			.prop( 'checked', false )
			.removeAttr('accesskey');
		$overrideCheckbox.find('label')
			.attr('for','wpOverrideChecks')
			.text('Override editing styling checks');
		
		console.log($overrideCheckbox);
		removeRulesOverrideCheckboxFromDom();
		$('#mw-editpage-watch').parent().find( '#mw-editpage-overridechecks' ).remove();
		$('#mw-editpage-watch').parent().append($overrideCheckbox);
	};
	var removeRulesOverrideCheckboxFromDom = function(  ) {
		$('#mw-editpage-watch').parent().find( '#mw-editpage-overridechecks' ).remove();
	};
	
	var submitCheckRules = function() {
		var doSubmit = true
		if ( $('#mw-editpage-overridechecks').find(':checked').length ===0 ) {
			var content = $('textarea').val();
			var results = getEditingRulesHits( content );
			addResultsToDom( results );
			doSubmit = Object.values(results).length === 0;
		}
		if (!doSubmit) {
			addRulesOverrideCheckboxToDom();
		}
		
		return doSubmit;
	};
	
	var rules = {
			'Avoid <br>': { 'regex': /(<br(\s[^>]*)*>(\s)*)+/ig, 'warning':'There is an instance of a manual <br>.'}
		};
	
		$('form.mw-editform').on('submit', function(){
			var doSubmit = submitCheckRules();
			console.log( 'Result from checking editing rules: '+doSubmit );
			return doSubmit;
		});
		
		$('form.mw-editform').find('textarea').on('change input', function(){
			removeRulesOverrideCheckboxFromDom();
		});
		
		console.log('Editing style checking enabled.');
});