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

GitHub 目前的新項目已經轉用 CoffeeScript 了。CoffeeScript 比 JavaScript 要簡潔優雅得多。一樣地,GitHub 也以爲 YAML 不夠簡潔優雅,所以搗鼓出了一個 TOMLphp

TOML 的全稱是 Tom's Obvious, Minimal Language,由於它的做者是 GitHub 聯合創始人 Tom Preston-Werner 。node

TOML 的目標

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 測試套件 (語言無關)

編輯器支持

編碼器


原文 TOML README
翻譯 SegmentFault

相關文章
相關標籤/搜索