MediaWiki:Gadget-Ricetta.js
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.
/// <pre>
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++ CREAZIONE RAPIDA RICETTA +++
+++ codice originale di Wim b con l'aiuto fondamentale di Ricordisamoa +++
+++ e Daimona Eaytoy (praticamente tutti tranne Wim b alla fine) +++
vers. beta 1.1
1.1 - Creazione della casella per creare il titolo
1.2 - Implementazione avvisi in caso campi obbligatori lasciati vuoti;
Sostituito il pulsante per scrivere con uno che sfrutta OOUI;
Ora la pagina viene creata con l'iniziale maiuscola;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
/* jshint maxerr: 10000 */
/* global $, mw */
//creo il link nelle pagine speciali
if (mw.config.get('wgCanonicalSpecialPageName') === 'Specialpages') {
$('#mw-specialpagesgroup-pagetools').next().find('ul').eq(0)
.prepend('<li><a href="/wiki/Speciale:Ricetta">Scrivi ricetta</a></li>');
}
//Creo il link nel portlet
mw.loader.using('mediawiki.util').then(function() {
mw.util.addPortletLink('p-tb', '/wiki/Speciale:Ricetta', 'Nuova ricetta', 'p-ricetta', 'segui la procedura guidata per creare una nuova ricetta');
});
// Evito link rosso nelle pagine dei contenuti
$("a[href$='/wiki/Speciale:Ricetta']").attr({
'title': 'Speciale:Ricetta'
}).removeClass();
// CREAZIONE CASELLA E BOTTONE PER LA CREAZIONE DELLE RICETTE
//personalizzazioni variabili
var DefaultTXT = 'Inserisci il titolo della ricetta';
var ButtonRicettaLabel = 'Crea ricetta';
//casella di testo
var textInputRicetta = new OO.ui.TextInputWidget({
indicator: 'required',
placeholder: DefaultTXT,
id: 'TXTTitleRicetta'
});
//bottone di ricerca
var buttonRicetta = new OO.ui.ButtonWidget({
label: ButtonRicettaLabel,
flag: 'progressive',
});
$('#InputRicette').append(textInputRicetta.$element);
$('#BottoneRicette').append(buttonRicetta.$element);
//Bottone di Submit per scrivere la ricetta
var buttonSubmitRicettaTXT = 'Scrivi';
var buttonSubmitRicetta = new OO.ui.ButtonWidget( {
label: buttonSubmitRicettaTXT,
target: '_blank',
flags: [
'primary',
'progressive'
]
});
//Funzione per creare le finestre
function AlertWindow (alertTitle, alertTXT, AlertSize) {
var messageDialog = new OO.ui.MessageDialog();
// Crea e appende la finetra.
var windowManager = new OO.ui.WindowManager();
$(document.body).append(windowManager.$element);
windowManager.addWindows([messageDialog]);
// Apre la finestra di errore.
alertSize = (AlertSize === "" ? '' : AlertSize);
windowManager.openWindow(messageDialog, {
id: 'RicettaAlert',
size: alertSize,
title: alertTitle,
message: new OO.ui.HtmlSnippet( alertTXT ),
verbose: true,
actions: [{
action: 'accept',
label: 'Chiudi',
flags: 'primary'
}]
});
}
// Avviso errore compilazione Form per creare la ricetta
buttonRicetta.$element.click(function() {
RicettaTarget = $('#TXTTitleRicetta input').val();
if (RicettaTarget === "") {
//TESTO VUOTO: Visualizza un prompt per inserire il titolo corretto
OO.ui.prompt( 'Stai tentando di inserire una nuova ricetta senza però specificare il titolo. Inseriscilo nella casella qui sotto e premi "Ok"', {
textInput: { placeholder: 'Inserisci un nome per la ricetta' },
title: 'Titolo della ricetta vuoto',
} ).done( function ( result ) {
if ( result !== null ) {
if ( result !== "" ) {
// Se il testo viene inserito:
window.location = "/wiki/Speciale:Ricetta?ricetta="+result+"";
} else {
// Se il testo NON viene inserito per la seconda volta:
AlertWindow ('Titolo della ricetta vuoto, di nuovo', 'Non vuoi proprio inserirlo il titolo di questa ricetta, vero?!<br>'
+'<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Burro_feliz_merida.JPG/180px-Burro_feliz_merida.JPG">'
+'<br><div style="visibility: hidden">Shock the Donkey</div>') ;
}
} else {
null;
}
});
} else {
// reindirizzamento alla pagina speciale
// (se il titolo viene inserito subito nella casella)
window.location = "/wiki/Speciale:Ricetta?ricetta=" + RicettaTarget + "";
}
});
if (mw.config.get('wgNamespaceNumber') == -1 && mw.config.get('wgTitle') == 'Ricetta') {
$(document).ready(function() {
// FUNZIONE PER RECUPERARE L'URL, di wikipedia:User:Splarka
function queryString(p) {
var re = RegExp('[&?]' + p + '=([^&]*)');
var matches;
if (matches = re.exec(document.location)) {
try {
return decodeURI(matches[1]);
} catch (e) {}
}
return null;
}
//Sostituisco il titolo
$('h1').text('Nuova ricetta');
// e l'intestazione nel tab
document.title = 'Creazione nuova ricetta - Wikibooks';
$('#bodyContent').replaceWith('Inserisci tutti i dati richiesti per scrivere velocemente una nuova ricetta' +
'<input name="title" type="hidden" value="Speciale:Ricetta" />' +
'<fieldset><legend>Creazione rapida di una nuova ricetta</legend>' +
'<h3>Informazioni preliminari </h3>' +
'<li><b>Nome della ricetta:</b> <input type="text" id="NomeRicetta" name="NomeRicetta size="30"></li>' +
'<li><b>Breve descrizione:</b> (Descrizione aspetto, indicazione periodo o ricorrenza, ecc…)</li>' +
'<textarea rows="4" cols="50" id="DescrizioneRicetta" name="DescrizioneRicetta"></textarea>' +
'<li><b>Per quante persone:</b> <input type="text" id="NumeroPersone" name="NumeroPersone" size="3" maxlength="2"></li>' +
'<h3>Ingredienti: <button id="addIngrediente" >+</button><p></p> </h3>' +
'<div id="IngredientiNuovi">' +
'<div id="IngredientiAggiuntivi">' +
'Ingrediente:<span id="ing00"></span> <input class="mw-ui-input Ingrediente" name="NuovoIngrediente00" id="NuovoIngrediente00" size="80%">' +
' ' +
'Quantità: <input class="mw-ui-input IngredienteQ" name="NuovaQuantita00" id="NuovaQuantita00" size="6" maxlength="5" value=""> <select id="Quantita00" name="Quantita00">' +
'<optgroup id="Liquidi" name="Liquidi" label="Liquidi">Liquidi</optgroup>' +
'<option value="ml">millilitri</option>' +
'<option value="cl">centilitri</option>' +
'<option value="l">litri</option>' +
'<optgroup id="Solidi" name="Solidi" label="Solidi">Solidi</optgroup>' +
'<option value="mg">milligrammi</option>' +
'<option value="g">grammi</option>' +
'<option value="hg">etti</option>' +
'<optgroup id="Altro" name="Altro" label="Altro">Altro</optgroup>' +
'<option value="q. b.">quanto basta</option>' +
'<option value="cucchiaio">cucchiaio</option>' +
'<option value="cicchiaino">cicchiaino</option>' +
'<option value="pizzico">pizzico</option>' +
'</select>' +
'<input name="AltraUnita00" type="checkbox" value="" id="AltraUnita00" style="">Altra unità di misura</input> <input class="mw-ui-input" name="Altro00" id="Altro00" size="10"/></input> <p></p>' +
'</div>' +
'</div>' +
'</td></tr>' +
'</table>' +
'<h3>Passaggi: <button id="addPassaggio" >+</button><p></p> </h3>' +
'<div id="PassaggiNuovi">' +
'<div id="PassaggiAggiuntivi">' +
'Passaggio:<input class="mw-ui-input Passaggio" name="Passaggio00" id="Passaggio00" size="80%"/>'
// + '<textarea id="passaggi" type="text" rows="10" name="passaggi"; />'
+
'<br/>' +
'</div>' +
'</div>' +
'\n' +
'<h3>Consigli:</h3>' +
'<input name="CBConsigli" type="checkbox" value="" id="CBConsigli" style="">Hai dei consigli per questa ricetta?' +
'<textarea rows="4" cols="50" id="ConsigliRicetta" name="ConsigliRicetta" disabled></textarea>' +
'\n' +
'<h3>Categorie:</h3>' +
'<div id="ElencoCategorie"></div>' +
'<p></p>' +
'<div id="Button"></div>' +
'</fieldset><div id="results" style="visibility: hidden"></div></form>').ready(function() {
// Appendo il bottone per scrivere la ricetta
$('#Button').parent().append( buttonSubmitRicetta.$element );
// paramentro che equivale al nome della ricetta (recuperato dal titolo)
$('#NomeRicetta').val(queryString('ricetta'));
//ID incrementali per gli ingredienti
var current_id = 0;
$('#addIngrediente').click(function() {
nextElement($('#IngredientiAggiuntivi'));
});
function nextElement(element) {
var newElement = element.clone().appendTo($('#IngredientiNuovi'));
current_id++;
var id = (current_id < 50 ? '0' : '') + current_id;
newElement.attr('id', newElement.attr('id').replace(/00/, id));
$('input', newElement).each(function() {
$(this).attr('id', $(this).attr('id').replace(/00/, id));
var nome = $(this).attr('id');
$(this).attr('name', nome);
}).val('');
//Menù a discesa
$('select', newElement).each(function() {
$(this).attr('id', $(this).attr('id').replace(/00/, id));
var nome = $(this).attr('id');
$(this).attr('name', nome);
}).val('');
$('#addIngrediente').prop('disabled', current_id > 49);
}
//ID incrementali per i passaggi
var current_idPassaggi = 0;
$('#addPassaggio').click(function() {
nextElementInt($('#PassaggiAggiuntivi'));
});
function nextElementInt(element) {
var newElementInt = element.clone().appendTo($('#PassaggiNuovi'));
current_idPassaggi++;
var idPassaggi = (current_idPassaggi < 100 ? '0' : '') + current_idPassaggi;
newElementInt.attr('id', newElementInt.attr('id').replace(/00/, idPassaggi));
$('input', newElementInt).each(function() {
$(this).attr('id', $(this).attr('id').replace(/00/, idPassaggi));
var nomeInt = $(this).attr('id');
$(this).attr('name', nomeInt);
}).val('');
$('#addPassaggio').prop('disabled', current_idPassaggi > 99);
}
///Gestione del CB per i consigli
$('input#CBConsigli').change(function() {
if (this.checked) {
$('textarea#ConsigliRicetta').attr('disabled', false).focus();
} else {
$('textarea#ConsigliRicetta').attr('disabled', true);
}
return false;
});
// Funzione API per recuperare le categorie delle ricette
var api = new mw.Api();
function getSubCategories(title, cont, pages) {
return api.get($.extend({
action: 'query',
generator: 'categorymembers',
gcmtitle: title,
gcmtype: 'subcat',
gcmlimit: 'max',
prop: 'categoryinfo|categories',
clcategories: title,
clprop: 'sortkey'
}, cont)).then(function(data) {
pages = $.extend(true, {}, pages || {}, data.query.pages);
if (data['continue'] !== undefined) {
return getSubCategories(title, data['continue'], pages);
}
return $.map(pages, function(page) {
return page;
}).sort(function(a, b) {
if (a.categories[0].sortkey > b.categories[0].sortkey) {
return 1;
}
if (a.categories[0].sortkey < b.categories[0].sortkey) {
return -1;
}
return 0;
});
});
}
function doneFilter(level, cbLevel, pages) {
return pages.map(function(page) {
var $li = $('<li>').append(
$('<label>')
.text(new mw.Title(page.title).getMainText())
.prepend(
level >= cbLevel ?
$('<input>').attr({
type: 'checkbox',
name: 'Categoria',
value: new mw.Title(page.title).getMainText()
}) : []
)
);
if (page.categoryinfo.subcats > 0) {
$('<button>')
.append(
$('<span>').text('►'),
$('<span>').text('▼').hide()
)
.one('click', function() {
var $ul = makeList(page.title, level + 1, cbLevel).appendTo($li);
$(this).children().toggle();
$(this).on('click', function() {
$ul.toggle();
$(this).children().toggle();
});
})
.prependTo($li);
}
return $li;
});
}
function makeList(title, level, cbLevel) {
var $ul = $('<ul>').css('list-style', 'none').append(
$('<li>').text('caricamento in corso...')
);
getSubCategories(title, {})
.then(
doneFilter.bind(
null,
level !== undefined ? level : 0,
cbLevel !== undefined ? cbLevel : 1
)
//failFilter
)
.always(function($listContents) {
$ul.empty().append($listContents);
});
return $ul;
}
makeList('Categoria:Ricette').appendTo('#ElencoCategorie');
//FUNZIONE QUANDO SI PREME IL BOTTONE
buttonSubmitRicetta.$element.click(function (event) {
// Funzione per trasformare la prima lettera in maiuscola
String.prototype.ucfirst = function() {
return this.charAt(0).toUpperCase() + this.slice(1);
};
// Funzione per scrivere materialmente nelle pagine
function writeInPage(title, content, summary, option, section, success, tags) {
var param = {
action: 'edit',
title: title,
summary: summary,
tags: tags,
format: 'json'
};
param[option || 'text'] = content;
if (section || section === 0) {
param.section = section;
}
new mw.Api().postWithEditToken(param)
.done(function() {
if (typeof(success) === 'function')
success();
});
}
var success = '<span style="color:#00A050; font-size:20px">√</span>';
// recupera e mette in elenco i valori dei passaggi della ricetta
resPass = $('input.Passaggio').map(function(_, el) {
return $(el).val();
}).get().join(';\n# ');
var resPass = '# ' + resPass + '.';
// Elenca tutte le categorie da aggiungere
resCat = $('input[name=Categoria]:checked').map(function(_, el) {
return $(el).val();
}).get().join('|');
var resCat = '{{Categorie della ricetta|' + resCat + '}}';
var values = Object.create(null);
$('#IngredientiNuovi :input').serializeArray().forEach(function(input) {
values[input.name] = input.value;
});
//Funzione per recuperare l'lenco degli ingredienti
var resIngr = $('#IngredientiNuovi > *').map(function(i) {
var id = (i < 50 ? '0' : '') + i,
ing = [],
qua = values['NuovaQuantita' + id];
var preposizione = (values['Quantita' + id] === null || values['Altro' + id] === '') ? "" : " di ";
if (qua) {
ing.push(qua);
}
ing.push(
values[('AltraUnita' + id in values ? 'Altro' : 'Quantita') + id],
preposizione,
values['NuovoIngrediente' + id]
);
return ing.join(' ');
}).get().join(';\n* ');
resIngr = '* ' + resIngr + '.';
//INIZIO VARIABILI DEL TESTO
var NomeRicetta = $("#NomeRicetta").val().ucfirst();
var NumeroPersone = $("#NumeroPersone").val();
var TxtPersone = (NumeroPersone > 1 ? 'persone' : 'persona');
var DescrizioneRicetta = $('#DescrizioneRicetta').val();
var ConsigliRicetta = $('#ConsigliRicetta').val();
//Gestione CB per i consigli, se no ce ne sono, non scrive niente
var SezConsigliRicetta;
if ($('input#CBConsigli').is(':checked')) {
SezConsigliRicetta = '== Consigli ==\n' + ConsigliRicetta + '\n\n';
} else {
SezConsigliRicetta = '';
}
//Testo da scrivere nelle pagina
var Testo = '' + DescrizioneRicetta + '.\n' +
'\n' +
'== Ingredienti ==\n' +
'per \'\'\'' + NumeroPersone + '\'\'\' '+TxtPersone+'\n' +
'\n' +
'' + resIngr + '\n' +
'\n' +
'== Preparazione ==\n' +
'\n' +
'' + resPass + '\n' +
'\n' +
'' + resCat + '';
//Valori di default per compararli con i valori delle variabili e "decidere" se avvisare o meno
var resCatDefault = '{{Categorie della ricetta|}}';
var resPassDefault = '# .';
var resIngrDefault= '* ml .';
// Controllo su eventuali campi vuoti e relativo avviso
if (resCat === resCatDefault || resPass === resPassDefault || resIngr === resIngrDefault || NumeroPersone === "" || NomeRicetta === "" ) {
// testo delle voci dell'elenco puntato d'aiuto sui parametri mancanti
var ANomeRicetta = (NomeRicetta === "" ? '<li> <b>Nome</b> - è necessario inserire il nome della ricetta <br>' : '');
var AresCat = (resCat === resCatDefault ? '<li> <b>Categorie</b> - inserisci almeno una categoria <br>' : '');
var AresPass = (resPass === resPassDefault ? '<li> <b>Passaggi</b> - inserisci almeno un passaggio <br>' : '');
var AresIngr = (resIngr === resIngrDefault ? '<li> <b>Ingredienti</b> - inserisci almeno un ingrediente <br>' : '');
var ANumeroPersone = (NumeroPersone === "" ? '<li> <b>Per quante persone</b> - inserisci il numero di persone a cui si referiscono le dosi <br>' : '');
// Testo dell'avviso "parametri mancanti"
AlertWindow ('ATTENZIONE: Campi non compilati', 'I seguenti campi fondamentali non risultano compilati:<br>'
+''+ANomeRicetta+AresCat+AresPass+AresIngr+ANumeroPersone+'Inserisci tutte queste informazioni e poi premi nuovamente "'+buttonSubmitRicettaTXT+'"', 'large');
} else {
mw.loader.using('mediawiki.user', writeInPage("Libro di cucina/Ricette/" + NomeRicetta, "" + Testo + "", "[[MediaWiki:Gadget-Ricetta.js|Script]]: Creazione nuova ricetta", "text", false, function() {
AlertWindow ('Complimenti!',success + ' La pagina "<a href="/wiki/Libro di cucina/Ricette/' + NomeRicetta + '" id="PageCreated">' + NomeRicetta + '</a>" è stata creata con successo.<br><br>Se hai altre modifiche da apportare alla ricetta, puoi seguire il link e <a href="/w/index.php?title=Libro di cucina/Ricette/' + NomeRicetta + '&action=edit" id="PageEdit"> iniziare a modificare</a>', 'medium');
}, "Ricette (BETA)"));
}
});
});
}); //chiusura $(document).ready
}
/* resPass = elenco di tutti i passaggi della ricetta
resCat = elenco di tutte le categorie da aggiungere
resIng = Elenco di tutti gli ingredienti
*/