設定ファイル用のシンプルなミニ言語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"}}