
設定ファイル用のシンプルなミニ言語TOMLに関して
基本的な情報とサンプルをまとめました。
経緯
静的コンテンツを作成しようと思い、Hugoのガイドを読んでいたら設定ファイルにTOMLがあった。
はじめてきくフォーマットだったので情報を調べることにしました。
TOMLとは?
TOML=Tom's Obvious, Minimal Language.
設定ファイル用のシンプルなミニ言語です。
TOMLはHash Tableへの変換できるように設計されているため、様々な言語で
データ構造を簡単にパース可能です。
すでに様々な言語によるパーサーが存在するようですが、CrystalやElixirは無いようですね。(2015/08/11現在)
CrystalやElixirで何か作ってみたい、という方はちょうどよいお題かも?
さらに詳細な情報についてはTOMLのGitHubリポジトリを確認してください。
TOML - GitHub
サンプル
Rubyのパーサーを利用してHashをTOML,YAML,JSONに変換して比較してみます。
インストール
$ gem install toml-rb
動作確認用TOMLファイル
- sample.toml
[boolean] boolean1 = true boolean2 = false [numbers] float = 1.1 int = 12 [strings] string = "String"
プログラム
require 'toml' require 'yaml' require 'json' require 'date' require 'pp' mix_hash = { strings: { string: "String", string: "String" }, numbers: { int: 12, float: 1.1 }, boolean: { boolean1: true, boolean2: false } } toml = TOML.dump(mix_hash) puts "==Hash==" pp mix_hash puts "==TOML==" puts toml puts "==JSON==" puts mix_hash.to_json puts "==YAML==" puts mix_hash.to_yaml puts "==TOML to Hash==" pp TOML.parse(toml) pp TOML.parse(toml, symbolize_keys: true) puts "==TOML File to Hash==" pp TOML.load_file('sample.toml') pp TOML.load_file('sample.toml', symbolize_keys: true)
出力
$ ruby toml.rb
==Hash==
{:strings=>{:string=>"String"},
:numbers=>{:int=>12, :float=>1.1},
:boolean=>{:boolean1=>true, :boolean2=>false}}
==TOML==
[boolean]
boolean1 = true
boolean2 = false
[numbers]
float = 1.1
int = 12
[strings]
string = "String"
==JSON==
{"strings":{"string":"String"},"numbers":{"int":12,"float":1.1},"boolean":{"boolean1":true,"boolean2":false}}
==YAML==
---
:strings:
:string: String
:numbers:
:int: 12
:float: 1.1
:boolean:
:boolean1: true
:boolean2: false
==TOML to Hash==
{"boolean"=>{"boolean1"=>true, "boolean2"=>false},
"numbers"=>{"float"=>1.1, "int"=>12},
"strings"=>{"string"=>"String"}}
{:boolean=>{:boolean1=>true, :boolean2=>false},
:numbers=>{:float=>1.1, :int=>12},
:strings=>{:string=>"String"}}
==TOML File to Hash==
{"boolean"=>{"boolean1"=>true, "boolean2"=>false},
"numbers"=>{"float"=>1.1, "int"=>12},
"strings"=>{"string"=>"String"}}
{:boolean=>{:boolean1=>true, :boolean2=>false},
:numbers=>{:float=>1.1, :int=>12},
:strings=>{:string=>"String"}}