GitHub 目前的新项目已经转用 CoffeeScript 了。CoffeeScript 比 JavaScript 要简洁优雅得多。一样地,GitHub 也以为 YAML 不够简洁优雅,所以捣鼓出了一个 TOML。php
TOML 的全称是 Tom's Obvious, Minimal Language,由于它的做者是 GitHub 联合创始人 Tom Preston-Werner 。node
TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成能够无歧义地被映射为哈希表,从而被多种语言解析。python
title = "TOML 例子" [owner] name = "Tom Preston-Werner" organization = "GitHub" bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." dob = 1979-05-27T07:32:00Z # 日期时间是一等公民。为何不呢? [database] server = "192.168.1.1" ports = [ 8001, 8001, 8002 ] connection_max = 5000 enabled = true [servers] # 你能够依照你的意愿缩进。使用空格或Tab。TOML不会在乎。 [servers.alpha] ip = "10.0.0.1" dc = "eqdc10" [servers.beta] ip = "10.0.0.2" dc = "eqdc10" [clients] data = [ ["gamma", "delta"], [1, 2] ] # 在数组里换行没有关系。 hosts = [ "alpha", "omega" ]
TOML 是大小写敏感的。git
使用 #
表示注释:github
# I am a comment. Hear me roar. Roar. key = "value" # Yeah, you can do this.
字符串和 JSON 的定义一致,只有一点除外: TOML 要求使用 UTF-8 编码。npm
注释以引号包裹,里面的字符必须是 UTF-8 格式。引号、反斜杠和控制字符(U+0000 到 U+001F)须要转义。json
"I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."
经常使用的转义序列:vim
\b - backspace (U+0008) \t - tab (U+0009) \n - linefeed (U+000A) \f - form feed (U+000C) \r - carriage return (U+000D) \" - quote (U+0022) \/ - slash (U+002F) \\ - backslash (U+005C) \uXXXX - unicode (U+XXXX)
使用保留的特殊字符,TOML 会抛出错误。例如,在 Windows 平台上,应该使用两个反斜杠来表示路径:segmentfault
wrong = "C:\Users\nodejs\templates" # 注意:这不会生成合法的路径。 right = "C:\\Users\\nodejs\\templates"
二进制数据建议使用 Base64 或其余合适的编码。具体的处理取决于特定的应用。数组
整数就是一些没有小数点的数字。想用负数?按直觉来就行。整数的尺寸最小为64位。
浮点数带小数点。小数点两边都有数字。64位精度。
3.1415 -0.01
布尔值永远是小写。
true false
使用 ISO 8601 完整格式。
1979-05-27T07:32:00Z
数组使用方括号包裹。空格会被忽略。元素使用逗号分隔。注意,不容许混用数据类型。
[ 1, 2, 3 ] [ "red", "yellow", "green" ] [ [ 1, 2 ], [3, 4, 5] ] [ [ 1, 2 ], ["a", "b", "c"] ] # 这是能够的。 [ 1, 2.0 ] # 注意:这是不行的。
数组能够多行。也就是说,除了空格以外,方括号间的换行也会被忽略。在关闭方括号前的最终项后的逗号是容许的。
表格(也叫哈希表或字典)是键值对的集合。它们在方括号内,自成一行。注意和数组相区分,数组只有值。
[table]
在此之下,直到下一个 table 或 EOF 以前,是这个表格的键值对。键在左,值在右,等号在中间。键以非空字符开始,以等号前的非空字符为结尾。键值对是无序的。
[table] key = "value"
你能够随意缩进,使用 Tab 或空格。为何要缩进呢?由于你能够嵌套表格。
嵌套表格的表格名称中使用.
。你能够任意命名你的表格,只是不要用点,点是保留的。
[dog.tater] type = "pug"
以上等价于以下的 JSON 结构:
{ "dog": { "tater": { "type": "pug" } } }
若是你不想的话,你不用声明全部的父表。TOML 知道该如何处理。
# [x] 你 # [x.y] 不须要 # [x.y.z] 这些 [x.y.z.w] # 能够直接写
空表是容许的,其中没有键值对。
只要父表没有被直接定义,并且没有定义一个特定的键,你能够继续写入:
[a.b] c = 1 [a] d = 2
然而你不能屡次定义键和表格。这么作是不合法的。
# 别这么干! [a] b = 1 [a] c = 2
# 也别这个干 [a] b = 1 [a.b] c = 2
最后要介绍的类型是表格数组。表格数组能够经过包裹在双方括号内的表格名来表达。使用相同的双方括号名称的表格是同一个数组的元素。表格按照书写的顺序插入。双方括号表格若是没有键值对,会被当成空表。
[[products]] name = "Hammer" sku = 738594937 [[products]] [[products]] name = "Nail" sku = 284758393 color = "gray"
等价于如下的 JSON 结构:
{ "products": [ { "name": "Hammer", "sku": 738594937 }, { }, { "name": "Nail", "sku": 284758393, "color": "gray" } ] }
表格数组一样能够嵌套。只需在子表格上使用相同的双方括号语法。每个双方括号子表格回从属于最近定义的上层表格元素。
[[fruit]] name = "apple" [fruit.physical] color = "red" shape = "round" [[fruit.variety]] name = "red delicious" [[fruit.variety]] name = "granny smith" [[fruit]] name = "banana" [[fruit.variety]] name = "plantain"
等价于以下的 JSON 结构:
{ "fruit": [ { "name": "apple", "physical": { "color": "red", "shape": "round" }, "variety": [ { "name": "red delicious" }, { "name": "granny smith" } ] }, { "name": "banana", "variety": [ { "name": "plantain" } ] } ] }
尝试定义一个普通的表格,使用已经定义的数组的名称,将抛出一个解析错误:
# 不合法的 TOML [[fruit]] name = "apple" [[fruit.variety]] name = "red delicious" # 和上面冲突了 [fruit.variety] name = "granny smith"
是的。
由于咱们须要一个像样的人类可读的格式,同时能无歧义地映射到哈希表。而后 YAML 的规范有 80 页那么长,真是发指!不,不考虑 JSON 。你知道为何。
哈哈!想帮忙么?发合并请求过来。或者编写一个解析器。勇敢一点。
若是你有一个实现,请发一个合并请求,把你的实现加入到这个列表中。请在你的解析器的 README 中标记你的解析器支持的 提交SHA1 或 版本号。
@BurntSushi) - https://github.com/BurntSushi/toml/tree/master/tomlv
原文 TOML README
翻译 SegmentFault