thindf - format data teks baru (alternatif untuk JSON)

File AppData \ Local \ Dropbox \ info.json:
{ "personal": { "host": 5060852864, "is_team": false, "subscription_type": "Basic", "path": "C:\\Users\\DNS\\Dropbox" } } 
Dalam format baru, tampilannya seperti ini:
 personal host = 5060852864 is_team = 0B subscription_type = Basic path = C:\Users\DNS\Dropbox 
File Konfigurasi Editor Teks Luhur:
 { "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": false, "show_encoding": true, "show_line_endings": true, "tab_size": 4, "theme": "Default.sublime-theme" } 
Dalam format baru, tampilannya seperti ini:
 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 

Sedikit sejarah


Format ini berutang penampilannya ke format lain dengan nama blockpar yang aneh.
Blockpar dikembangkan oleh Alexey Dubovoi (salah satu pendiri Elemental Games) dalam proses mengerjakan game Space Rangers. Selanjutnya, Alexander Zeberg (mantan programmer utama Katauri Interactive [ setelah meninggalkan perusahaan untuk Katauri Interactive dan Elemental Games, ia berangkat ke Katauri ] ) memutuskan untuk menggunakan format ini untuk permainan King's Bounty: Legend of the Knight.

Definisi setiap objek game disimpan dalam format blockpar dalam file terpisah dengan ekstensi .atom, misalnya, berikut ini kliping dari file 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 } ... } ... 

Selanjutnya [ saat bekerja pada proyek Royal Quest ] saya sedikit memperluas format ini sehingga bukannya:
 button { name=close pos=400,600 size=200,40 image=button_close.png anchors=0,0,100,0 } 
tulis seperti ini:
 button=close,400,600,200,40 { image=button_close.png anchors=0,0,100,0 } 

Saya juga menambahkan dukungan untuk nilai string multi-line melalui apostrof belakang (backtick - `):
 button=... { onmouseover=` ... ` } 
Mengapa saya menolak `string terlampir di tanda kutip terbalik`
Dalam nilai parameter, diizinkan untuk secara langsung menempelkan kode skrip, dan dalam komentar dalam kode saya menggunakan tanda kutip terbalik dalam arti yang sama seperti yang digunakan dalam Markdown dan markup pc . Sebagai contoh:
 if len(indentation_levels) and indentation_levels[-1][0] == -1: #    `{`    ,       `}` 

Dan akhirnya, sebagai hasil dari kenalan saya dengan Python, gagasan menolak kurung keriting sangat memikat saya sehingga saya memutuskan bahwa format blockpar dapat lebih disederhanakan [dengan meninggalkan kawat gigi keriting yang diperlukan ] .

Juga dipengaruhi oleh:
  • Format penyimpanan teks di Pustaka Serialisasi Lain yang digunakan oleh klien Royal Quest.
  • Format file konfigurasi nginx (namun, saya menolak ide untuk meninggalkan pembatas (simbol = atau : antara nama parameter dan nilainya ( mengapa )).
  • YAML (yaitu, ide untuk digunakan . Sebelum nama elemen array [ di YAML menggunakan - ] ).

Mengapa 0V dan 1V?
  • Seringkali benar / salah digunakan dengan ya / tidak (YA / TIDAK digunakan dalam Objective-C) , on / off atau aktifkan / nonaktifkan (misalnya: Anda dapat mengaktifkan akhir baris tayangan; menghidupkan / mematikan logging; adalah digit? Ya ), dan dalam aljabar Boolean, 0 dan 1 digunakan, jadi menggunakan kata kunci benar dan salah dalam banyak kasus cukup bisa diperdebatkan.
  • Saya tidak suka benar / salah dalam format versi Rusia, dan 0B dan 1B (di sini B adalah huruf kapital Rusia c) dapat dikaitkan dengan 0Off dan 1On. [ Saya meminta Anda untuk tidak mengajukan pertanyaan tentang kesesuaian versi Rusia. ]
  • 0B dan 1B digunakan dalam bahasa pemrograman 11L untuk alasan yang ditunjukkan dalam dokumentasi .

String dalam tanda kutip tunggal


Elemen [ selain 0B dan 1B ] lain yang kontroversial / tidak biasa dari format ini adalah penggunaan tanda kutip ganda '' untuk string mentah [ tanpa urutan sekuens \ sekuens lolos ] .
Tapi pilihan saya dibenarkan oleh fakta bahwa Konsorsium Unicode disetujui tahun ini sebagai kode untuk kutipan ganda tunggal .

Cara mengetikkan kutipan seperti itu di keyboard - lihat di sini .

Jika ada tanda kutip tidak berpasangan di baris, maka Anda perlu melakukan "keseimbangan garis" dengan cara yang sama seperti pada markup PC untuk memasukkan kode HTML.
Misalnya, ada garis don't .
Karena ini berisi kutipan penutupan yang tidak seimbang, tambahkan kutipan pembuka yang menyeimbangkan ke bagian paling awal dari baris: ' don't .
Kami melampirkan string seimbang dalam tanda kutip ganda: ' 'don't ' .
Sekarang Anda perlu menunjukkan parser bahwa kutipan yang ditambahkan di sebelah kiri tidak boleh dimasukkan dalam string, karena itu hanya diperlukan untuk mengembalikan keseimbangan . Untuk melakukan ini, gunakan simbol tanda kutip yang diketik ', yang harus diletakkan satu bagian untuk setiap tanda kutip penyeimbang [ dengan demikian, satu tanda kutip yang diketik “makan” satu tanda kutip sepasang ] , dalam hal ini harus diletakkan di awal baris: '''don't' .
Anda dapat memasukkan garis seimbang seperti di baris lain dalam tanda kutip ganda:
'text = '''don't'' .

Gunakan


Saat ini, ada implementasi dalam Python dan JavaScript (Anda dapat mencoba mengubah JSON ke format baru langsung di browser pada halaman web proyek ).

Untuk Python - instal seperti biasa:
 pip install thindf 

Untuk JavaScript:
 npm install thindf node const thindf = require('thindf'); 

Dan gunakan:
  • thindf.to_thindf(object, indent = 4) untuk mendapatkan string dalam format thindf yang sesuai dengan objek yang dikirimkan (analog dari json.dumps dan JSON.stringify ).
  • thindf.parse(str) untuk mendapatkan objek dari string dalam format thindf (analog dengan json.loads dan JSON.parse ).

Sebagai kesimpulan, saya akan memberikan beberapa contoh lagi:
Beberapa baris dari Default (Windows) .sublime-keymap saya :
 [ { "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": "'"} }, ] 
Dengan menggunakan format baru, saya akan menulis ini:
 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 

Sepotong dari file d.json [ dari repositori pengelola plugin untuk Teks Sublime ] :
 { "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-" } ] } ] } 
Dalam format baru, tampilannya seperti ini:
 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- ] ] 

Beberapa kasus sudut:
 { "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 = {} 

Source: https://habr.com/ru/post/id419361/


All Articles