MediaWiki:Gadget-YeniMadde.js

//HastaLaVi2 tarafından yazıldı

//// İlk önce, verilerin bulunduğu js dosyasını yüklemeye zorla, aksi takdirde eklenti düzgün çalışmayabilir
//function loadArrays() {
//    // İsteği ve kodu oluştur
//    var xhr = new XMLHttpRequest(),
//        s = document.createElement('script');
//
//    // Menüler.js dosyasına istek gönder
//    xhr.open('GET', '/w/index.php?title=MediaWiki:Gadget-YeniMadde-Veri.js&action=raw&ctype=text/javascript', false);
//    xhr.send();
//
//    // Yükleme için dinle ve yüklemeden sonra kodu kaldır
//    s.addEventListener("load", function(e) {
//        s.parentElement.removeChild(s);
//    });
//
//    // Kodu dosyanın içerisine yükle ve en başta yazdır
//    s.textContent = xhr.responseText;
//    document.head.appendChild(s);
//}

// Ve daha sonra asıl işin yapıldığı kısma geç, formu ait olduğu yere yerleştir
$( document ).ready( function ( $, mw ) {
	// Burada yeni madde oluşturucu için asıl tablo tanıtılmakta
	var mainTable = "<table class='wikitable' style='background: white; border:1px solid #ccc; width: 100%; margin: 2px 0;'>" +
			"\n<td><b>Yeni bir madde oluştur</b>" +
			"\n<div id='formNew' style='padding:7px;'>" +
			"\n<div class='headingsNew'>Başlıklar <small>(yalnızca kullanmak istediklerinizi seçin)</small>:</div>" +
			"\n<div class='buttonNew' style='padding-top: 2px;'><span class='helloToTheMoon'></span></div>" +
			"\n</div></td></table>",
		trans = "{{Üst||tip=çeviriler}}" + "\n" + "{{Alt}}",		// Çeviri tablosu şablonları
		// Form araçları buradan sonra tanıtılıyor...
		formItems = [];
		formItems[1] = new OO.ui.DropdownWidget( { label: 'Dil seçin', menu : { } } );
		formItems[2] = new OO.ui.DropdownWidget( { label: 'Söz türü seçin', menu : { } } );
		formItems[3] = new OO.ui.CheckboxMultiselectWidget(),
		selectedDatas = [];
	
	// Evet, dilleri ve söz türlerini açılır kapanır menüye eklemeye yarayan kısım
	function addOptionsToDropdown( dropdown, optionTexts ) {
		dropdown.getMenu().addItems( optionTexts.map( function ( optionText ) {
			if(optionText.constructor === Array){
				return new OO.ui.MenuOptionWidget( { label: optionText[1], data: optionText[0] } );
			} else {
				return new OO.ui.MenuOptionWidget( { label: optionText } );
			}
		} ) );
	}
	
	// Bu fonksiyon başlıkları seçme listesine eklemeye yarar
	function addOptionsToCheckbox( checkbox, optionTexts ) {
		checkbox.addItems( optionTexts.map( function ( optionText ) {
			return new OO.ui.CheckboxMultioptionWidget( { label: optionText, data: optionTexts.indexOf(optionText) } );
		} ) );
	}
	
	var langSelected = function(option){
		selectedDatas.lang = option.getLabel();
		selectedDatas.code = option.getData();
	};
	
	var lemmSelected = function(option){
		selectedDatas.lemma = option.getLabel();
	};
	
	// Dil seçme ve söz türü seçme kutularını forma eklemeye yarayan fonksiyon
	function insertLanguagesAndLemmas($insertBefore, formItems) {
		var namespace = mw.config.get( 'wgNamespaceNumber' );
		
		formItems[1].$element.css({
			'width': '48%',
			'z-index': '1000',
		});
		formItems[2].$element.css({
			'width': '48%',
			'z-index': '1000',
		});
		
		addOptionsToDropdown( formItems[1], languages );
		formItems[1].getMenu().on('select', langSelected);
		
		addOptionsToDropdown( formItems[2], lemmas );
		formItems[2].getMenu().on('select', lemmSelected);
		
		$insertBefore.before( formItems[1].$element );
		$insertBefore.before( formItems[2].$element );
	}
	
	// Başlıkların listesini forma eklemeye yarayan fonksiyon
	function insertHeadings($insertBefore, formItems) {
		addOptionsToCheckbox(formItems[3], headings);
		
		$insertBefore.before( formItems[3].$element );
	}
	
	// Bu fonksiyon başlık oluşturmayı kolaylaştırır
	function makeTitle(number, title) {
		if(number==2){
			return "==" + title + "==";
		} else if(number==3){
			return "===" + title + "===";
		} else if(number==4){
			return "====" + title + "====";
		} else if(number==5){
			return "=====" + title + "=====";
		}
	}
	
	// Söz türünden önce bulunan hangi başlıkların işaretli olduğunu kontrol eder ve onları düzgün sıralarına sokar
	function handleBeforeLemma(table) {
		var sample = "";
		for (i = 0; i < 3; ++i) {
			if (table[i]) {
				sample = sample + "\n\n" + makeTitle(3, table[i]) + "\n" + (i==1 ? "" : "*");
			}
		}
		return sample;
	}
	
	function headword(lang, lemma) {
		// Dile özel başlık başı şablonu var mı diye kontrol et, eğer toksa normal başlık başı şablonunu kullan
		lemma = lemma.toLowerCase();
		
		return "\n" + "{{başlık başı|" + lang + "|" + lemma + "}}" + "\n" + '#';
		
		// NOT: Burada yardıma ihtiyaç var, "{{tr-ad}}" gibi dillere özel başlık başı şablonlarının var olup olmadığını kontrol etmek gerek
	}
	
	function handleAfterLemma(table) {
		var sample = "", sayi;
		for (i = 3; i < 18; ++i) {
			if (i==15||i==16||i==17) {
				sayi = 3;
			} else {
				sayi = 4;
			}
			if (table[i]) {
				sample = sample + "\n\n" + makeTitle(sayi, table[i]) + "\n" + (i==14 ? trans : "");
			}
		}
		return sample;
	}
	
	// Bu fonksiyon en son düzenleme kutusuna eklenecek kodu yazdırır
	function createResultPageCode(formItems) {
		var headTitle = mw.util.getParamValue( 'title' ),			// URL'den "title" değerini seçer
			headSearch = mw.util.getParamValue( 'search' ),			// URL'den "search" değerini seçer
			title, resultPage = "", tryThis;
		
		if($('#firstHeading').text() === "Arama sonuçları"){
			title = headSearch;
		} else {
			title = headTitle;
		}
		
		// Buna daha sonra başlık başı şablonu oluştururken ihtiyacımız olacak
		var editableLemma = selectedDatas.lemma;
		// Söz türünden önce ve sonra gelen başlıkları birbirinden ayır, çünkü bunları ayrı bir şekilde yazdıracağız
		selectedDatas.headsBefore = [];
		selectedDatas.headsAfter = [];
		
		formItems[3].findSelectedItems().map( function(heading) {
			// Tablodaki sırası 4'ten küçük olan başlıklar söz türünden sonra gelenler, bunu "Menüler.js" dosyasından kontrol edebilirsiniz
			if (heading.getData() < 3) {
				selectedDatas.headsBefore[heading.getData()] = heading.getLabel();
			} else {
				selectedDatas.headsAfter[heading.getData()] = heading.getLabel();
			}
		});
		
		resultPage = resultPage 
			+ makeTitle(2, selectedDatas.lang) 
			+ handleBeforeLemma(selectedDatas.headsBefore)
			+ "\n\n" + makeTitle(3, selectedDatas.lemma) 
			+ headword(selectedDatas.code, editableLemma)
			+ handleAfterLemma(selectedDatas.headsAfter);
		
		$(".wikiEditor-ui-text textarea").val(resultPage);
		//window.location = 'https://tr.wiktionary.org/w/index.php?title=' + title + '&action=edit&preload=%C5%9Eablon:Yeni%20girdi&preloadparams[]=' + resultPage;
	}
	
	// Forma "Oluştur" butonunu ekleyen fonksiyon
	function finalButton($insertBefore, formItems) {
		var button = new OO.ui.ButtonWidget( { 
			label: 'Maddeyi oluştur',
		} );
		
		button.on( 'click', function () {
			createResultPageCode(formItems);
		} );
		
		$insertBefore.before( button.$element );
	}
	
	// Burası asıl sihrin gerçekleştiği yer
	$.when( mw.loader.using( 'oojs-ui-core' ), $.ready ).then( function () {
		var namespace = mw.config.get( 'wgNamespaceNumber' );
		
		if (namespace === 0||namespace === -1) {
			//loadArrays();
			$( '.mw-newarticletext' ).after(mainTable);
			$( '.mw-newarticletextanon' ).after(mainTable);
			$( '.thisPlaceForIt' ).after(mainTable);
			insertLanguagesAndLemmas( $( '.headingsNew' ), formItems);
			insertHeadings( $( '.buttonNew' ), formItems);
			finalButton( $( '.helloToTheMoon' ), formItems);
		}
	} );
		
}( jQuery, mediaWiki ) );