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

简介:

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." 
AI 代码解读

常用的转义序列:

 
\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 
AI 代码解读

布尔值

布尔值永远是小写。

true
false 
AI 代码解读

日期时间

使用 ISO 8601 完整格式。

1979-05-27T07:32:00Z 
AI 代码解读

 数组

数组使用方括号包裹。空格会被忽略。元素使用逗号分隔。注意,不允许混用数据类型。

[ 1, 2, 3 ]
[ "red", "yellow", "green" ]
[ [ 1, 2 ], [3, 4, 5] ]
[ [ 1, 2 ], ["a", "b", "c"] ] # 这是可以的。 
[ 1, 2.0 ] # 注意:这是不行的。 
AI 代码解读

数组可以多行。也就是说,除了空格之外,方括号间的换行也会被忽略。在关闭方括号前的最终项后的逗号是允许的。

表格

表格(也叫哈希表或字典)是键值对的集合。它们在方括号内,自成一行。注意和数组相区分,数组只有值。

[table] 
AI 代码解读

在此之下,直到下一个 table 或 EOF 之前,是这个表格的键值对。键在左,值在右,等号在中间。键以非空字符开始,以等号前的非空字符为结尾。键值对是无序的。

[table] key = "value" 
AI 代码解读

你可以随意缩进,使用 Tab 或空格。为什么要缩进呢?因为你可以嵌套表格。

嵌套表格的表格名称中使用.。你可以任意命名你的表格,只是不要用点,点是保留的。

[dog.tater] type = "pug" 
AI 代码解读

以上等价于如下的 JSON 结构:

{ "dog": { "tater": { "type": "pug" } } } 
AI 代码解读

如果你不想的话,你不用声明所有的父表。TOML 知道该如何处理。

# [x.y.z] 这些
# 可以直接写
AI 代码解读

空表是允许的,其中没有键值对。

只要父表没有被直接定义,而且没有定义一个特定的键,你可以继续写入:

[a.b]
d = 2
AI 代码解读

然而你不能多次定义键和表格。这么做是不合法的。

# 别这么干!

[a]
b = 1

[a]
c = 2 
AI 代码解读
# 也别这个干
[a]
b = 1

[a.b]
c = 2 
AI 代码解读

表格数组

最后要介绍的类型是表格数组。表格数组可以通过包裹在双方括号内的表格名来表达。使用相同的双方括号名称的表格是同一个数组的元素。表格按照书写的顺序插入。双方括号表格如果没有键值对,会被当成空表。

 
[ [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
"apple"


# 和上面冲突了"granny smith"
AI 代码解读

来真的?

是的。

但是为什么?

因为我们需要一个像样的人类可读的格式,同时能无歧义地映射到哈希表。然后 YAML 的规范有 80 页那么长,真是发指!不,不考虑 JSON 。你知道为什么。

天哪,你是对的!

哈哈!想帮忙么?发合并请求过来。或者编写一个解析器。勇敢一点。

实现

如果你有一个实现,请发一个合并请求,把你的实现加入到这个列表中。请在你的解析器的 README 中标记你的解析器支持的 提交SHA1 或 版本号。

校验

@BurntSushi) - https://github.com/BurntSushi/toml/tree/master/tomlv

TOML 测试套件 (语言无关)

编辑器支持

编码器

目录
相关文章
深入对比TOML,JSON和YAML
坦率地说,在我开始与Hugo TOML合作之前,我感到羞耻是一个需要发现的新领域,但我对YAML和JSON非常熟悉。本文将帮助您了解如何通过不同的数据格式构建数据。       在Hugo中,您可以将所有这三种数据格式用于配置,前置事项和自定义数据,但TOML是用于整个项目的推荐格式。
9664 0
TOML: GitHub 这是要革 YAML 的命呀!
GitHub 目前的新项目已经转用 CoffeeScript 了。CoffeeScript 比 JavaScript 要简洁优雅得多。同样地,GitHub 也觉得 YAML 不够简洁优雅,因此捣鼓出了一个 TOML。
519 0
2024最简七步完成 将本地项目提交到github仓库方法
该文章提供了一个简洁的七步教程,指导用户如何将本地项目提交到GitHub仓库。
2024最简七步完成 将本地项目提交到github仓库方法
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
97 3
|
5月前
|
【事故】记一次意外把公司项目放到GitHub并被fork,如何使用DMCA下架政策保障隐私
在一次意外中,作者因三年前将测试代码遗忘在GitHub上而遭遇了代码被他人fork的问题。为解决这一危机,作者详细介绍了如何通过GitHub的DMCA下架通知流程安全删除敏感代码,包括处理私人信息和商标侵权的具体步骤。本文不仅提供了实用的操作指南,还强调了及时响应的重要性,帮助读者避免类似风险
85 1
【事故】记一次意外把公司项目放到GitHub并被fork,如何使用DMCA下架政策保障隐私
Github 2024-05-20 开源项目周报 Top15
根据Github Trendings的统计,2024年5月20日当周共有15个项目上榜。按开发语言分类,项目数量如下:Python项目5个,TypeScript项目3个,C++项目2个,Jupyter Notebook项目2个,C、Go、Rust和C#项目各1个。介绍了多个值得关注的项目,包括ChatGPT桌面应用程序、Fooocus图像生成软件、Jellyfin媒体系统等。这些项目涵盖了多种功能和技术领域,值得关注和研究。
79 3
Github 2024-08-05 开源项目周报 Top15
根据 Github Trendings 的统计,本周(2024年8月5日统计)共有15个项目上榜。以下是根据开发语言汇总的项目数量: - Go 项目:4个 - JavaScript 项目:3个 - Python 项目:3个 - Java 项目:2个 - TypeScript 项目:2个 - C 项目:1个 - Shell 项目:1个 - Dockerfile 项目:1个 - 非开发语言项目:1个
156 2
Github 2024-08-26 开源项目周报Top15
根据Github Trendings的统计,本周共有15个项目上榜。以下是按开发语言汇总的项目数量:Python项目8个,TypeScript、C++ 和 Rust 项目各2个,Jupyter Notebook、Shell、Swift 和 Dart 项目各1个。其中,RustDesk 是一款用 Rust 编写的开源远程桌面软件,可作为 TeamViewer 的替代品;Whisper 是一个通用的语音识别模型,基于大规模音频数据集训练而成;初学者的生成式人工智能(第2版)则是由微软提供的18门课程,教授构建生成式AI应用所需的知识。
157 1
Github 2024-08-19 开源项目周报Top15
根据Github Trendings的统计,本周(2024年8月19日统计)共有15个项目上榜。按开发语言分类,上榜项目数量如下:Python项目最多,有7项;其次是JavaScript和TypeScript,各有3项;Dart有2项;HTML、PowerShell、Clojure和C++各1项。此外,还介绍了多个热门项目,包括Bootstrap 5、RustDesk、ComfyUI、易采集、Penpot等,涵盖了Web开发、远程桌面、自动化测试、设计工具等多个领域。
127 1