Fichier AppData \ Local \ Dropbox \ info.json:
{ "personal": { "host": 5060852864, "is_team": false, "subscription_type": "Basic", "path": "C:\\Users\\DNS\\Dropbox" } }
| Dans le nouveau format, cela ressemble à ceci:
personal host = 5060852864 is_team = 0B subscription_type = Basic path = C:\Users\DNS\Dropbox |
Fichier de configuration de l'éditeur de texte sublime:
{ "added_words": [ "plugin", "habrahabr", "" ], "default_line_ending": "unix", | Dans le nouveau format, cela ressemble à ceci:
added_words = [ plugin habrahabr ] default_line_ending = unix //font_face = Fira Code font_size = 11 ignored_packages = [ Sublimerge Pro Vintage ] ignored_words = [ utf ] line_numbers = 0B show_encoding = 1B show_line_endings = 1B tab_size = 4 theme = Default.sublime-theme |
Un peu d'histoire
Ce format doit son apparence à un autre format avec l'étrange nom blockpar.
Blockpar a été développé par
Alexey Dubovoi (l'un des fondateurs d'Elemental Games) en train de travailler sur le jeu Space Rangers. Par la suite,
Alexander Zeberg (ancien programmeur principal de Katauri Interactive
[ après avoir quitté la société pour Katauri Interactive et Elemental Games, il est parti pour Katauri ] ) a décidé d'utiliser ce format pour le jeu King's Bounty: Legend of the Knight.
La définition de chaque objet de jeu a été stockée au format blockpar dans un fichier séparé avec l'extension .atom, par exemple, voici un extrait du fichier
data / data.kfs / spider.atom :
main { class=chesspiece model=spider.bma cullcat=0 } arena_params { race=neutral cost=24 level=1 leadership=14 attack=4 defense=4 ... resistances { physical=20 poison=0 magic=0 fire=-10 } ... } ...
Par la suite
[ en travaillant sur le projet Royal Quest ], j'ai un peu élargi ce format pour qu'au lieu de:
button { name=close pos=400,600 size=200,40 image=button_close.png anchors=0,0,100,0 }
écrivez comme ceci:
button=close,400,600,200,40 { image=button_close.png anchors=0,0,100,0 }
J'ai également ajouté la prise en charge des valeurs de chaîne multi-lignes via l'apostrophe arrière (backtick - `):
button=... { onmouseover=` ... ` }
Pourquoi ai-je refusé "les chaînes enfermées dans des apostrophes inverses"Dans la valeur du paramètre, il est permis de coller directement le code du script, et dans les commentaires du code, j'utilise des apostrophes inverses dans le même sens que ceux utilisés dans Markdown et le
balisage pc . Par exemple:
if len(indentation_levels) and indentation_levels[-1][0] == -1:
Et enfin, à la suite de ma connaissance de Python, l'idée de rejeter les accolades m'a tellement captivé que j'ai décidé que le format blockpar pourrait être encore simplifié
[en abandonnant les accolades obligatoires ] .
Également influencé par:
- Le format de stockage de texte dans la Yet Another Serialization Library utilisé par le client Royal Quest.
- Le format du fichier de configuration nginx (cependant, j'ai rejeté l'idée d'abandonner le délimiteur (symbole
=
ou :
entre le nom du paramètre et sa valeur ( pourquoi )). - YAML (à savoir, l'idée à utiliser
.
Avant le nom de l'élément de tableau [ dans YAML utilise -
] ).
Pourquoi 0V et 1V?- Souvent vrai / faux est utilisé avec oui / non (OUI / NON est utilisé dans Objective-C) , on / off ou activer / désactiver (par exemple: vous pouvez activer les fins de ligne d'affichage; activer / désactiver la journalisation; est le chiffre? Oui ), et en algèbre booléenne, 0 et 1 sont utilisés, donc l'utilisation des mots-clés true et false dans la plupart des cas est assez discutable.
- Je n'aime pas vrai / faux dans la version russe du format, et 0B et 1B (ici B est la lettre majuscule russe c) peuvent être associés à 0Off et 1On. [ Je vous demande de ne pas soulever la question de la pertinence de la version russe. ]
- 0B et 1B sont utilisés dans le langage de programmation 11l pour les raisons indiquées dans la documentation .
Chaînes entre guillemets simples
Un autre
[ en plus de 0B et 1B ] élément controversé / inhabituel de ce format est l'utilisation de guillemets doubles
''
pour les chaînes brutes
[ sans séquences d'échappement \ séquences d'échappement ] .
Mais mon choix est justifié par le fait que le consortium Unicode a approuvé cette année comme code pour le guillemet simple d'ouverture .Comment taper de telles citations sur le clavier - voir
ici .
S'il y a des guillemets non appariés dans la ligne, vous devez effectuer un "équilibrage de ligne" de la même manière que dans le balisage PC pour insérer du code HTML.
Par exemple, il n'y a pas de ligne.
Puisqu'il contient une citation de clôture non équilibrée, ajoutez une citation d'ouverture d'équilibrage au tout début de la ligne:
'
don't
'
don't
.
Nous mettons la chaîne équilibrée entre guillemets doubles:
'don't
'
.
Maintenant, vous devez d'une manière ou d'une autre montrer à l'analyseur que la citation ajoutée à gauche ne doit pas être incluse dans la chaîne, car elle n'est nécessaire que pour rétablir l'
équilibre . Pour ce faire, utilisez le symbole d'apostrophe dactylographié ', qui doit être mis une pièce pour chaque guillemet d'équilibrage
[ donc, une apostrophe dactylographiée "mange" une paire de guillemets ] , dans ce cas, elle doit être placée au début de la ligne:
'''don't'
.
Vous pouvez insérer une ligne équilibrée telle quelle dans les autres lignes entre guillemets:
'text = '''don't''
.
Utiliser
Pour le moment, il existe une implémentation
en Python et
en JavaScript (vous pouvez essayer de convertir JSON en un nouveau format directement dans le navigateur sur
la page web du projet ).
Pour Python - installez comme d'habitude:
pip install thindf
Pour JavaScript:
npm install thindf node const thindf = require('thindf');
Et utilisez:
thindf.to_thindf(object, indent = 4)
pour obtenir une chaîne au format thindf correspondant à l'objet passé (analogue de json.dumps
et JSON.stringify
).thindf.parse(str)
pour obtenir un objet à partir d'une chaîne au format thindf (analogue à json.loads
et JSON.parse
).
En conclusion, je vais donner quelques exemples supplémentaires:Quelques lignes de
ma carte par défaut (Windows) .sublime-keymap :
[ { "keys": ["f4"], "command": "f4" }, { "keys": ["shift+f4"], "command": "f4", "args": {"shift_key_pressed": true} }, { "keys": ["alt+shift+`"], "command": "insert", "args": {"characters": "`"} }, // ( { "keys": [":", ")"], "command": "insert_snippet", "args": {"contents": ":)(:"} }, { "keys": ["alt+9"], "context": [{"key": "selector", "operator": "equal", "operand": "text.pq"}], "command": "insert_pq" }, // ' (for balance) { "keys": ["alt+0"], "context": [{"key": "selector", "operator": "equal", "operand": "text.pq"}], "command": "insert", "args": {"characters": "'"} }, ]
En utilisant le nouveau format, j'écrirais ceci:
f4 = on_f4() shift+f4 = on_f4(shift_key_pressed' 1B) alt+shift+` = insert(characters' '`') // ( :,) = insert_snippet(contents' ':)(:') alt+9 = if selector == 'text.pq' {insert_pq()} else 0B // ' (for balance) alt+0 = if selector == 'text.pq' {insert(characters' "'")} else 0B
Un morceau du fichier
d.json [ du référentiel du gestionnaire de plugins pour Sublime Text ] :
{ "schema_version": "3.0.0", "packages": [ { "name": "Django Lookup Snippets", "details": "https://github.com/icycandle/sublime-django-lookup", "releases": [ { "sublime_text": "*", "tags": true } ] }, { "name": "Django Manage Commands", "details": "https://github.com/vladimirnani/DjangoCommands", "labels": ["Django", "python", "web", "management"], "releases": [ { "sublime_text": "<3000", "tags": "st2-" }, { "sublime_text": ">=3000", "tags": "st3-" } ] } ] }
Dans le nouveau format, cela ressemble à ceci:
schema_version = '3.0.0' packages = [ . name = Django Lookup Snippets details = https://github.com/icycandle/sublime-django-lookup releases = [ . sublime_text = * tags = 1B ] . name = Django Manage Commands details = https://github.com/vladimirnani/DjangoCommands labels = [ Django python web management ] releases = [ . sublime_text = <3000 tags = st2- . sublime_text = >=3000 tags = st3- ] ]
Quelques cas d'angle: |
{ "a": "'...'", "b": "string which ends with a space ", "cd": "\n", "e ": "3", "dirs": [ ["Doc,Scans", ".t'xt"] ], "node": null, "n" : "N", "files": [], "f": "[]", "ff": [ [] ], "products": {} } | a = ''...'' b = 'string which ends with a space ' cd = "\n" 'e ' = '3' dirs = [ ['Doc,Scans', '''.t'xt'] ] node = N n = 'N' files = [] f = '[]' ff = [ [] ] products = {} |