Le format .wS (ou wS, wilhelm43 sheet of properties) est un format de représentation et de transmission d’information structurée, adapté pour la gestion mémoire et la programmation.
Le format wS peut être écrit de différentes manières, sans que le style d’écriture impacte les données contenues dans un fichier wS. L’écriture utilisée dans cet article est la norme proposée par les développeurs du format.
<aside> <img src="/icons/light-bulb_gray.svg" alt="/icons/light-bulb_gray.svg" width="40px" />
Le format, si l’on ne s’intéresse qu’aux possibilités les plus simples, peut être rapproché au format de données JSON. Toutefois, la comparaison est fausse, en effet, wS supporte bien des fonctionnalités que JSON ne permet pas.
</aside>
Par convention, on appelle un fichier wS un ensemble. Le format fonctionne en associant des couples étiquette - valeur ensemble, via une structure à clés (un dictionnaire) et une structure itérative (une liste). L’étiquette est considérée soit comme une chaîne de caractère, soit comme un entier naturel.
Un fichier wS peut être visualisé comme un arbre fini (graphe acyclique et connexe), en d’autres termes, un identifiant peut être associé à un sous ensemble (ou sous arbre) wS.
Le premier ensemble d’un fichier wS est appelé racine, chaque élément d’un ensemble (y compris un ensemble) un noeud.
<aside> <img src="/icons/light-bulb_gray.svg" alt="/icons/light-bulb_gray.svg" width="40px" />
N’importe quelle structure peut être utilisé comme racine d’un fichier wS. Le choix est fait par rapport aux données à représenter.
</aside>
Intéressons nous désormais à la structure théorique d’un ensemble simple
~ struct
\\ clé : valeur ;
~
Sont proposées ci-dessous plusieurs écritures et leurs équivalents en JSON
{ nom : 'Jean', prénom : 'François' }
{ nom : 'Jean' ; prénom : 'François' }
{ nom : 'Jean' | prénom : 'François' }
{"nom" : "Jean", "prénom" : "François"}
<aside> <img src="/icons/info-alternate_gray.svg" alt="/icons/info-alternate_gray.svg" width="40px" />
Les symboles virgule, point-virgule et barre verticale ont le même effet dans un dictionnaire. Toutefois, on verra plus tard que ce choix est normé pour des raisons de lisibilité et de représentation logique.
</aside>
<aside> <img src="/icons/info-alternate_gray.svg" alt="/icons/info-alternate_gray.svg" width="40px" />
Les espaces blancs n’ont pas d’importance en wS, sauf dans un cas particulier.
Pour comprendre ce cas, il faut d’abord savoir que les chaînes de caractères sont facultatives en wS dans la mesure où la valeur ne contient pas de caractère système.
Cela signifie que les espaces situés entre deux blocs sont inclus dans le bloc final :
{ est francophone : ?true }
est égal à
{ "est francophone" : ?true }
la logique est identique pour la valeur.
Les espaces situés avant le premier bloc et après le dernier bloc ne sont pas pris en compte. Si l’écriture d’étiquettes sans chaîne de caractères est possible et recommandée, pour les valeurs, il est au contraire recommandé d’utiliser des chaînes de caractères pour des raisons de lisibilités.
La représentation d’une valeur / étiquette peut être constituée de plusieurs éléments simples (ensembles exclus) :
{ nom complet : 'François' ', ' 'Jean' }
est égal à
{ nom complet : 'François, Jean' }
Les espaces blancs situés après une chaîne de caractère ne sont pas pris en compte.
</aside>
[ 'Jean', 'François' ]
["Jean", "François"]
<aside> <img src="/icons/light-bulb_gray.svg" alt="/icons/light-bulb_gray.svg" width="40px" />
Seulement le symbole virgule peut être utilisé dans une liste pour séparer les différents éléments. Le point-virgule et la barre verticale n’ont pas d’effet dans une liste.
</aside>
{ menu
{ id : 'fichier'
| value : 'Fichier'
| popup
{ menuitem
[ { value : 'Nouveau'
| onclick : 'CreateNewDoc()'
}
{ value : 'Ouvrir'
| onclick : 'OpenDoc()'
}
{ value : 'Fermer'
| onclick : 'CloseDoc()'
}
]
| style : ?null
}
}
}
{
"menu" : {
"id" : "fichier",
"value" : "Fichier",
"popup" : {
"menuitem" : [
{
"value" : "Nouveau",
"onclick" : "CreateNewDoc()"
},
{
"value" : "Ouvrir",
"onclick" : "OpenDoc()"
},
{
"value" : "Fermer",
"onclick" : "CloseDoc()"
}
],
"style" : null
}
}
}