MediaWiki:Gadget-pulsanti-Ct.js

Da Wikisource.

Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.

  • Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
  • Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
  • Internet Explorer / Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5
  • Opera: premi Ctrl-F5.
if ( typeof $ != 'undefined' && typeof $.fn.wikiEditor != 'undefined' ) {
	var api = new mw.Api();
	optionList = [
		//param  label							default	unit	increment
		[ "f",	"Dimensione",					"100",	"%",	"10" ],
		[ "L",	"Spaziatura tra le lettere",	"0",	"em",	"0.1" ],
		[ "w",	"Spaziatura tra le parole",		"0",	"em",	"0.1" ],
		[ "t",	"Spazio sopra la riga",			"0",	"",		"0.1" ],
		[ "v",	"Spazio sotto la riga",			"0",	"",		"0.1" ],
		[ "lh",	"Altezza della linea",			"1",	"em",	"0.1" ],
		[ "l",	"Larghezza del campo",			"100",	"%",	"10" ]
	];
	
	setNewValue = function(obj, add) {
		var parent = $(obj).parent();
		var oldValue = parseFloat(parent.find('.ct-value').val());
		var incr = parseFloat(parent.data('increment'));
		var unit = parent.find('.ct-unit').val();
		if (unit == 'px')
			incr = 1;
		var newValue = (add ? oldValue + incr : oldValue - incr).toFixed(1).replace(/\.0$/, ''); // per evitare errori di arrotondamento
		parent.find('.ct-value').val(newValue);
		preview();
	};
	
	generateTemplate = function(usePlaceholder) {
		options = '';
		$('.ct-options').each(function() {
			value = $(this).find('.ct-value').val();
			if (value != $(this).data('default-value')) {
				options += $(this).data('param') + '=' + value + $(this).find('.ct-unit').val() + '|';
			}
		});
		testo = $('#ct-testo').val();
		if (testo == '' && usePlaceholder)
			testo = 'TESTO DI ESEMPIO';
		return '{'+'{Ct|' + options + testo + '}}';
	};
	
	preview = function() {
		var wikitext = '<div style="color: gray;">{'+'{Ct|TESTO SOPRA}}</div>' 
				+ generateTemplate(true) + '<div style="color: gray;">{'+'{Ct|TESTO SOTTO}}</div>';
		api.get({
			action: 'parse',
			format: 'json',
			contentmodel: 'wikitext',
			text: wikitext
		}).done(function (data, textStatus, jqXHR) {
			$('#aggiungi-ct-preview').html(data.parse.text["*"]);
		});
	};
	
	createBoxCt = function() {
		
		var box = '<div class="box aggiungi-ct-box">'
			+ '<div class="box-title"><span class="icon-close"></span></div>'
			+ '<div class="box-main aggiungi-ct-box-main"></div></div>';
		$("body").append(box);
		$('.aggiungi-ct-box').draggable();
		$('.aggiungi-ct-box').draggable('option', 'cancel', '.box-main');
		
		$('.aggiungi-ct-box-main').append('<div class="width-50 aggiungi-ct-left"></div>');
		$('.aggiungi-ct-box-main').append('<div class="width-50 aggiungi-ct-right"></div>');
		$('.aggiungi-ct-left').append('<div>Testo: <input type="text" id="ct-testo" size="31"></div>');
		$('.aggiungi-ct-right').append('<p>Anteprima:</p>');
		$('.aggiungi-ct-right').append('<div id="aggiungi-ct-preview"></div>');
		
		for (var i = 0; i < optionList.length; i++) {
			var param = 		optionList[i][0];
			var label = 		optionList[i][1];
			var defaultValue =	optionList[i][2];
			var unit =			optionList[i][3];
			var increment = 	optionList[i][4];
			
			var div = $('<div class="ct-options"></div>');
			div.append('<div class="ct-label">' + label + '</div><a class="ct-meno"></a>' +
				'<input type="text" class="ct-value" value="' + defaultValue + '"><input type="text" class="ct-unit" value="' + unit + '"><a class="ct-piu"></a></div>');
			div.attr('data-param', param);
			div.attr('data-default-value', defaultValue);
			div.attr('data-unit', unit);
			div.attr('data-increment', increment);
			$('.aggiungi-ct-left').append(div);
		}
		
		$('.ct-meno').click(function() {
			setNewValue(this, false);
		});
		
		$('.ct-piu').click(function() {
			setNewValue(this, true);
		});
		
		$('.aggiungi-ct-box-main').append('<div class="text-right"><input type="button" id="aggiungi-ct-cancel" class="btn blue" value="Annulla">' +
			' <input id="aggiungi-ct-ok" type="button" class="btn blue" value="Applica"></div>');
			
		$('.aggiungi-ct-box .icon-close, #aggiungi-ct-cancel').click(function() {
			$('.aggiungi-ct-box').remove();
		});
		$('#ct-testo').focus();
	};
	
	apriBoxCt = function() {
		var textArea = document.getElementById('wpTextbox1');
		var indexStart = textArea.selectionStart;
		var indexEnd = textArea.selectionEnd;
		var selectedText = textArea.value.substring(indexStart, indexEnd);
		var textBefore = textArea.value.substring(0, indexStart);
		var textAfter = textArea.value.substring(indexEnd);
		
		var countCt = selectedText.toLowerCase().split('{'+'{ct').length - 1;
		if (countCt > 1) {
			alert("La selezione contiene più di 1 template Ct. Selezionane uno solo e riprova.");
			return;
		} else {
			createBoxCt();
			
			var ctTextBefore = textBefore + selectedText.replace(/\}\}\s*$/m, '');
			var previousCt = ctTextBefore.toLowerCase().lastIndexOf('{'+'{ct|');
			var ctText;
			console.log('ctTextBefore: ' + ctTextBefore);
			console.log('previousCt: ' + previousCt);
			if (previousCt != -1) {
				ctTextBefore = ctTextBefore.substring(previousCt);
				console.log('ctTextBefore: ' + ctTextBefore);
				parChiuse = ctTextBefore.split('}}').length - 1;
				parAperte = ctTextBefore.split('{{').length - 1;
				if (parChiuse < parAperte) {
					var allText = textBefore + selectedText + textAfter;
					console.log('allText: ' + allText);
					var index = previousCt;
					var j = 0;
					while (j < parAperte) {
						index = allText.indexOf('}}', index + 2);
						console.log('index: ' + index);
						j++;
					}
					ctText = allText.substring(previousCt, index + 2);
					console.log('ctText: ' + ctText);
					textBefore = allText.substring(0, previousCt);
					console.log('textBefore: ' + textBefore);
					textAfter = allText.substring(index + 2);
					console.log('textAfter: ' + textAfter);
					
					var parts = ctText.split('|');
					var subTemplates = 0;
					var content = '';
					for (k = 1; k < parts.length; k++) {
						if (parts[k].indexOf('{{') != -1) {
							subTemplates++;
						}
						console.log("k: " + k + ", part: " + parts[k] + ", subTemplates: " + subTemplates);
						
						if (parts[k].indexOf('=') != -1 && subTemplates == 0) {
							var opts = parts[k].split('=');
							var par = opts[0];
							var value = opts[1].replace(/[^\d.-]/g, '');
							var uni = opts[1].replace(/[\d.-]/g, '');
							var parent = $(".ct-options[data-param='" + par + "']");
							parent.find('.ct-value').val(value);
							parent.find('.ct-unit').val(uni);
						} else {
							if (content != '')
								content += '|';
							content += parts[k];
						}
						console.log('content: ' + content);
						
						if (parts[k].indexOf('}}') != -1) {
							subTemplates--;
						}
					}
					$('#ct-testo').val(content.slice(0, -2));
				}
			}
			
			if (!ctText) {
				$('#ct-testo').val(selectedText);
				$('.aggiungi-ct-box .box-title').prepend('Aggiungi template Ct');
			} else {
				$('.aggiungi-ct-box .box-title').prepend('Modifica template Ct');
			}
				
			preview();
			$('#ct-testo, .ct-value, .ct-unit').keyup(function() {
				preview();
			});
			
			$('#aggiungi-ct-ok').click(function() {
				$('#wpTextbox1').val(textBefore + generateTemplate(false) + textAfter);
				$('.aggiungi-ct-box').remove();
			});
		}
	};
	
	$( function() {
		$('#wpTextbox1').wikiEditor( 'addToToolbar', {
			'section': 'advanced',
			'group': 'format',
			'tools': {
				'Ct': {
					label: 'Inserisci un template Ct o modificane uno già presente',
					type: 'button',
					icon: '//upload.wikimedia.org/wikipedia/commons/f/f3/Button_Ct.png',
					action: {
						type: 'callback',
						execute: function(context) {
							apriBoxCt();
						}
					}
				}
			}
		});
	});
}