thindf-新的文本数据格式(替代JSON)

文件AppData \ Local \ Dropbox \ info.json:
{ "personal": { "host": 5060852864, "is_team": false, "subscription_type": "Basic", "path": "C:\\Users\\DNS\\Dropbox" } } 
在新格式中,它看起来像这样:
 personal host = 5060852864 is_team = 0B subscription_type = Basic path = C:\Users\DNS\Dropbox 
Sublime文本编辑器配置文件:
 { "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" } 
在新格式中,它看起来像这样:
 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 

一点历史


这种格式的出现归因于另一种名称为blockpar的格式。
Blockpar由Alexey Dubovoi (元素游戏的创始人之一)在开发“太空游侠”游戏的过程中开发。 随后, 亚历山大·泽伯格 (Katauri Interactive的前首席程序员[ 离开 公司,从事Katauri互动游戏和Elemental Games之后,他离开了Katauri ] )决定将这种格式用于《国王的赏金:骑士传说》。

每个游戏对象的定义都以blockpar格式存储在扩展名为.atom的单独文件中,例如,以下是文件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 } ... } ... 

随后[ 在进行Royal Quest项目时 ]我对该格式进行了扩展,以便代替:
 button { name=close pos=400,600 size=200,40 image=button_close.png anchors=0,0,100,0 } 
这样写:
 button=close,400,600,200,40 { image=button_close.png anchors=0,0,100,0 } 

我还通过反撇号(backtick-`)添加了对多行字符串值的支持:
 button=... { onmouseover=` ... ` } 
为什么我拒绝“用反撇号括起来的字符串”
在参数值中,可以直接粘贴脚本代码,在代码的注释中,我使用反撇号,其含义与Markdown和pc markup中使用的含义相同。 例如:
 if len(indentation_levels) and indentation_levels[-1][0] == -1: #    `{`    ,       `}` 

最后,由于我熟悉Python,拒绝花括号的想法深深吸引了我,以至于我决定可以进一步简化blockpar格式(通过 放弃所需的花括号

还受以下因素影响:
  • Royal Quest客户端使用的Yet Another Serialization Library中的文本存储格式。
  • nginx配置文件的格式(但是,我拒绝了放弃在参数名称与其值( 为什么 )之间使用分隔符(符号=:的想法)。
  • YAML (即使用的想法. [ YAML中的数组元素名称之前使用- ] )。

为什么选择0V和1V?
  • 经常使用true / false和yes / no (在Objective-C中使用YES / NO) ,on / off或启用/禁用(例如:您可以启用显示行尾;打开/关闭登录;是数字吗? ),在布尔代数中使用0和1,因此在大多数情况下使用关键字true和false是值得商bat的。
  • 我不喜欢俄语版本格式的true / false,并且0B和1B(此处B是俄语大写字母c)可以与0Off和1On关联。 [ 我请你不要提出俄文版本是否适当的问题。 ]
  • 由于文档中指出的原因,在11l编程语言中使用了0B和1B。

字符串用单引号引起来


此格式的另一个[ 除了0B和1B之外 ]有争议/不寻常的元素是对原始字符串[ 不使用转义序列\转义序列 ]使用双引号''
但是我的选择是有道理的,因为Unicode联合会今年批准了开头单引号代码

如何在键盘上输入此类引号-参见此处

如果行中有不成对的引号,则需要以与PC标记中相同的方式执行“行平衡”以插入HTML代码。
例如,有一行don't
由于它包含不平衡的结束报价,因此请在行的开头添加一个平衡的开始报价: ' don't
我们将平衡字符串括在双引号中: ' 'don't '
现在,您需要以某种方式向解析器显示,字符串中不应包含在左侧添加的引号,因为只需要使用该引号即可恢复balance 。 为此,请使用打字的撇号“”,每个平衡引号必须将其放置一个[ 因此,一个打字的撇号“吃”一对引号 ] ,在这种情况下,必须将其放置在行的开头: '''don't'
您可以像其他行一样用双引号插入平衡行:
'text = '''don't''

使用方法


目前,有一个PythonJavaScript实现 (您可以尝试在项目网页的浏览器中直接将JSON转换为新格式)。

对于Python-照常安装:
 pip install thindf 

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

并使用:
  • thindf.to_thindf(object, indent = 4)以获取与传递的对象( json.dumpsJSON.stringify类似物)相对应的Thindf格式的字符串。
  • thindf.parse(str)从Thindf格式的字符串中获取对象(类似于json.loadsJSON.parse )。

最后,我将给出更多示例:
我的Default(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": "'"} }, ] 
使用新格式,我会这样写:
 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 

d.json文件的一部分 来自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-" } ] } ] } 
在新格式中,它看起来像这样:
 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- ] ] 

一些极端情况:
 { "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/zh-CN419361/


All Articles