Awesome
Tree
Simple fast compact user-readable binary-safe extensible structural format. Read more in a detailed overview.
more - better | JSON | XML | YAML | INI | Tree |
---|---|---|---|---|---|
Readability | 3 | 1 | 4 | 5 | 5 |
Edit-friendly | 3 | 1 | 4 | 5 | 5 |
Deep hierarchy | 3 | 3 | 3 | 1 | 5 |
Simple to implement | 3 | 2 | 1 | 5 | 5 |
Performance | 3 | 1 | 1 | 5 | 5 |
Size | 3 | 1 | 4 | 5 | 5 |
Streaming | 0 | 0 | 5 | 5 | 5 |
Binary-safe | 2 | 0 | 0 | 0 | 5 |
Universality | 4 | 3 | 3 | 1 | 5 |
Prevalence | 5 | 5 | 3 | 3 | 1 |
Text editors support | 5 | 5 | 3 | 5 | 3 |
Languages support | 4 | 5 | 3 | 5 | 2 |
Short description
Structural-nodes represents as names that can not contain [\s\n\\]
. Example of structural nodes:
first-level second-level third-level
first-level
first-of-second-level third-level
second-of-second-level
Indents must use tabs, lines must use unix line ends.
Data-nodes represents as raw data between [\\]
and [\n]
characters. Example
\hello
\world
\
\hello
\world
In one line may be any count of structural-nodes, but only one data-node at the end.
article
title \Hello world
description
\This is demo of tree-format
\Cool! Is not it? :-)
Grammar using grammar.tree language
Performances
- Tree - единый AST чтобы править всеми - more info about format and tree-based languages
- Что не так с сорсмапами и как с ними не связываться? - using tree for DSL with sourcemaps
IDE support
- SynWrite
- Syntax highlighting for IntelliJ IDEA
- Syntax highlighting for Atom
- Syntax highlighting for Visual Studio Code
- Syntax highlighting for Sublime
- Syntax highlighting for Emacs
Other implementations
Similar formats
D API
Parsing
string data = cast(string) read( "path/to/file.tree" ); // read from file
Tree tree = new Tree( data , "http://example.org/source/uri" ); // parse to tree
Simple queries
Tree userNames = tree.select( "user name" ); // returns name-nodes
Tree userNamesValues = tree.select( "user name " ); // returns value-nodes
Node info
string name = userNames[0].name; // get node name
string stringValue = userNames[0].value; // get value as string with "\n" as delimiter
uint intValue = userNames[0].value!uint; // get value converted from string to another type
Tree[] childs = tree.childs; // get child nodes array
string baseUri = tree.baseUri; // get base uri like "http://example.org/source/uri"
size_t row = tree.row; // get row in source stream
size_t col = tree.col; // get column in source stream
string uri = tree.uri; // get uri like "http://example.org/source/uri#3:2"
Nodes creation
Tree values = Tree.Values( "foo\nbar" , [] );
Tree name = Tree.Name( "name" , values );
Tree list = Tree.List( [ name , name ] );
Tree firstLineName = name.clone( [ name[0] );
Serialization
string data = tree.toString(); // returns string representation of tree
tree.pipe( stdout ); // prints tree to output buffer
Benchmarks
void main() {
import std.datetime.stopwatch, std.json, jin.tree, std.stdio, std.file;
string dataTree = cast(string) read( "formats/sample.tree" );
string dataJson = cast(string) read( "formats/sample.json" );
Tree tree;
JSONValue json;
void measureTree() {
tree = new Tree( dataTree , "formats/sample.tree" );
}
void measureJson() {
json = parseJSON( dataJson );
}
auto res = benchmark!( measureTree, measureJson )(100);
res.writeln;
}
rdmd source/bench --build=release
Parse
jin.tree | std.json |
---|---|
204 ms | 372 ms |