La command line

Le classi per la gestione della command line
Il diagramma delle classi per la commandline
Il diagramma delle classi per la commandline

L'interfaccia a riga di comando è gestita utilizzando il pacchetto Mono.Options (Nuova pagina) che è una implementazione per .NET della libreria GNU Getopt (Nuova pagina).

Utilizzando tale libreria si possono definire tutte le opzioni della command line, sia nella versione breve (un solo carattere) che in quella lunga (una stringa), un testo esplicativo associato all'opzione ed il metodo per gestirla.

Questo si fa per mezzo di righe come queste:

baseOptions = new OptionSet
        {
                { "o|output=", "set output dir/filename", o => OutputName = o },
                { "extension=", $"file extension for output file (default '{Extension}')", e => Extension = e },
                { "h|help", "show this message and exit", h => shouldShowHelp = h != null },
        };

Con queste informazioni la libreria è in grado di effettuare il parsing della riga di comando, eseguire i metodi quando incontra l'opzione, restituire l'elenco delle stringhe (generalmente nomi di file) non associate alle opzioni e formattare un help commentato.

Sembra già tutto fatto, ma se si guarda bene le classi relative a questa gestione sono quelle con il sorgente più lungo. In parte per la presenza di testi abbastanza lunghi, ma anche perchè certe operazioni richiedono di essere in qualche modo "aiutate"; in ogni caso il lavoro risparmiato è considerevole ed il risultato "standardizzato".

Anche in questo caso per facilitare l'interscambio dei parametri è stata definita una interfaccia riportata nel Listato C1 (Nuova pagina).

La classe CommandLine, riportata nel Listato C2 (Nuova pagina), è l'implementazione di base che incapsula le opzioni comuni ai vari programmi, da questa classe, e quindi dall'interfaccia, discendono tutte le altre come riportato nel diagramma all'inizio di questa pagina, cliccando sul quale potrete accedere ai listati di tutte le classi.

Le opzioni comuni

Un buon numero di opzioni gestite sono comuni a tutti i programmi, anzi alcune non sono nemmeno passate agli eseguibili, ma vengono gestite direttamente dalla classe base. Sono:

  • --nobanner sopprime il banner di presentazione del programma
  • -h, --help mostra il sommario delle opzioni ed esce
  • --helpjson mostra il template per il file JSON dei parametri ed esce
  • --helpscript mostra il template per gli script ed esce
  • --man mostra il sorgente (in Markdown) per la manpage ed esce
  • --colors mostra la lista dei nomi riconosciuti per i colori (Listato 5a (Nuova pagina)) ed esce
  • --license mostra la licenza del programma (AGPL 3.0 (Nuova pagina)) ed esce

Altre opzioni il cui valore è passato agli eseguibili sono:

  • --fillcolor=VALUE  setta il colore utilizzato per riempire le parti vuote delle immagini (default #FFFFFF, ovvero bianco)
  • --bordercolor=VALUE  setta il colore utilizzato per i bordi e le linee di taglio (default #000000, ovvero nero)
  • --dpi=VALUE  setta la risoluzione dell'immagine finale (default 300 DPI)
  • --json=VALUE  parametri in formato JSON, il testo può essere inserito in un file invece che in una stringa, in tal caso il parametro deve essere impostato come '@filename' (senza gli apici)
  • --script=VALUE  script C# per elaborazioni personalizzate, il testo può essere inserito in un file invece che in una stringa, in tal caso il parametro deve essere impostato come '@filename' (senza gli apici)
  • -o, --output=VALUE  nome del file di output (il default varia a seconda del programma)
  • --tag=VALUE  informazioni aggiuntive ad uso degli script utente, il testo può essere inserito in un file invece che in una stringa, in tal caso il parametro deve essere impostato come '@filename' (senza gli apici)

Le variabili di ambiente

La classe base della gestione commandline, è in grado di recuperare alcune impostazioni da delle veriabili di ambiente:

  • CDV_OUTPATH Path di default per i file in uscita
  • CDV_DPI  Risoluzione delle immagini prodotte
  • CDV_FILL  Colore di riempimento
  • CDV_BORDER  Colore dei bordi e delle linee di taglio

Ovviamente i parametri presenti sulla linea di comando prevalgono su quelli presenti nelle variabili.

L'elenco dei file

Tutte le stringhe che seguono le opzioni appena viste e quelle definite nelle classi specializzate vengono raccolte in una lista: sono i nomi dei file da processare che vengono passati ai vari eseguibili.

C'è una differenza nella gestione della linea di comando tra la shell di Windows e quella di Unix per quanto riguarda le wildcards (l'asterisco ed il punto interrogativo): la shell Unix le espande e passa al programma (nel nostro caso questa classe) tutti i file risultanti dalla loro espansione, Windows invece passa le stringhe così come sono e lascia al singolo programma l'onere di gestirne l'espansione.

Nella classe base è stata inserito un metodo che provvede all'eventuale espansione:

/// <summary>
/// Windows shell does not expand wildcards
/// </summary>
public void ExpandWildcards()
{
        List<string> files = new();
        foreach (string filename in FilesList)
        {
                files.AddRange(Directory.GetFiles(Path.GetDirectoryName(filename), Path.GetFileName(filename)).ToList());
        }
        FilesList.Clear();
        FilesList.AddRange(files);
}

In questo modo vengono gestiti tutti i file indipendentemente dalla shell utilizzata per richiamare i programmi.

Inizio pagina
 
Precedente
Sommario
Successivo