Skip to content

Commit 913b1bd

Browse files
committed
Add IDL descriptions of abstract definitions
1 parent 60f8368 commit 913b1bd

File tree

1 file changed

+83
-26
lines changed

1 file changed

+83
-26
lines changed

readme.md

Lines changed: 83 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
# ![Unist][logo]
22

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.
710

811
It’s basically a system for processing input: parsing it into a syntax tree,
912
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],
1316

1417
## Unist nodes
1518

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-
3819
See [**nlcst**][nlcst] for more information on **retext** nodes,
3920
[**mdast**][mdast] for information on **remark** nodes, and
4021
[`hast#nodes`][hast-nodes] for information on **hast** nodes.
4122

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+
4299
## Unist files
43100

44101
**Unist files** are virtual files (such as [**vfile**][vfile])

0 commit comments

Comments
 (0)