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." 

常用的转义序列:


\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.y.z] 这些
# 可以直接写

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

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

[a.b]
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
"apple"

# 和上面冲突了"granny smith"

来真的?

是的。

但是为什么?

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

天哪,你是对的!

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

实现

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

校验

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

TOML 测试套件 (语言无关)

编辑器支持

编码器

时间: 2024-12-10 01:07:17

TOML: GitHub 这是要革 YAML 的命呀!的相关文章

IT厂商要革自己的命?互联网闹的!

"IT厂商要革自己的命"不是记者的标题党,而是在采访国内IT厂商北京恩信创业科技有限公司CEO刘有涛时,他说出的一句话,在这句话后面还有一句话:"现在所有的改变都是互联网闹的." 恩信科技是一家创立于2000年的公司,其之前最受业界关注的一个举动是开源ERP,关于这件事情刘有涛现在谈起来还有点失落:"有些事情靠我们一家是无法成事的,但是恩信做了自己该做的."如今的恩信科技最核心的业务是云ERP,这应该与其当初开源ERP的思想是一致的.  尽管踏上

传统互联网行业 革自己的命才有命

中介交易 SEO诊断 淘宝客 云主机 技术大厅 蔡文胜说:未来属于那些传统产业里懂互联网的人,而不是那些懂互联网但不懂传统产业的人. 中国互联网发展了十几年,已基本形成了格局,百度.阿里巴巴.腾讯三强鼎立的局面暂时无法被打破,而各个细分领域,都有占山为王的诸侯,不是一个新来者可以撼动的.互联网及移动互联网的车轮一直向前走,未来,传统行业会将会被颠覆,但颠覆传统行业的不是懂互联网的人,而是那些在传统行业有丰富经验,同时又懂互联网的人颠覆了自己所在的传统行业.是自己革自己的命,这个过程中,必然有一批

解密阿里技术发展路径:去“IOE”实现蜕变 自己革自己的命

2008年的一天,阿里巴巴集团(下称"阿里")开了一次内部会议.在这次当时看来很平常的会议上,明确了两个议题:一,阿里是一家数据公司:二,阿里要把"计算"变成一种像水和电一样的公共品.当时在中国还没有人谈"大数据"的概念:更没有人想到云计算会和一家互联网公司未来发展如此紧密. 1999年阿里成立之初,创始人"十八罗汉"中就不乏技术基因.公开资料显示,创始人之一吴泳铭1996年毕业于浙江工业大学计算机系,后成为支付宝的技术总监.

李书福论战王小川:IT与汽车,谁会革谁的命?

中介交易 SEO诊断 淘宝客 云主机 技术大厅 浓缩观点 传统汽车制造商都有些固步自封,缺乏创新.而互联网产业则或许能给这个汽车行业带来新的活力.看到Tesla.Google等汽车行业搅局者,如何提升汽车的用户体验,这责任似乎也推到了互联网人身上. 由于在用户体验上存在着巨大的差距,所以互联网公司与汽车厂商的合作存在一种无法避免的"断层".针对这一点,王小川认为一定要"倒逼"汽车厂商,即通过互联网产品的用户体验反过来影响汽车,把主动权握在自己手里,而不是被框在车企的

Gmail新对手 UES 3G要革Gmail的命?

话说一个叫google的公司在银河系里一个叫地球的蓝色星球上, 首先用一种叫gmail的GB级免费邮箱发起 一场邮箱升级风暴,结果那个星球上的很多公司纷纷效仿,什么sina任你邮1GB,什么Yahoo1G免费邮箱,反正搞的那个叫互联网的东西狼烟四起,而在那个星球上,有一个叫伯狼的闲人很喜欢玩这种东西,对他来说,这些都是他的移动仓库. 那一日,此君在网上无所事事,四处乱逛,无意间发现居然有一个提供3GB免费邮箱的地方,先下手为强,后下手遭殃,伯狼二话不说吭哧吭哧连着注册了三个邮箱,加之之前的三个G

看准新趋势,哪怕是革自己的命

摘要: 新浪CEO曹国伟 去年5月,新浪(Nasdaq:SINA)股价还在35美元左右徘徊:当时,投行最乐观的估计不过是新浪股价可到53美元左右.但从去年7月开始,新浪股价持续走高,到上周,新浪股 新浪CEO曹国伟 去年5月,新浪(Nasdaq:SINA)股价还在35美元左右徘徊:当时,投行最乐观的估计不过是新浪股价可到53美元左右.但从去年7月开始,新浪股价持续走高,到上周,新浪股价盘中达到94.3美元,创历史新高. 微博,无疑是新浪价值激增的最大功臣.里昂证券的詹姆斯·李说:"新浪微博服务推

百度高级副总裁王劲:百度在革自己的命

中介交易 SEO诊断 淘宝客 云主机 技术大厅 原标题:百度高级副总裁王劲:一朵花的大数据之旅 实习记者汪传鸿 本报记者侯继勇北京报道 百度正在传统的搜索技术之外,利用"大数据+云计算"打造另一个驱动公司发展的新引擎--百度高级副总裁王劲接受21世纪经济报道记者采访时如是说. 百度大脑是"云计算+大数据"的载体:其由硬件和软件两部分组成,硬件部分是由云计算中心和服务器组成,软件部分是由大数据和人工智能算法组成.无论百度推荐引擎.BaiduEye,还是百度面对商家的直

行业老大要“革自己的命”

行业"老大"的位置正在更替,但领先者所面对的不确定性之大,决策之难,近乎"凶险",但也许可以称之为"老大的悖论",这与决策的价值有关 巴菲特说:"潮水退去才知道谁光着身子."时下的金融危机让许多公司成了站在水中的裸泳者.未来十二个月,潮水是否还要一退再退,光着身子的公司是不是会越来越多,从已经出笼的各种数字和指标来看,似乎不容乐观.同时,金融危机也在制造另一个现象:行业"老大"的位置,正在更替,一批熟悉的名

百度“移动·云事业部”表示:“我们需要‘革自己的命’

既然发现用户的搜索行为正从PC向移动设备迁移,我们就应该主动引导他们,而非拼命维持现状."李彦宏在一封内部邮件中如此写道.记者_王宏宇 实习记者_刘梦 摄影_刘浚作为中国互联网最具影响力的巨头之一,百度正在经受考验.尽管在此前的财报中给出了高达49.7%的营收同比增幅,且利润也增长了59.8%,但这似乎仍不能让投资者满意.自10月底以来,这家纳斯达克上市公司的股价已下跌超过了10%,两年来第一次跌破每股100美元.在早些时候被公开的一封内部邮件中,百度创始人.董事长兼首席执行官李彦宏将此归结为,