Razionalizziamo i batch

Da bravi programmatori incapsuliamo le funzioni


Così come abbiamo fatto per la generazione dei file di controllo di spumux dobbiamo cercare di raggruppare i comandi per la generazione delle immagini e soprattutto delle maschere. Solo così eviteremo di dover controllare ogni volta le posizioni dei vari elementi lasciando che sia il programma a fare il lavoro per noi.

Iniziamo con il generare i pulsanti per i menu con solo testo; come nel caso precedente utilizzeremo javascript in una struttura WSF come si può vedere nel Listato 8 (Nuova pagina).

Il comando maketextbutton può prendere una lunga serie di parametri molti dei quali opzionali:

  • filename Il nomefile del bottone
  • iconfile Il file con l'icona del bottone
  • buttontext Il testo da rappresentare
  • font Eventuale tipo di carattere (default: verdana)
  • pointsize Eventuale dimensione del carattere (default: 30)
  • color Eventuale colore del carattere (default: white)
  • maskcolor Eventuale colore della maschera (default: green)

Il flusso del programma è piuttosto lineare e non necessita di particolari commenti se non una piccola nota relativa all'oggetto COM di ImageMagick.

Questo ha infatti solo alcuni metodi che si chiamano come i rispettivi tool command line e che prendono delle stringhe con i parametri. La cosa da notare è che ogni parametro va messo in una stringa separata e non è permesso raggruppare più opzioni nella stessa stringa (nemmeno i parametri dell’opzione stessa).

Qui era un caso semplice ed è bastato riadattare la riga di comando per ottenere il codice, ma vedremo che in altri casi dovremo fare qualcosa di più complesso.

In questo caso abbiamo riportato come maschera il testo del pulsante cosicchè quando questo è attivato la scritta sullo schermo cambia colore; naturalmente possiamo cambiare il codice che genera la maschera per ottenere altri effetti.

Una volta creati tutti i pulsanti avremo bisogno di un programma che li raggruppi per creare un menu completo: a questo serve maketextmenu.wsf.

Anche questo programma (Listato 9 (Nuova pagina)) ha una lunga lista di opzioni:

  • filename Il nomefile del menu
  • backfile Il file con lo sfondo
  • menutext Il titolo del menu
  • item1 Voce di menu n.1
  • item2 Eventuale voce di menu n.2
  • item3 Eventuale voce di menu n.3
  • item4 Eventuale voce di menu n.4
  • item5 Eventuale voce di menu n.5
  • font Eventuale tipo di carattere (default: verdana)
  • pointsize Eventuale dimensione del carattere (default: 60)
  • color Eventuale colore del carattere (default: white)

La struttura iniziale di questo secondo programma è del tutto analoga a quella del precedente, poi invece dobbiamo gestire un numero variabile di parametri per il metodo convert di ImageMagickObject.

Per fare questo sfrutteremo la funzione eval di javascript che permette di eseguire del codice contenuto all'interno di una stringa.

Per prima cosa riempiamo un array con tutte le stringhe dei parametri che ci serviranno, poi le concateniamo con il metodo join dell'array in questa riga


var cmd = "im.Convert(\"" + arr.join("\",\"")+"\",\""+filename+".jpg\")";

L'aspetto è reso confuso dall'abbondante presenza di virgolette, alcune come delimitatori di stringa, altre precedute dal codice di escape all'interno delle stringhe.

Nonostante tutto il codice è concettualmente semplice: infatti il cuore è quel arr.join che concatena le varie stringhe che compongono l'array arr inserendo ogni volta la sequenza virgolette-virgola-virgolette. Una volta composto il comando non ci resta che eseguirlo con una eval.

Proseguendo si sostituiscono i nomi delle immagini con quelli delle maschere e allo stesso modo si crea un comando da valutare dinamicamente.

L’ultima utility è quella che serve a creare i menu con le immagini e che si può vedere nel Listato 10 (Nuova pagina), Anche per questa cominciamo con l’analizzare i parametri che può ricevere:

  • filename Il nomefile del menu
  • backfile Il file con lo sfondo
  • item1 Immagine n.1
  • item2 Immagine n.2
  • item3 Immagine n.3
  • item4 Immagine n.4
  • iconhome Icona per tornare al menu principale
  • iconprev Icona per tornare al menu precedente
  • iconnext Icona per andare al menu successivo
  • maskcolor Eventuale colore della maschera (default: green)
  • xgap Eventuale margine tra le immagini (default: 11)

Anche in questo caso si fa gran uso di array concatenati con il metodo join in quanto dobbiamo gestire un numero variabile di immagini e di icone per lo spostamento tra i menu.

Una riga abbastanza curiosa è quella che carica il parametro xgap:


xgap = WScript.Arguments.Named("xgap") * 1;

La moltiplicazione per uno serve a far sì che la variabile xgap sia numerica e non una stringa. Non dimentichiamo che stiamo utilizzando un linguaggio di scripting che utilizza l’operatore + sia per l’operazione matematica di addizione che per la concatenazione delle stringhe. Inoltre a complicare le cose ci si mette anche il casting automatico che rende possibili magie come


arrc[cntc*4+7] = "+" + (384 - xgap - 5 -  xwidth) + "+450";

dove all'elemento dell'array viene assegnata una stringa "+176+450" in cui il primo numero è ottenuto dall'espressione matematica.

Qui non sussistono problemi perchè si utilizzano operatori - che non creano ambiguità, ma se utilizziamo il + come in questo caso


arrc[cntc*4+7] = "+" + (384 + xgap + 5 + xwidth - 64) + "+450";

è fondamentale il tipo della variabile xgap.

L'operatore + infatti si comporta da addizione matematica solo se entrambi gli operandi sono numerici, altrimenti effettua la concatenazione di stringhe facendo il casting dell'eventuale operando numerico.

La moltiplicazione dopo la lettura del parametro xgap serve a forzare il casting verso un numero della variabile e quindi ad ottenere la valutazione corretta delle espressioni.

Inizio pagina
 
Precedente
Sommario
Successivo