User:Amire80/common.js

From translatewiki.net

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
$( function () {
	"use strict";
	
	var wgCanonicalSpecialPageName = mw.config.get( 'wgCanonicalSpecialPageName' ),
		tokenParams = {
			action: 'query',
			meta: 'tokens',
			type: 'csrf',
			format: 'json'
		};

	function searchTranslationsMakeEditableLinks() {
		var $trigger = $( '<a>' ).text( 'Make editable links' ),
			$results = $( '.results' ),
			$messages = $results.find( '.tux-message' );

		$trigger.click( function () {
			$messages.each( function () {
				var $editLink = $( this ).find( '.tux-edit' ),
					$newEditLink = $editLink.clone(),
					$newEditA = $newEditLink.find( 'a' ),
					newUri = new mw.Uri( $newEditA.attr( 'href' ) );
		
				newUri.query.language = 'he';
				$newEditA.attr( 'href', newUri.toString() );
				$editLink.after( $newEditLink );
			} );
		} );

		$results.before( $trigger );
	}
	
	function languageStatsHideNonMediaWiki() {
		var $hideTrigger,
			mwGroupsRe = /(^core$)|(^pagecontentservice$)|(^mediawiki-)|(^ext-)|(^mwgerrit-)|(^mwgitlab-)|(^mwgithub-)|(^mwgithubskin-)|(^mwbitbucketskin-)|(^jquery-uls)/,
			$statsTable = $( 'table.statstable' );

		if ( $statsTable.length === 0 ) {
			return;
		}

		$statsTable.attr( 'id', 'theTable' );

		$hideTrigger = $( '<a>' )
			.text( 'Hide non-MediaWiki' )
			.attr( 'href', '#theTable' )
			.on( 'click', function () {
				// Expand all
				$( 'p.groupexpander-all a' ).click();

				// Hide the non-MediaWiki things
				$statsTable.find( 'tbody tr' ).each( function () {
					var $row = $( this );

					if ( !( $row.hasClass( 'FileBasedMessageGroup' ) || $row.hasClass( 'MediaWikiExtensionMessageGroup' ) ) ||
						$row.data( 'groupid' ).match( mwGroupsRe ) === null
					) {
						$row.hide();
					}
				} );

				// Sort the table by "Untranslated" column
				$( $( '#theTable thead tr th' ).get( 2 ) ).click();
			} );
		
		$statsTable.before( $hideTrigger );
	}
	
	function translationsDeleteDuplicates() {
		var deleteHandler,
			$deleteButton = $(),
			englishText = '',
			languageCode = '',
			language = {},
			title = '',
			$languageLinks = $(),
			$historyLink = $(),
			$rows = $( 'table.mw-sp-translate-table tbody' ).find( 'tr' );
		
		const titleRe = /(^.+:.+):/;

		deleteHandler = function ( e ) {
			var api = new mw.Api(),
				$a = $( this ),
				title = $a.attr( 'title' );

			api.get( tokenParams ).done( function ( data ) {
				var deleteParams = {
					action: "delete",
					format: "json",
					title: title,
					watchlist: "watch",
					reason: "identical to English source",
					token: data.query.tokens.csrftoken
				};

				api.post( deleteParams )
					.done( function ( data ) {
						console.log( 'deleted ' + title );
						$a.text( 'deleted ' + title );
					} )
					.fail( function ( data ) {
						console.log( 'failed to delete ' + title );
						$a.text( 'failed to delete ' + title );
					} );
			} );
		};

		$rows.each( function ( index, element ) {
			var $languageCell = $(),
				$contentCell = $(),
				languageMatchResult = '',
				$cells = $( this ).find( 'td' );
				
			const languageCodeRe = /\(([^(]+)\)$/;
			
			if ( $cells.length !== 2 ) {
				return;
			}
			
			$languageCell = $( $cells.get( 0 ) );
			$contentCell = $( $cells.get( 1 ) );
			
			languageMatchResult = $languageCell.text().match( languageCodeRe );
			if ( languageMatchResult === null
				|| languageMatchResult.length !== 2
			) {
				return;
			}
			
			languageCode = languageMatchResult[1];
			language[languageCode] = {
				language: $languageCell,
				content: $contentCell
			};
		} );
		
		englishText = language.en.content.text();
		
		for ( languageCode in language ) {
			if ( [ 'en', 'qqq' ].includes( languageCode ) ) {
				continue;
			}

			if ( language[languageCode].content.text() === englishText ) {
				$languageLinks = language[languageCode].language.find( 'a' );
				$historyLink = $( $languageLinks.get( 0 ) );

				title = $historyLink.attr( 'title' ).match( titleRe )[1];

				$deleteButton = $( '<a>' )
					.attr( {
						title: title
					} )
					.text( 'delete ' + title )
					.click( deleteHandler );
				
				$historyLink.before( $deleteButton );
			}
		}
	}
	
	function migrateLQT() {
		// WIP
		// LiquidThreads migration script.
		// Based on [[FAQ#Talk_page_discussion_systems]]
		var $trigger = $( '<a>' ).text( 'Migrate LiquidThreads' ),
			$options = $( '.lqt-talkpage-header' ).find( '.lqt_view_options' );

		$trigger.click( function () {
			$.when( mw.loader.using( 'mediawiki.api' ), $.ready ).then( function () {
				var fromTitle = mw.config.get( 'wgPageName' ),
					toTitle = fromTitle + '/LiquidThreads',
					api = new mw.Api();
					
					api.get( tokenParams ).done( function ( data ) {
						var moveParams = {
							action: 'move',
							from: fromTitle,
							toTitle: toTitle,
							reason: 'Archiving LiquidThreads',
							noredirect: '0',
							token: data.query.tokens.csrftoken
						};
						
						api.post( moveParams )
							.done( function ( data ) {
								console.log( 'moved ' + title );
							} )
							.fail( function ( data ) {
								console.log( 'failed to move ' + title );
							} );
						} );
			} );
		} );

		$options.after( '<strong>' ).after( $trigger );
	}
	
	if ( $( '.lqt-talkpage-header' ).length ) {
		migrateLQT();
	}
	
	if ( wgCanonicalSpecialPageName === 'SearchTranslations' ) {
		searchTranslationsMakeEditableLinks();
	}

	if ( wgCanonicalSpecialPageName === 'LanguageStats' ) {
		languageStatsHideNonMediaWiki();
	}

	if ( wgCanonicalSpecialPageName === 'Translations' ) {
		translationsDeleteDuplicates();
	}
} );