精华内容
参与话题
问答
  • toml语法

    千次阅读 2018-09-01 16:17:48
    TOML 语法规范 2017-03-20 16:45:58 TOML 全称:Tom’s Obvious, Minimal Language 作者:Tom Preston-Werner 最新版本:v0.4.0 注意,这个规范还持续变动中,因此你必须时刻都假定着它是一个不稳定的规范并...

    原文地址:https://aofei.org/posts/2017-03-20-toml

    TOML 语法规范

    2017-03-20 16:45:58

    TOML

    全称:Tom’s Obvious, Minimal Language

    作者:Tom Preston-Werner

    最新版本:v0.4.0

    注意,这个规范还持续变动中,因此你必须时刻都假定着它是一个不稳定的规范并对此做出一些防范措施直到它正式发布了 1.0 版。

    目标

    TOML 的目标是成为一个拥有明显语义且容易阅读的最小化的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而可以很容易地被解析成各种语言中的数据结构。

    例子

    # 这是一个 TOML 的文档。
    
    title = "TOML 例子"
    
    [owner]
    name = "Tom Preston-Werner"
    dob = 1979-05-27T07:32:00-08:00 # 日期是一等公民
    
    [database]
    server = "192.168.1.1"
    ports = [ 8001, 8001, 8002 ]
    connection_max = 5000
    enabled = true
    
    [servers]
    
    	# 缩进(制表符和(或)空格)是允许的,但不是必需的
    	[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 文档是大小写敏感的。
    • TOML 文档必须是一个有效的 UTF-8 编码的 Unicode 文档。
    • 空白符只能是制表符(0x09)或空格(0x20)。
    • 换行符只能是 LF(0x0A)或 CRLF (0x0D0A)。

    注释

    # 将该行的其余部分标记为注释。

    # 这是一个占据整行的注释
    key = "value" # 这是一个在行末的注释
    

    键值对

    一个 TOML 文档的主要构建块是键值对

    在 = 的左边,在右边。周围的空白符忽略不计。= 和必须位于同一行(虽然一些可以被折成多行)。

    key = "value"
    

    可以是裸露的裸键,也可以是被包裹在一对 " 的内部的引用键裸键只能存在字母、数字、下划线和破折号(a-zA-Z0-9_-)。注意,裸键可以只由数字组成,例如 1234,但它总是被解析为字符串。引用键遵循与基本字符串字面字符串完全相同的规范,并允许使用更广泛的键名称。最好的做法是使用裸键,除非必要情况。

    key = "value"
    bare_key = "value"
    bare-key = "value"
    1234 = "value"
    
    "127.0.0.1" = "value"
    "character encoding" = "value"
    "ʎǝʞ" = "value"
    'key2' = "value"
    'quoted "value"' = "value"
    

    裸键不允许为空,但引用键允许(虽然这会导致不可见)。

    = "no key name"  # 非法
    "" = "blank"     # 合法但不可见
    '' = 'blank'     # 合法但不可见
    

    可以是以下类型:字符串整数浮点数布尔值时间数组内联表。未确定的值是非法的。

    key = # 非法
    

    字符串

    字符串的表示方法有四种:基本字符串多行基本字符串字面字符串多行字面字符串。所有字符串都必须只包含有效的 UTF-8 字符。

    基本字符串被包裹在一对 " 的内部。任何的 Unicode 字符都可以直接使用,除了那些必须被转义的字符:"\ 和控制字符(U+0000 到 U+001F)。

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

    为了方便起见,一些流行的字符都有简短的转义序列。

    \b         - 退格键   (U+0008)
    \t         - 制表符   (U+0009)
    \n         - 换行符   (U+000A)
    \f         - 换页符   (U+000C)
    \r         - 回车符   (U+000D)
    \"         - "       (U+0022)
    \\         - \       (U+005C)
    \uXXXX     - Unicode (U+XXXX)
    \UXXXXXXXX - Unicode (U+XXXXXXXX)
    

    任何的 Unicode 字符都可以通过 \uXXXX 或 \UXXXXXXXX 形式转义。转义的编码必须是有效的标量值

    所有上面未列出的其他的转义序列都将被保留不能使用,如果使用,则必须在解析时抛出一个错误。

    有些时候可能需要表示文本的段落(例如:翻译文件)或想要将一个非常长的字符串折成多行。TOML 完成起来非常容易。多行基本字符串被包裹在有限行两侧的一对 """ 的内部。新行起始位置的换行符将会被忽略不计。所有其他的空白符和换行符都将被保留下来。

    str1 = """
    Roses are red
    Violets are blue"""
    

    TOML 解析器必须兼容不同平台的换行符。

    # 在 Unix 系统上,上面的多行字符串必须和这个一样:
    str2 = "Roses are red\nViolets are blue"
    
    # 在 Windows 系统上,必须和这个一样:
    str3 = "Roses are red\r\nViolets are blue"
    

    书写长字符串时,使用行结束符来避免引入多余的空白符。当行末的字符是 \ 时,TOML 将会忽略所有的空白符(包括换行符)直到遇到非空白符或 """。所有对于基本字符串有效的转义序列对于多行基本字符串也是有效的。

    # 以下字符串完全相同:
    str1 = "The quick brown fox jumps over the lazy dog."
    
    str2 = """
    The quick brown \
    
    
      fox jumps over \
        the lazy dog."""
    
    str3 = """\
           The quick brown \
           fox jumps over \
           the lazy dog.\
           """
    

    任何的 Unicode 字符都可以直接使用,除了那些必须被转义的字符:\ 和控制字符(U+0000 到 U+001F)。" 不需要转义,除非它的存在会导致多行字符串过早结束。

    TOML 还支持不含任何转义的字面字符串字面字符串被包裹在一对 ' 的内部,像基本字符串一样,它们必须位于同一行。

    # 所见即所得。
    winpath  = 'C:\Users\nodejs\templates'
    winpath2 = '\\ServerX\admin$\system32\'
    quoted   = 'Tom "Dubs" Preston-Werner'
    regex    = '<\i\c*\s*>'
    

    由于不含转义,也就没法在字面字符串内书写 ' 了。但幸运的是,TOML 还支持了可以很好的解决这个问题的多行字面字符串多行字面字符串被包裹在有限行两侧的一对 ''' 的内部。像字面字符串一样,多行字面字符串不含任何转义。新行起始位置的换行符将会被忽略不计。所有其他的字符都将被完整地保留下来。

    regex2 = '''I [dw]on't need \d{2} apples'''
    lines  = '''
    The first newline is
    trimmed in raw strings.
       All other whitespace
       is preserved.
    '''
    

    对于二进制数据,建议使用 Base64 或其它合适的 ASCII 或 UTF-8 编码。编码的处理将是特定于应用程序的。

    整数

    整数分为正数负数正数前的 + 不是必须的,但负数前必须存在 -

    int1 = +99
    int2 = 42
    int3 = 0
    int4 = -17
    

    对于较大的数字,可以使用 _ 来增强其可读性。_ 必须被数字包围。

    int5 = 1_000
    int6 = 5_349_221
    int7 = 1_2_3_4_5     # 合法但不可见
    

    前导零、十六进制、八进制和二进制都是不允许的。像是“infinity”和“not a number”这种不能表示为一个连续的数字序列的值也是不被允许的。

    整数是 64 位的长整型,范围是:−9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。

    浮点数

    浮点数整数部分(与整数相同的规范)和小数部分和(或)指数部分组成。如果小数部分指数部分同时存在,那么小数部分必须先于指数部分

    # 小数
    flt1 = +1.0
    flt2 = 3.1415
    flt3 = -0.01
    
    # 指数
    flt4 = 5e+22
    flt5 = 1e6
    flt6 = -2E-2
    
    # 二者
    flt7 = 6.626e-34
    

    小数部分由一个 . 开始,然后是一个或多个数字组成。

    指数部分由一个 E(大小写均可)开始,然后是一个整数部分(和整数遵循相同的规范)组成。

    整数类似,浮点数可以使用 _ 来增强其可读性。_ 必须被数字包围。

    flt8 = 9_224_617.445_991_228_313
    

    浮点数是 64 位的(双)精度数。

    布尔值

    布尔值的用法和在其他语言中的一样,且必须小写。

    bool1 = true
    bool2 = false
    

    偏移日期时间

    为了明确地表示特定的日期时间,可以使用 RFC 3339 来格式化日期时间的偏移量。

    odt1 = 1979-05-27T07:32:00Z
    odt2 = 1979-05-27T00:32:00-07:00
    odt3 = 1979-05-27T00:32:00.999999-07:00
    

    秒的小数部分的精度至少是毫秒级。如果值的精度远比实现的要高,那么多余的精度必须被截断,而不是舍入。

    本地日期时间

    如果省略 RFC 3339 格式的日期时间的偏移量,那么它将只表示给定的日期时间且与偏移量和时区没有任何关系。如果没有附加信息,那么它不能被转换成即时时间。如果需要转换为即时时间,则取决于具体的实现。

    ldt1 = 1979-05-27T07:32:00
    ldt2 = 1979-05-27T00:32:00.999999
    

    秒的小数部分的精度至少是毫秒级。如果值的精度远比实现的要高,那么多余的精度必须被截断,而不是舍入。

    本地日期

    如果只包括 RFC 3339 格式的日期时间的日期部分,那么它将只表示给定的日期且与偏移量和时区没有任何关系。

    ld1 = 1979-05-27
    

    本地时间

    如果只包括 RFC 3339 格式的日期时间的时间部分,那么它将只表示给定的时间且与偏移量和时区没有任何关系。

    lt1 = 07:32:00
    lt2 = 00:32:00.999999
    

    秒的小数部分的精度至少是毫秒级。如果值的精度远比实现的要高,那么多余的精度必须被截断,而不是舍入。

    数组

    数组被包裹在 [ 和 ] 的内部。空白符忽略不计。元素由 , 分隔。不能混用数据类型(字符串的不同实现被认为是同一种数据类型,因此必须使用不同类型的数组)。

    arr1 = [ 1, 2, 3 ]
    arr2 = [ "red", "yellow", "green" ]
    arr3 = [ [ 1, 2 ], [3, 4, 5] ]
    arr4 = [ "all", 'strings', """are the same""", '''type''']
    arr5 = [ [ 1, 2 ], ["a", "b", "c"] ]
    
    arr6 = [ 1, 2.0 ] # 非法
    

    数组还可以被折成多行。所以除了空白符,数组还忽略了 [ 和 ] 的内部的换行符和注释。] 前允许出现 ,

    arr7 = [
      1, 2, 3
    ]
    
    arr8 = [
      1,
      2, # 这是允许的
    ]
    

    表格

    表格(也叫哈希表字典)是一个键值对的集合。它们被包裹在 [ 和 ] 的内部且自成一行。表格数组是不同的,因为数组只有值。

    [table]
    

    在此之下,直到下一个表格或 EOF 之前,都是该表格键值对表格中的键值对是无序的。

    [table-1]
    key1 = "some string"
    key2 = 123
    
    [table-2]
    key1 = "another string"
    key2 = 456
    

    . 禁止出现在裸键内,因为 . 是用来表示嵌套表的。每个 . 分隔的部分的命名规范与相同。

    [dog."tater.man"]
    type = "pug"
    

    转换成 JSON 结构如下:

    { "dog": { "tater.man": { "type": "pug" } } }
    

    . 周围的空白符忽略不计,建议不要使用多余的空白符。

    [a.b.c]            # 这样做最好
    [ d.e.f ]          # 等价于 [d.e.f]
    [ g .  h  . i ]    # 等价于 [g.h.i]
    [ j . "ʞ" . 'l' ]  # 等价于 [j."ʞ".'l']
    

    如果不想的话,可以不用声明所有的父表。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
    

    表格的名称必须是非空的。

    []     # 非法
    [a.]   # 非法
    [a..b] # 非法
    [.b]   # 非法
    [.]    # 非法
    

    内联表

    内联表提供了更紧凑语法来表示表格。它们对于分组数据特别有用,否则将很快变得冗长。内联表被包裹在 {和 } 的内部。在 { 和 } 的内部,可能会出现零个或多个用 , 分隔的键值对键值对标准表中的键值对形式相同。允许所有的值类型,包括内联表

    内联表的目的是出现在单行。{ 和 } 内不允许出现换行符,除非它存在于一个内。即便如此,还是强烈建议不要将一个内联表折成多行。如果你发现自己被这种欲望所困扰,那意味着你应该使用标准表

    name = { first = "Tom", last = "Preston-Werner" }
    point = { x = 1, y = 2 }
    

    上面的内联表与下面的标准表完全相同:

    [name]
    first = "Tom"
    last = "Preston-Werner"
    
    [point]
    x = 1
    y = 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 = []
    
    [[fruit]] # 不允许
    

    试图定义一个标准表,且使用已经定义的数组的名称,则必须在解析时抛出错误:

    # 非法的 TOML 文档
    [[fruit]]
      name = "apple"
    
      [[fruit.variety]]
        name = "red delicious"
    
    	# 这个表格和上面的冲突了
      [fruit.variety]
        name = "granny smith"
    

    也可以在适当的时候使用内联表

    points = [ { x = 1, y = 2, z = 3 },
               { x = 7, y = 8, z = 9 },
               { x = 2, y = 4, z = 8 } ]
    

    文件扩展名

    TOML 文件必须使用 .toml 来作为其扩展名

     

    展开全文
  • TOML简介

    万次阅读 2017-02-19 11:27:50
    TOML简介GitHub 目前的新项目已经转用 CoffeeScript 了。CoffeeScript 比 JavaScript 要简洁优雅得多。同样地,GitHub 也觉得 YAML 不够简洁优雅,因此捣鼓出了一个 TOMLTOML 的全称是 Tom’s Obvious, ...

    TOML简介

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

    TOML 的全称是 Tom’s Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner 。GitHub 这是要革 YAML 的命呀!

    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

    表格数组

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

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

    为什么需要TOML

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

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

    C#/.NET - https://github.com/LBreedlove/Toml.net
    C#/.NET - https://github.com/rossipedia/toml-net
    C#/.NET - https://github.com/RichardVasquez/TomlDotNet
    C (@ajwans) - https://github.com/ajwans/libtoml
    C++ (@evilncrazy) - https://github.com/evilncrazy/ctoml
    C++ (@skystrife) - https://github.com/skystrife/cpptoml
    Clojure (@lantiga) - https://github.com/lantiga/clj-toml
    Clojure (@manicolosi) - https://github.com/manicolosi/clojoml
    CoffeeScript (@biilmann) - https://github.com/biilmann/coffee-toml
    Common Lisp (@pnathan) - https://github.com/pnathan/pp-toml
    Erlang - https://github.com/kalta/etoml.git
    Erlang - https://github.com/kaos/tomle
    Emacs Lisp (@gongoZ) - https://github.com/gongo/emacs-toml
    Go (@thompelletier) - https://github.com/pelletier/go-toml
    Go (@laurent22) - https://github.com/laurent22/toml-go
    Go w/ Reflection (@BurntSushi) - https://github.com/BurntSushi/toml
    Haskell (@seliopou) - https://github.com/seliopou/toml
    Haxe (@raincole) - https://github.com/raincole/haxetoml
    Java (@agrison) - https://github.com/agrison/jtoml
    Java (@johnlcox) - https://github.com/johnlcox/toml4j
    Java (@mwanji) - https://github.com/mwanji/toml4j
    Java - https://github.com/asafh/jtoml
    Java w/ ANTLR (@MatthiasSchuetz) - https://github.com/mschuetz/toml
    Julia (@pygy) - https://github.com/pygy/TOML.jl
    Literate CoffeeScript (@JonathanAbrams) - https://github.com/JonAbrams/tomljs
    node.js - https://github.com/aaronblohowiak/toml
    node.js/browser - https://github.com/ricardobeat/toml.js (npm install tomljs)
    node.js - https://github.com/BinaryMuse/toml-node
    node.js (@redhotvengeance) - https://github.com/redhotvengeance/topl (topl npm package)
    node.js/browser (@alexanderbeletsky) - https://github.com/alexanderbeletsky/toml-js (npm browser amd)
    Objective C (@mneorr) - https://github.com/mneorr/toml-objc.git
    Objective-C (@SteveStreza) - https://github.com/amazingsyco/TOML
    Ocaml (@mackwic) https://github.com/mackwic/to.ml
    Perl (@alexkalderimis) - https://github.com/alexkalderimis/config-toml.pl
    Perl - https://github.com/dlc/toml
    PHP (@leonelquinteros) - https://github.com/leonelquinteros/php-toml.git
    PHP (@jimbomoss) - https://github.com/jamesmoss/toml
    PHP (@coop182) - https://github.com/coop182/toml-php
    PHP (@checkdomain) - https://github.com/checkdomain/toml
    PHP (@zidizei) - https://github.com/zidizei/toml-php
    PHP (@yosymfony) - https://github.com/yosymfony/toml
    Python (@socketubs) - https://github.com/socketubs/pytoml
    Python (@f03lipe) - https://github.com/f03lipe/toml-python
    Python (@uiri) - https://github.com/uiri/toml
    Python - https://github.com/bryant/pytoml
    Python (@elssar) ) https://github.com/elssar/tomlgun
    Python (@marksteve) - https://github.com/marksteve/toml-ply
    Python (@hit9) - https://github.com/hit9/toml.py
    Ruby (@jm) - https://github.com/jm/toml (toml gem)
    Ruby (@eMancu) - https://github.com/eMancu/toml-rb (toml-rb gem)
    Ruby (@charliesome) - https://github.com/charliesome/toml2 (toml2 gem)
    Ruby (@sandeepravi) - https://github.com/sandeepravi/tomlp (tomlp gem)
    Scala - https://github.com/axelarge/tomelette
    

    校验

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

    TOML 测试套件 (语言无关)

    toml-test (@BurntSushi) - https://github.com/BurntSushi/toml-test

    编辑器支持

    Emacs (@dryman) - https://github.com/dryman/toml-mode.el

    Sublime Text 2 & 3 (@lmno) - https://github.com/lmno/TOML

    TextMate (@infininight) - https://github.com/textmate/toml.tmbundle

    Vim (@cespare) - https://github.com/cespare/vim-toml

    编码器

    。PHP (@ayushchd) - https://github.com/ayushchd/php-toml-encoder

    展开全文
  • TOML学习笔记

    千次阅读 2018-03-06 18:51:51
    常见的配置文件格式有ini,yaml,toml等,今天学习一下tomlTOML(Tom’s Obvious, Minimal Language),因为它的作者是 GitHub联合创始人Tom Preston-Werner 。github地址:https://github.com/toml-lang/toml。 ...

    常见的配置文件格式有ini,yaml,toml等,今天学习一下toml。TOML(Tom’s Obvious, Minimal Language),因为它的作者是 GitHub联合创始人Tom Preston-Werner 。github地址:https://github.com/toml-lang/toml。

    ini,yaml,toml的对比

    In some ways TOML is very similar to JSON: simple, well-specified, and maps easily to ubiquitous data types. JSON is great for serializing data that will mostly be read and written by computer programs. Where TOML differs from JSON is its emphasis on being easy for humans to read and write. Comments are a good example: they serve no purpose when data is being sent from one program to another, but are very helpful in a configuration file that may be edited by hand.

    The YAML format is oriented towards configuration files just like TOML. For many purposes, however, YAML is an overly complex solution. TOML aims for simplicity, a goal which is not apparent in the YAML specification: http://www.yaml.org/spec/1.2/spec.html

    The INI format is also frequently used for configuration files. The format is not standardized, however, and usually does not handle more than one or two levels of nesting.
    复杂度:yaml > toml > ini
    综上,TOML是适合做配置文件的,易于书写,简单且能够表示较为复杂的配置。

    toml的目标,也是toml的特点

    TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。
    TOML aims to be a minimal configuration file format that’s easy to read due to obvious semantics. TOML is designed to map unambiguously to a hash table. TOML should be easy to parse into data structures in a wide variety of languages.

    语法规范

    最详细的都在这里,下面那个中文版是对应的翻译。
    Gitbub ReadMe:https://github.com/toml-lang/toml/blob/master/README.md
    中文版:https://segmentfault.com/a/1190000000477752

    展开全文
  • Python读写TOML文件

    千次阅读 2019-07-13 17:39:23
    TOML介绍 TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。 下文是一个较为详细的TOML介绍 https://segmentfault.com/a/1190000000477752 Python读写TOML ...

    TOML介绍

    TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。
    下文是一个较为详细的TOML介绍
    https://segmentfault.com/a/1190000000477752

    Python读写TOML

    toml包是一个为python语言解析toml编写的第三方包,其在pypi上的地址如下:
    https://pypi.org/project/toml/

    安装toml解析包

    pip install toml
    

    函数说明

    toml包十分简单,解析常用的就是如下四个方法:

    toml.load(f, _dict=dict)

    从文件或者一组文件中解析TOML,返回一个字典对象或类的实例对象。当解析多个文件时,会按照传入顺序依次解析,后边的文件内包含键的值会覆盖之前文件相同键的值

    参数

    • f 文件路径,多个文件路径的列表或者文件描述符
    • _dict 将解析结果填充到一个类中去

    返回

    一个字典对象或者_dict指定的类对象的实例

    异常

    • TypeError 如果参数f不是一个文件路径或者路径列表时会抛出该错误
    • TomlDecodeError 解析错误时抛出

    toml.loads(s, _dict=dict)

    从字符串中解析TOML,返回一个字典对象或类的实例对象

    参数

    • s 字符串对象
    • _dict 将解析结果填充到一个类中去

    返回

    一个字典对象或者_dict指定的类对象的实例

    异常

    • TypeError 如果参数f不是一个文件路径或者路径列表时会抛出该错误
    • TomlDecodeError 解析错误时抛出

    toml.dump(o, f)

    将字典对象写入toml文件

    参数

    • o 字典对象
    • f 文件描述符,即打开的文件对象

    返回

    格式化成toml语言的字符串

    异常

    • TypeError 各种错误都会返回该错误,包括传入的文件对象错误

    toml.dumps(o)

    将字典对象格式化成toml字符串

    参数

    • o 字典对象

    返回

    格式化成toml语言的字符串

    代码示例

    • a.toml
    title = "TOML in file a"
    
    [owner]
    name = "Tom Preston-Werner"
    organization = "GitHub"
    bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
    dob = 1979-05-27T07:32:00Z # 日期时间是一等公民。为什么不呢?
    
    • b.toml
    title = "TOML in file b"
    
    [owner]
    name = "Tom Preston-Werner"
    organization = "GitHub"
    bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
    dob = 1979-05-27T07:32:00Z # 日期时间是一等公民。为什么不呢?
    

    读取单个配置文件

    import toml
    
    file_a = "res/a.toml"
    
    if __name__ == "__main__":
        a = toml.load(file_a)
        print("变量a的类型: %s" % type(a))
        print("变量a的内容: %s" % a)
    

    结果1

    读取多个文件

    import toml
    
    file_a = "res/a.toml"
    file_b = "res/b.toml"
    
    if __name__ == "__main__":
        a = toml.load([file_a, file_b])
        print("后读文件b的结果:%s" % a)
        a = toml.load([file_b, file_a])
        print("后读文件a的结果:%s" % a)
    

    结果2

    将字典写入文件

    import toml
    
    dst_file = "res/c.toml"
    
    if __name__ == "__main__":
        a = {'a': 1, 'b': {'c': 1, 'd': {'e': 1}}}
        with open(dst_file, 'w') as f:
            r = toml.dump(a, f)
            print(r)
    

    结果3

    展开全文
  • toml一个 TOML 文件解析库,灵活的配置管理是大多数程序都需要的功能,使用配置文件可以让程序更加灵活,更方便适应不同的使用情况、运行环境等等。这次的toml解析器就可以协助程序的配...
  • TOML用法

    2018-03-31 12:12:55
    同样地,GitHub 也觉得 YAML 不够简洁优雅,因此捣鼓出了一个 TOMLTOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner 。 TOML 的目...
  • TOML基本介绍

    千次阅读 2018-10-11 17:56:46
    同样地,GitHub 也觉得 YAML 不够简洁优雅,因此捣鼓出了一个 TOMLTOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner 。 TOML ...
  • toml

    千次阅读 2016-12-24 15:39:59
    toml
  • TOML介绍及试用

    千次阅读 2019-01-30 16:13:45
    TOML TOML是前Github CEO,Tom Preston-Werner,2013年创建的语言,目标是成为小规模易于使用的语义化配置文件格式,支持无二义性转化为哈希表 源码及安装 Golang为例 地址 https://github.com/BurntSushi/toml ...
  • toml

    2019-07-10 11:49:56
    toml是一种配置文件格式,常见的配置文件格式有很多种,toml是我最新见到的,常见的有.ini .json .yaml\yml .xml ,但是toml最为简洁、最为语义化! TOML 是前GitHub CEO, Tom Preston-Werner,于2013年创建的语言...
  • toml

    2017-06-17 10:59:00
    TOML被设计为可以无二义性的转换为一个哈希表(Hash table)。   # 这是一个TOML文件 title = "TOML Example" [owner] name = "Lance Uppercut" dob = 1979-05-27T07:32:00-08:00 # ...
  • toml

    2017-06-17 10:59:00
    TOML被设计为可以无二义性的转换为一个哈希表(Hash table)。 # 这是一个TOML文件 title = "TOML Example" [owner] name = "Lance Uppercut" dob = 1979-05-27T07:32:00-08:00 # 日期是一等公民 ...
  • 经过:原本,我一直以为,yml格式非常好用,至少比 properties要科学,比 json 要简洁、强大,然而,下面遇到的这个案例,让我意识到,yaml并不是万能,也并不是最科学、简洁的,甚至是比较糟糕的。...
  • 深入对比TOML,JSON和YAML

    千次阅读 2019-04-01 16:54:50
    深入对比TOML,JSON和YAML https://www.cnblogs.com/sunsky303/p/9208848.html 目录 TOML(Tom's Obvious,Minimal Language) YAML(不是标记语言) JSON(JavaScript对象表示法) TOML,YAML和JSON之间的...
  • TOML 详解

    2017-09-27 11:10:00
    TOML的由来 配置文件的使用由来已久,从.ini、XML、JSON、YAML再到TOML,语言的表达能力越来越强,同时书写便捷性也在不断提升。 TOML是前GitHub CEO, Tom Preston-Werner,于2013年创建的语言,其目标是成为...
  • Golang实现简化版解析TOML格式

    千次阅读 2018-07-03 19:28:42
    TOML的由来 配置文件的使用由来已久,从.ini、XML、JSON、YAML再到TOML,语言的表达能力越来越强,同时书写便捷性也在不断提升。 TOML是前GitHub CEO, Tom Preston-Werner,于2013年创建的语言,其目标是成为一个...
  • 接前一期的toml文件,我这次用rust实现读取。我用的rust版本是1.41.0。程序写法可能与老的rust有差别。请使用老版本rust的读者注意。 use serde_derive::Deserialize; use toml::value::*; use std::fs::File; ...
  • if _, err := toml.DecodeFile("cloud.toml", &config); err != nil { fmt.Println(err) return } // fmt.Printf("%#v ", config) for sensorName, sensor := range config.Imu { fmt.Printf("Topic: %s ...
  • go 解析 toml

    2019-01-09 14:12:14
    为什么这么简单的 toml解析,都能出不来也是服了。 这样说吧,已经有了开源的解析库,只要调用一下,就可以解析了,可是就是读不出来数据,你说奇怪吗? 就是还是格式不对呗。 标准库: github: ...
  • golang toml解析

    千次阅读 2018-01-04 00:18:45
    TOML 的全称是 Tom’s Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner。 TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言...

空空如也

1 2 3 4 5 ... 20
收藏数 6,029
精华内容 2,411
关键字:

toml