Arquivo AppData \ Local \ Dropbox \ info.json:
{ "personal": { "host": 5060852864, "is_team": false, "subscription_type": "Basic", "path": "C:\\Users\\DNS\\Dropbox" } }
| No novo formato, fica assim:
personal host = 5060852864 is_team = 0B subscription_type = Basic path = C:\Users\DNS\Dropbox |
Arquivo de configuração do Sublime Text Editor:
{ "added_words": [ "plugin", "habrahabr", "" ], "default_line_ending": "unix", | No novo formato, fica assim:
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 |
Um pouco de história
Esse formato deve sua aparência a outro formato com o nome estranho blockpar.
Blockpar foi desenvolvido por
Alexey Dubovoi (um dos fundadores da Elemental Games) no processo de trabalhar no jogo Space Rangers. Posteriormente,
Alexander Zeberg (ex-programador principal da Katauri Interactive
[ depois de deixar a empresa para a Katauri Interactive e Elemental Games, ele partiu para a Katauri ] ) decidiu usar esse formato para o jogo King's Bounty: Legend of the Knight.
A definição de cada objeto do jogo foi armazenada no formato blockpar em um arquivo separado com a extensão .atom, por exemplo, aqui está um recorte do arquivo
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 } ... } ...
Posteriormente
[ enquanto trabalhava no projeto Royal Quest ] , expandi esse formato um pouco para que, em vez de:
button { name=close pos=400,600 size=200,40 image=button_close.png anchors=0,0,100,0 }
escreva assim:
button=close,400,600,200,40 { image=button_close.png anchors=0,0,100,0 }
Também adicionei suporte para valores de cadeia de linhas múltiplas através do apóstrofo posterior (backtick - `):
button=... { onmouseover=` ... ` }
Por que recusei `cordas entre apóstrofos reversos`No valor do parâmetro, é permitido colar diretamente o código do script e nos comentários no código eu uso apóstrofos inversos no mesmo significado que eles são usados no Markdown e na
marcação pc . Por exemplo:
if len(indentation_levels) and indentation_levels[-1][0] == -1:
E, finalmente, como resultado do meu conhecimento do Python, a idéia de rejeitar colchetes me cativou tanto que eu decidi que o formato blockpar poderia ser mais simplificado
[ abandonando os colchetes
necessários ] .
Também influenciado por:
- O formato de armazenamento de texto na Yet Another Serialization Library usado pelo cliente Royal Quest.
- O formato do arquivo de configuração nginx (no entanto, rejeitei a ideia de abandonar o delimitador (símbolo
=
ou :
entre o nome do parâmetro e seu valor ( por que )). - YAML (ou seja, a ideia a ser usada
.
Antes do nome do elemento da matriz [ no YAML usa -
] ).
Por que 0V e 1V?- Frequentemente, true / false é usado com yes / no (YES / NO é usado no Objective-C) , liga / desliga ou ativa / desativa (por exemplo: você pode ativar as terminações da linha de exibição; ativar / desativar o log; é um dígito? Sim ), e na álgebra booleana, 0 e 1 são usados; portanto, o uso das palavras-chave true e false na maioria dos casos é bastante discutível.
- Não gosto de true / false na versão russa do formato, e 0B e 1B (aqui B é a letra maiúscula russa c) podem ser associados a 0Off e 1On. [ Peço que você não levante a questão da adequação da versão russa. ]
- 0B e 1B são usados na linguagem de programação 11l pelos motivos indicados na documentação .
Seqüências de caracteres entre aspas simples
Outro
[ além de 0B e 1B ] elemento controverso / incomum desse formato é o uso de aspas duplas
''
para strings brutas
[ sem seqüências de escape \ seqüências de escape ] .
Mas minha escolha se justifica pelo fato de o Consórcio Unicode aprovar este ano como o código para a abertura de aspas duplas .Como digitar essas citações no teclado - veja
aqui .
Se houver aspas não emparelhadas na linha, será necessário executar o "balanceamento de linha" da mesma maneira que na marcação do PC para inserir o código HTML.
Por exemplo, há uma linha
don't
.
Como ele contém uma cotação de fechamento desequilibrada, adicione uma cotação de abertura de equilíbrio no início da linha:
'
don't
.
Colocamos a string balanceada entre aspas duplas:
'
'don't
'
.
Agora, você precisa mostrar de alguma forma ao analisador que a cotação adicionada à esquerda não deve ser incluída na sequência, pois é necessária apenas para restaurar o
equilíbrio . Para fazer isso, use o símbolo do apóstrofo datilografado ', que deve ser colocado uma peça para cada aspas de equilíbrio
[ assim, um apóstrofe datilografado “come” um par de aspas ) ; nesse caso, ele deve ser colocado no início da linha:
'''don't'
.
Você pode inserir uma linha balanceada como em outras linhas entre aspas duplas:
'text = '''don't''
.
Use
No momento, há uma implementação
em Python e
JavaScript (você pode tentar converter JSON para um novo formato diretamente no navegador na
página da web do projeto ).
Para Python - instale como de costume:
pip install thindf
Para JavaScript:
npm install thindf node const thindf = require('thindf');
E use:
thindf.to_thindf(object, indent = 4)
para obter uma string no formato thindf correspondente ao objeto passado (análogo de json.dumps
e JSON.stringify
).thindf.parse(str)
para obter um objeto de uma sequência no formato thindf (análogo ao json.loads
e JSON.parse
).
Concluindo, darei mais alguns exemplos:Algumas linhas do
meu mapa de teclas padrão (Windows) .sublime :
[ { "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": "'"} }, ]
Usando o novo formato, eu escreveria o seguinte:
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
Uma parte do arquivo
d.json [ do repositório do gerenciador de plugins do 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-" } ] } ] }
No novo formato, fica assim:
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- ] ]
Alguns casos de canto: |
{ "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 = {} |