1
1
# ![ Unist] [ logo ]
2
2
3
- ** Unist** (** uni** versal ** s** yntax ** t** ree) is the combination of three
4
- project, and more to come, which are the summation of at least
5
- [ two] [ first-retext-commit ] [ years] [ first-remark-commit ] of my work and the
6
- current epitome of that.
3
+ ** Uni** versal ** S** yntax ** T** ree.
4
+
5
+ ***
6
+
7
+ ** Unist** is the combination of three project, and more to come, which
8
+ are the summation of at least [ two] [ first-retext-commit ]
9
+ [ years] [ first-remark-commit ] of my work and the current epitome of that.
7
10
8
11
It’s basically a system for processing input: parsing it into a syntax tree,
9
12
transforming it by plug-ins, and compiling the tree to something else.
@@ -13,32 +16,86 @@ This document explains some terminology relating to [**retext**][retext],
13
16
14
17
## Unist nodes
15
18
16
- ** Unist nodes** :
17
-
18
- * must have a ` type ` property set to a to its namespace semantic
19
- ` string ` ;
20
-
21
- * may have either a ` value ` property set to a ` string ` or a ` children `
22
- property set to an array of zero or more ` Unist ` nodes;
23
-
24
- * may have a ` data ` property set to a ` JSON.stringify ` able object;
25
-
26
- * may have a ` position ` property set to a an object containing ` start ` and
27
- ` end ` , both of which contain an object with ` line ` and ` column ` set
28
- to an integer referencing their respective (1-based) line and column
29
- in the input file. Both may have an ` offset ` property set to its
30
- index from the beginning of the input.
31
- The object at ` position ` may additionally have an ` indent ` property
32
- set to an array of integers higher than 0 (not including), in which
33
- case the node represents content which spans multiple lines prefixed
34
- with content which is not part of the node.
35
- If a node represents something not available in the original input, it
36
- must not have a ` position ` .
37
-
38
19
See [ ** nlcst** ] [ nlcst ] for more information on ** retext** nodes,
39
20
[ ** mdast** ] [ mdast ] for information on ** remark** nodes, and
40
21
[ ` hast#nodes ` ] [ hast-nodes ] for information on ** hast** nodes.
41
22
23
+ ### ` Node `
24
+
25
+ Node represents any unit in the Unist hierarchy. It is an abstract
26
+ class. Interfaces inheriting from ** Node** must have a ` type ` property,
27
+ and may have ` data ` or ` location ` properties. ` type ` s are defined by
28
+ their namespace.
29
+
30
+ ``` idl
31
+ interface Node {
32
+ type: string;
33
+ data: Data?;
34
+ position: Location?;
35
+ }
36
+ ```
37
+
38
+ #### ` Data `
39
+
40
+ Data represents data associated with any node. Data is a scope for plug-ins
41
+ to store any information. Its only limitation being that each property should
42
+ by ` stringify ` able: not throw when passed to ` JSON.stringify() ` .
43
+
44
+ ``` idl
45
+ interface Data { }
46
+ ```
47
+
48
+ #### ` Location `
49
+
50
+ ** Location** references a location of a node in a ** Unist** file.
51
+ If a location is not applicable, the location must be omitted.
52
+ ** Location** consists of a ` start ` and end ` position ` . And, if
53
+ relevant, an ` indent ` property.
54
+
55
+ ``` idl
56
+ interface Location {
57
+ start: Position;
58
+ end: Position;
59
+ indent: [uint32 >= 1]?;
60
+ }
61
+ ```
62
+
63
+ #### ` Position `
64
+
65
+ ** Position** contains ` line ` and ` column ` set to a (1-based) integer
66
+ referencing a position in a ** Unist** file. An ` offset ` (0-based)
67
+ may be used.
68
+
69
+ ``` idl
70
+ interface Position {
71
+ line: uint32 >= 1;
72
+ column: uint32 >= 1;
73
+ offset: uint32 >= 0?;
74
+ }
75
+ ```
76
+
77
+ ### ` Parent `
78
+
79
+ Nodes containing child nodes inherit the ** Parent** ([ ** Node** ] ( #node ) )
80
+ abstract interface.
81
+
82
+ ``` idl
83
+ interface Parent <: Node {
84
+ children: [Node];
85
+ }
86
+ ```
87
+
88
+ ### ` Text `
89
+
90
+ Nodes containing a value inherit the ** Text** ([ ** Node** ] ( #node ) )
91
+ abstract interface.
92
+
93
+ ``` idl
94
+ interface Text <: Node {
95
+ value: string;
96
+ }
97
+ ```
98
+
42
99
## Unist files
43
100
44
101
** Unist files** are virtual files (such as [ ** vfile** ] [ vfile ] )
0 commit comments