TOML: GitHub 这是要革 YAML 的命呀!

简介: GitHub 目前的新项目已经转用 CoffeeScript 了。CoffeeScript 比 JavaScript 要简洁优雅得多。同样地,GitHub 也觉得 YAML 不够简洁优雅,因此捣鼓出了一个 TOML。

GitHub 目前的新项目已经转用 CoffeeScript 了。CoffeeScript 比 JavaScript 要简洁优雅得多。同样地,GitHub 也觉得 YAML 不够简洁优雅,因此捣鼓出了一个 TOML

TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner 。


TOML 的目标

TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。


例子

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 是大小写敏感的。


注释

使用 # 表示注释:

# I am a comment. Hear me roar. Roar.

key = "value"# Yeah, you can do this.


字符串

字符串和 JSON 的定义一致,只有一点除外: TOML 要求使用 UTF-8 编码。

注释以引号包裹,里面的字符必须是 UTF-8 格式。引号、反斜杠和控制字符(U+0000 到 U+001F)需要转义。

"I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."

常用的转义序列:

\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 平台上,应该使用两个反斜杠来表示路径:

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 测试套件 (语言无关)


编辑器支持


编码器

相关文章
|
XML JSON 前端开发
深入对比TOML,JSON和YAML
坦率地说,在我开始与Hugo TOML合作之前,我感到羞耻是一个需要发现的新领域,但我对YAML和JSON非常熟悉。本文将帮助您了解如何通过不同的数据格式构建数据。       在Hugo中,您可以将所有这三种数据格式用于配置,前置事项和自定义数据,但TOML是用于整个项目的推荐格式。
10611 179
|
5月前
|
JSON Kubernetes 安全
找到啦,我们已上车,Github 27000+ star,研发团队必备开源工具项目,真丝滑!!!
Trivy 是一款高效灵活的开源安全扫描工具,支持容器镜像、文件系统、Kubernetes 等多目标扫描,具备快速、易用、集成性强等特点,适用于 DevSecOps 全流程安全检测。
245 0
|
4月前
|
人工智能 JavaScript 前端开发
Github 2024-10-28 开源项目周报 Top15
本周GitHub热门项目涵盖Svelte、Open Interpreter、PowerShell等,涉及Web开发、AI助手、自动化工具等领域,Python、JavaScript为主流语言,展现开源技术活跃生态。(239字)
541 19
|
4月前
|
人工智能 JavaScript 前端开发
Github 2024-11-04 开源项目周报 Top14
本周GitHub热门项目涵盖屏幕截图转代码、网页监控、低代码开发等。Python与TypeScript主导,亮点项目包括AI生成代码工具、开源社交应用Bluesky及机器人框架LeRobot,展现AI与自动化技术的快速发展趋势。
296 15
|
4月前
|
人工智能 JavaScript Docker
Github 2024-11-11 开源项目周报 Top15
本周GitHub热门项目涵盖多领域:Python与TypeScript领跑,包括屏幕截图转代码、本地文件共享、PDF处理、AI开发代理等。亮点项目如screenshot-to-code、LocalSend、OpenHands及Diagrams,兼具创新与实用性,广受开发者关注。
385 13
|
4月前
|
人工智能 算法 JavaScript
Github 2024-10-14 开源项目周报 Top14
本周GitHub热门项目共14个,Python项目占7席。涵盖算法实现、生成式AI、金融分析、目标检测等领域,包括TheAlgorithms系列、OpenBB金融平台、Ultralytics YOLO11、Manim动画框架等,展现开源技术多元发展态势。
202 8
|
4月前
|
人工智能 Rust JavaScript
Github 2024-10-07 开源项目周报 Top15
本周GitHub热门项目共15个,Python项目占比最高达7个。榜首为Python算法实现集合TheAlgorithms/Python,Star数超17万;其他亮点包括Godot游戏引擎、OpenBB金融平台、ToolJet低代码框架及新兴AI相关项目如Crawl4AI、Llama Stack等,涵盖游戏、金融、AI、理财等多个领域。
227 4
|
4月前
|
人工智能 Rust 算法
Github 2024-09-30 开源项目周报 Top15
本周GitHub热门项目揭晓:Python主导,AutoGPT居首,涵盖AI、编程、数学动画等领域,助力开发者探索前沿技术。
179 4
|
4月前
|
人工智能 JavaScript 前端开发
Github 2024-09-16 开源项目周报 Top14
本周GitHub热门项目涵盖Python、TypeScript、Go等语言,React居首。亮点包括微软PowerToys、Node版本管理器、AI证件照工具HivisionIDPhotos及端侧大模型MiniCPM等。
184 2