Benutzer:Umherirrender/monobook.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
/*
 * @author Umherirrender - [[:de:User:Umherirrender]]
 * develop with and for Internet Explorer 11+
 *
 * gegen Übernahmen spricht nichts, nur bitte nicht diese JavaScript-Seite direkt einbinden
 * ohne Gewähr und ohne Support
 *
 * eigene Anpassungen für die deutschsprachige Wikipedia
 */

/*
 * Anpassungen FlaggedRevs
 * [[Benutzer:Umherirrender/monobook-flaggedrevs.js]]
 */
mw.loader.load( '//de.wikipedia.org/w/index.php?title=Benutzer:Umherirrender/monobook-flaggedrevs.js&action=raw&ctype=text/javascript' );

//<nowiki>

/*
 * lokale Anpassungen
 */

mw.loader.using( [ 'mediawiki.util' ], function() { $( function () {
 var wgNamespaceNumber = mw.config.get( 'wgNamespaceNumber' );
 /* nur Systemnachrichten */
 if( wgNamespaceNumber === 8 ) {
  /* link zum translatewiki */
  var messageName = mw.config.get( 'wgTitle' );
  if( messageName.indexOf( '/' ) === -1 ) {
   messageName += '/de';
  }
  mw.util.addPortletLink(
   'p-tb',
   '//translatewiki.net/wiki/MediaWiki:' + mw.util.wikiUrlencode( messageName ),
   'Translatewiki',
   't-translatewiki',
   'Translatewiki',
   'b',
   '#t-recentchangeslinked'
  );
 }
 /* nur Dateien */
 if( wgNamespaceNumber === 6 ) {
  /* setzt die hinzugefügten Hinweise bei Dateien sichtbar in den ersten head */
  var firstHeading = $( '#firstHeading' );
  var nc = $( '#Vorlage_NowCommons' );
  if( nc.length ) {
   var span = $( document.createElement( 'span' ) );
   span.css( 'font-size', '50%' );
   span.attr( 'id', 'hinweis-local-file-nc' );
   span.text( ' (NowCommons)' );
   firstHeading.append( span );
  }
  var sc = $( '#Vorlage_ShadowsCommons' );
  if( sc.length ) {
   var span = $( document.createElement( 'span' ) );
   span.css( 'font-size', '50%' );
   span.attr( 'id', 'hinweis-local-file-sc' );
   span.text( ' (ShadowsCommons)' );
   firstHeading.append( span );
  }
 }
 /* nur im Vorschaumodus */
 if ( mw.config.get( 'wgAction' ) === 'submit' ) {
  //hinweis wenn noch keine Bearbeitungskommentar zum voreingestellten Text ergänzt wurde
  var summary = $( '#wpSummary' );
  if ( summary.length && summary.val().substring(0,2) === ' |' ) {
   summary.css( 'background-color', 'FF6A6A' );
  }
 }

});});

// Funktionen in [[Benutzer:Umherirrender/monobook-tidy-up.js]] enthalten
(function() {
 var loaded = false;
 mw.loader.using( [ 'mediawiki.util' ], function() {
  //Link für Suchen und Ersetzen
  $( mw.util.addPortletLink(
   'p-tb',
   '#',
   'Suchen und Ersetzen',
   't-tidy-up-replace',
   'tidy-up-replace',
   null,
   null
  ) ).click( function() {
   if ( loaded ) {
    tidyupReplace();
   } else {
    window.callbackMonobookTidyUpJs = 'tidyupReplace';
    mw.loader.load( '//de.wikipedia.org/w/index.php?title=Benutzer:Umherirrender/monobook-tidy-up.js&action=raw&ctype=text/javascript' );
    loaded = true;
   }
  } );
  // Standardlink zum Quelltext aufräumen
  $( mw.util.addPortletLink(
   'p-tb',
   '#',
   'tidy-up',
   't-tidy-up',
   'tidy-up',
   null,
   null
  ) ).click( function() {
   if ( loaded ) {
    tidyup();
   } else {
    // load on demand
    window.callbackMonobookTidyUpJs = 'tidyup';
    mw.loader.load( '//de.wikipedia.org/w/index.php?title=Benutzer:Umherirrender/monobook-tidy-up.js&action=raw&ctype=text/javascript' );
    loaded = true;
   }
  } );
 } );

 //nur Artikel und beim Öffnen des Bearbeitenmodus
 if ( mw.config.get( 'wgNamespaceNumber' ) === 0 && mw.config.get( 'wgAction' ) === 'edit' ) {
  window.callbackMonobookTidyUpJs = 'tidyup';
  mw.loader.load( '//de.wikipedia.org/w/index.php?title=Benutzer:Umherirrender/monobook-tidy-up.js&action=raw&ctype=text/javascript' );
  loaded = true;
 }
}());
//</nowiki> __NOINDEX__

(function() {

$( function() {
 mw.loader.using( [ 'mediawiki.util' ], function() {
  if ( mw.config.get( 'wgAction' ) === 'edit' || mw.config.get( 'wgAction' ) === 'submit' ) {
   $( mw.util.addPortletLink(
    'p-tb',
    '#',
    'Doppelte Argumente finden',
    't-dupargs',
    'Doppelte Argumente finden',
    'b'
   ) ).one( 'click', function() {
     mw.loader.using( [ 'mediawiki.api', 'jquery.textSelection' ], findDupArgs );
     $( '#t-dupargs a' ).css( { color: 'grey' } );
   } );
  }
 } );
} );

function findDupArgs() {
 var api = new mw.Api();
 var $textbox = $( '#wpTextbox1' );
 if ( !$textbox.length ) {
  return;
 }

 // Get the parsetree for the current content of the editform
 api.post( {
  action: 'parse',
  title: mw.config.get( 'wgPageName' ),
  text: $textbox.val(),
  prop: 'parsetree',
  contentmodel: mw.config.get( 'wgPageContentModel' )
 } ).then( function( data ) {
  if ( !data.parse || !data.parse.parsetree ) {
   //badcontentformatforparsetree
   mw.notify(
    'Nur für WikiText-Seiten',
    { tag: 'badcontentformatforparsetree' }
   );
   return;
  }
  findDupArgsInParseTree( $textbox, data.parse.parsetree['*'] );
 } ).fail( function( code, data ) {
  mw.notify(
   'Fehler beim ermitteln der doppelten Argumente' +
   ' (' + code + ( data && data.error && data.error.info ? ': ' + data.error.info : '' ) + ')',
   { tag: 'dupargs-error' }
  );
 } );
}

function findDupArgsInParseTree( $textbox, parsetree ) {
 var xmlDoc = $.parseXML( parsetree );
 var found = false;

 // The xml tree walker
 var walkTreeJ = function() {
  var $node = $( this );
  if ( this.nodeName === 'template' ) {
   var allArgs = {};
   $node.children( 'part' ).each( function() {
    var $part = $( this ), name, found, start, end;
   
    if ( $part.children( 'name' ).attr( 'index' ) ) {
     name = $part.children( 'name' ).attr( 'index' );
    } else {
     name = $.trim( $part.children( 'name' ).text() );
    }
    value = $part.children( 'value' ).text();
    if ( name in allArgs ) {
     found = true;
     start = calcLength( xmlDoc.firstChild, $part.children( 'name' )[0] );
     end = start + calcLength( $part[0] );
     $textbox.textSelection( 'setSelection', { start: start, end: end } );
     $textbox.textSelection( 'scrollToCaretPosition' );
    } else {
     allArgs[name] = value;
    }
   } );
  }

  // recursive for all childs
  $node.children().each( walkTreeJ );
 };

 // Start with the <root> and go through the whole tree
 $( xmlDoc ).first().each( walkTreeJ );
 if ( !found ) {
  mw.notify(
   'Alles in Ordnung. Konnte kein doppeltes Argument finden.',
   { tag: 'dupargs-error' }
  );
 }
}

/**
 * Helper function to calculate the length of wikitext from the parsetree to show the position of the cursor
 */
var calcLength = function( node, stopNode ) {
 var options = { stopNode: stopNode, stop: false };
 var calcLengthInternal = function( node, options ) {
  var value = 0;
  if ( node === stopNode ) {
   options.stop = true; // stop recursive calls
  } else if ( node.nodeType === 3 ) {
   value += node.nodeValue.length;
  } else {
   for ( var i = 0, len = node.childNodes.length; i < len; i++ ) {
    var child = node.childNodes[i];
    if ( child.nodeName === 'template' ) {
     value += 2; // for {{
     value += calcLengthInternal( child, options );
     if ( options.stop ) {
      break;
     }
     value += 2; // for }}
    } else if ( child.nodeName === 'tplarg' ) {
     value += 3; // for {{{
     value += calcLengthInternal( child, options );
     if ( options.stop ) {
      break;
     }
     value += 3; // for }}}
    } else if ( child.nodeName === 'ext' ) {
     value += 2; // for <>
     value += calcLengthInternal( child, options );
     if ( options.stop ) {
      break;
     }
     // close tag is a own text node
    } else if ( child.nodeName === 'part' ) {
     value += 1; // for |
     value += calcLengthInternal( child, options );
     if ( options.stop ) {
      break;
     }
    } else {
     value += calcLengthInternal( child, options );
     if ( options.stop ) {
      break;
     }
    }
   }
  }
  return value;
 };
 return calcLengthInternal( node, options );
};

}());