Tree.d
Tree - simple fast compact user-readable binary-safe extensible structural format
Install / Use
/learn @nin-jin/Tree.dREADME
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
Related Skills
node-connect
332.9kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
81.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
332.9kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
81.9kCommit, push, and open a PR
