Condividi questa pagina

Impara X in Y minuti

Dove X=TOML

TOML è l'acronimo di Tom's Obvious, Minimal Language. È un linguaggio per la serializzazione di dati, progettato per i file di configurazione.

È un'alternativa a linguaggi come YAML e JSON, che punta ad essere più leggibile per le persone. Allo stesso tempo, TOML può essere utilizzato in modo abbastanza semplice nella maggior parte dei linguaggi di programmazione, in quanto è progettato per essere tradotto senza ambiguità in una hash table.

Tieni presente che TOML è ancora in fase di sviluppo, e la sua specifica non è ancora stabile. Questo documento utilizza TOML 0.4.0.

# I commenti in TOML sono fatti così.

################
# TIPI SCALARI #
################

# Il nostro oggetto root (corrispondente all'intero documento) sarà una mappa,
# anche chiamata dizionario, hash o oggetto in altri linguaggi.

# La key, il simbolo di uguale e il valore devono trovarsi sulla stessa riga,
# eccetto per alcuni tipi di valori.
key = "value"
stringa = "ciao"
numero = 42
float = 3.14
boolean = true
data = 1979-05-27T07:32:00-08:00
notazScientifica = 1e+12
"puoi utilizzare le virgolette per la key" = true # Puoi usare " oppure '
"la key può contenere" = "lettere, numeri, underscore e trattini"

############
# Stringhe #
############

# Le stringhe possono contenere solo caratteri UTF-8 validi.
# Possiamo effettuare l'escape dei caratteri, e alcuni hanno delle sequenze
# di escape compatte. Ad esempio, \t corrisponde al TAB.
stringaSemplice = "Racchiusa tra virgolette. \"Usa il backslash per l'escape\"."

stringaMultiriga = """
Racchiusa da tre virgolette doppie all'inizio e
alla fine - consente di andare a capo."""

stringaLiteral = 'Virgolette singole. Non consente di effettuare escape.'

stringaMultirigaLiteral = '''
Racchiusa da tre virgolette singole all'inizio e
alla fine - consente di andare a capo.
Anche in questo caso non si può fare escape.
Il primo ritorno a capo viene eliminato.
   Tutti gli altri spazi aggiuntivi
   vengono mantenuti.
'''

# Per i dati binari è consigliabile utilizzare Base64 e
# gestirli manualmente dall'applicazione.

##########
# Interi #
##########

## Gli interi possono avere o meno un segno (+, -).
## Non si possono inserire zero superflui all'inizio.
## Non è possibile inoltre utilizzare valori numerici
## non rappresentabili con una sequenza di cifre.
int1 = +42
int2 = 0
int3 = -21

## Puoi utilizzare gli underscore per migliorare la leggibilità.
## Fai attenzione a non inserirne due di seguito.
int4 = 5_349_221
int5 = 1_2_3_4_5     # VALIDO, ma da evitare

#########
# Float #
#########

# I float permettono di rappresentare numeri decimali.
flt1 = 3.1415
flt2 = -5e6
flt3 = 6.626E-34

###########
# Boolean #
###########

# I valori boolean (true/false) devono essere scritti in minuscolo.
bool1 = true
bool2 = false

############
# Data/ora #
############

data1 = 1979-05-27T07:32:00Z # Specifica RFC 3339/ISO 8601 (UTC)
data2 = 1979-05-26T15:32:00+08:00 # RFC 3339/ISO 8601 con offset

######################
# TIPI DI COLLECTION #
######################

#########
# Array #
#########

array1 = [ 1, 2, 3 ]
array2 = [ "Le", "virgole", "sono", "delimitatori" ]
array3 = [ "Non", "unire", "tipi", "diversi" ]
array4 = [ "tutte", 'le stringhe', """hanno lo stesso""", '''tipo''' ]
array5 = [
  "Gli spazi vuoti", "sono", "ignorati"
]

###########
# Tabelle #
###########

# Le tabelle (o hash table o dizionari) sono collection di coppie key/value.
# Iniziano con un nome tra parentesi quadre su una linea separata. 
# Le tabelle vuote (senza alcun valore) sono valide.
[tabella]

# Tutti i valori che si trovano sotto il nome della tabella
# appartengono alla tabella stessa (finchè non ne viene creata un'altra).
# L'ordine di questi valori non è garantito.
[tabella-1]
key1 = "una stringa"
key2 = 123

[tabella-2]
key1 = "un'altra stringa"
key2 = 456

# Utilizzando i punti è possibile creare delle sottotabelle.
# Ogni parte suddivisa dai punti segue le regole delle key per il nome.
[tabella-3."sotto.tabella"]
key1 = "prova"

# Ecco l'equivalente JSON della tabella precedente:
# { "tabella-3": { "sotto.tabella": { "key1": "prova" } } }

# Gli spazi non vengono considerati, ma è consigliabile
# evitare di usare spazi superflui.
[a.b.c]            # consigliato
[ d.e.f ]          # identico a [d.e.f]

# Non c'è bisogno di creare le tabelle superiori per creare una sottotabella.
# [x] queste
# [x.y] non
# [x.y.z] servono
[x.y.z.w] # per creare questa tabella

# Se non è stata già creata prima, puoi anche creare
# una tabella superiore più avanti.
[a.b]
c = 1

[a]
d = 2

# Non puoi definire una key o una tabella più di una volta.

# ERRORE
[a]
b = 1

[a]
c = 2

# ERRORE
[a]
b = 1

[a.b]
c = 2

# I nomi delle tabelle non possono essere vuoti.
[]     # NON VALIDO
[a.]   # NON VALIDO
[a..b] # NON VALIDO
[.b]   # NON VALIDO
[.]    # NON VALIDO

##################
# Tabelle inline #
##################

tabelleInline = { racchiuseData = "{ e }", rigaSingola = true }
punto = { x = 1, y = 2 }

####################
# Array di tabelle #
####################

# Un array di tabelle può essere creato utilizzando due parentesi quadre.
# Tutte le tabelle con questo nome saranno elementi dell'array.
# Gli elementi vengono inseriti nell'ordine in cui si trovano.

[[prodotti]]
nome = "array di tabelle"
sku = 738594937
tabelleVuoteValide = true

[[prodotti]]

[[prodotti]]
nome = "un altro item"
sku = 284758393
colore = "grigio"

# Puoi anche creare array di tabelle nested. Le sottotabelle con doppie
# parentesi quadre apparterranno alla tabella più vicina sopra di esse.

[[frutta]]
  nome = "mela"

  [frutto.geometria]
    forma = "sferica"
    nota = "Sono una proprietà del frutto"

  [[frutto.colore]]
    nome = "rosso"
    nota = "Sono un oggetto di un array dentro mela"

  [[frutto.colore]]
    nome = "verde"
    nota = "Sono nello stesso array di rosso"

[[frutta]]
  nome = "banana"

  [[frutto.colore]]
    nome = "giallo"
    nota = "Anche io sono un oggetto di un array, ma dentro banana"

Ecco l'equivalente JSON dell'ultima tabella:

{
  "frutta": [
    {
      "nome": "mela",
      "geometria": { "forma": "sferica", "nota": "..."},
      "colore": [
        { "nome": "rosso", "nota": "..." },
        { "nome": "verde", "nota": "..." }
      ]
    },
    {
      "nome": "banana",
      "colore": [
        { "nome": "giallo", "nota": "..." }
      ]
    }
  ]
}

Altre risorse


Hai un suggerimento? Oppure una correzione? Apri un issue sul GitHub, o fa un pull request da solo!

In origine contribuita da Alois de Gouvello, e modificata da 1 contributore(i).