Jump to content

MediaWiki:Common.js

From Mathepedia, the mathematical encyclopedia

Revision as of 02:19, 17 July 2026 by {{GENDER:InfernalAtom683|

Mathepedia render error: ! Extra }, or forgotten $. l.8 '"2} } No pages of output. Transcript written on /var/lib/mathepedia-renderer/cache/mathepedia-cbb0e139328 50b9fe4e18f60e540979921293739af0280a15eb127d1c1c6428f-tr658ql6/diagram.log.

'"7

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */

( function ( mw, $ ) {
	'use strict';

	var submissionPage = 'Project:Terminology submissions';
	var otherValue = '__other__';
	var languages = [
		'English',
		'Français',
		'Deutsch',
		'日本語',
		'中文',
		'Español',
		'Italiano',
		'Português',
		'Ελληνικά',
		'Русский',
		'한국어',
		'العربية',
		'हिन्दी',
		'Bahasa Indonesia',
		'Nederlands',
		'Polski',
		'Türkçe',
		'Українська',
		'Tiếng Việt',
		'ไทย'
	];

	function wrapNowiki( value ) {
		return '<nowiki>' + String( value ).replace( /<\/nowiki\s*>/gi, '&lt;/nowiki&gt;' ) + '</nowiki>';
	}

	function setStatus( form, message, type ) {
		var status = form.querySelector( '.terminology-form-status' );
		status.className = 'terminology-form-status' +
			( type ? ' terminology-form-status--' + type : '' );
		status.textContent = message;
	}

	function option( value, label, disabled, selected ) {
		var item = document.createElement( 'option' );
		item.value = value;
		item.textContent = label;
		item.disabled = !!disabled;
		item.selected = !!selected;
		return item;
	}

	function initialiseForm( form ) {
		var controls, languageSelect, otherLanguage, translation, submit, term;

		if ( form.getAttribute( 'data-terminology-ready' ) === 'yes' ) {
			return;
		}
		form.setAttribute( 'data-terminology-ready', 'yes' );

		term = form.querySelector( '.terminology-form-term' ).textContent.trim();
		controls = form.querySelector( '.terminology-form-controls' );
		controls.textContent = '';

		languageSelect = document.createElement( 'select' );
		languageSelect.className = 'terminology-language-select';
		languageSelect.setAttribute( 'aria-label', 'Language' );
		languageSelect.appendChild( option( '', 'Choose language', true, true ) );
		languages.forEach( function ( language ) {
			languageSelect.appendChild( option( language, language ) );
		} );
		languageSelect.appendChild( option( otherValue, 'Other language…' ) );

		otherLanguage = document.createElement( 'input' );
		otherLanguage.type = 'text';
		otherLanguage.className = 'terminology-other-language';
		otherLanguage.placeholder = 'Language name';
		otherLanguage.setAttribute( 'aria-label', 'Other language name' );
		otherLanguage.hidden = true;

		translation = document.createElement( 'input' );
		translation.type = 'text';
		translation.className = 'terminology-translation-input';
		translation.placeholder = 'Enter translation';
		translation.setAttribute( 'aria-label', 'Translation' );

		submit = document.createElement( 'button' );
		submit.type = 'button';
		submit.className = 'terminology-translation-submit';
		submit.textContent = 'Submit translation';

		controls.appendChild( languageSelect );
		controls.appendChild( otherLanguage );
		controls.appendChild( translation );
		controls.appendChild( submit );

		languageSelect.addEventListener( 'change', function () {
			otherLanguage.hidden = languageSelect.value !== otherValue;
			if ( !otherLanguage.hidden ) {
				otherLanguage.focus();
			}
		} );

		submit.addEventListener( 'click', function () {
			var language = languageSelect.value === otherValue ?
				otherLanguage.value.trim() : languageSelect.value;
			var translatedTerm = translation.value.trim();
			var sourcePage = String( mw.config.get( 'wgPageName' ) || '' ).replace( /_/g, ' ' );
			var sectionTitle;
			var sectionText;

			if ( !language ) {
				setStatus( form, 'Please choose or enter a language.', 'error' );
				languageSelect.focus();
				return;
			}
			if ( !translatedTerm ) {
				setStatus( form, 'Please enter a translation.', 'error' );
				translation.focus();
				return;
			}

			sectionTitle = 'Translation: ' + term + ' — ' + language;
			sectionText =
				"* '''Source page:''' [[" + sourcePage + "]]\n" +
				"* '''Term:''' " + wrapNowiki( term ) + "\n" +
				"* '''Language:''' " + wrapNowiki( language ) + "\n" +
				"* '''Translation:''' " + wrapNowiki( translatedTerm ) + "\n" +
				"* '''Submitted by:''' [[User:InfernalAtom683|InfernalAtom683]] ([[User talk:InfernalAtom683|talk]]) 02:19, 17 July 2026 (CST)";

			submit.disabled = true;
			setStatus( form, 'Submitting…' );

			new mw.Api().postWithToken( 'csrf', {
				action: 'edit',
				title: submissionPage,
				section: 'new',
				sectiontitle: sectionTitle,
				text: sectionText,
				summary: ( 'New terminology translation: ' + term + ' (' + language + ')' ).slice( 0, 240 ),
				watchlist: 'nochange',
				formatversion: 2
			} ).done( function () {
				translation.value = '';
				setStatus( form, 'Translation submitted for review. Thank you!', 'success' );
			} ).fail( function ( code, data ) {
				var detail = data && data.error && data.error.info ? ' ' + data.error.info : '';
				setStatus( form, 'Submission failed.' + detail, 'error' );
			} ).always( function () {
				submit.disabled = false;
			} );
		} );
	}

	function initialiseTerminologyForms( $content ) {
		$content.find( '.terminology-translation-form' ).each( function () {
			initialiseForm( this );
		} );
	}

	mw.loader.using( 'mediawiki.api' ).then( function () {
		mw.hook( 'wikipage.content' ).add( initialiseTerminologyForms );
	} );
}( mediaWiki, jQuery ) );