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