1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#[derive(PartialEq, Eq, Debug)]
pub enum Mark {
Semicolon,
Colon,
Question,
Exclamation,
Dash,
LongDash,
Comma,
Point,
Hyphen,
SuspensionPoints,
Apostrophe,
OpenQuote,
CloseQuote,
}
#[derive(PartialEq, Eq, Debug)]
pub enum Atom<'input> {
Word(&'input str),
Punctuation(Mark),
Void,
}
#[derive(PartialEq, Eq, Debug)]
pub enum Format<'input> {
Raw(Vec<Atom<'input>>),
Emph(Vec<Format<'input>>),
StrongEmph(Vec<Format<'input>>),
Quote(Vec<Format<'input>>),
}
#[derive(PartialEq, Eq, Debug)]
pub enum Reply<'input> {
Simple(Vec<Format<'input>>),
WithSay(
Vec<Format<'input>>,
Vec<Format<'input>>,
Option<Vec<Format<'input>>>,
),
}
#[derive(PartialEq, Eq, Debug)]
pub enum Component<'input> {
Teller(Vec<Format<'input>>),
Dialogue(Reply<'input>, Option<&'input str>),
Thought(Reply<'input>, Option<&'input str>),
IllFormed(&'input str),
}
#[derive(PartialEq, Eq, Debug)]
pub struct Paragraph<'input>(pub Vec<Component<'input>>);
#[derive(PartialEq, Eq, Debug)]
pub enum Section<'input> {
Story(Vec<Paragraph<'input>>),
Aside(Option<&'input str>, Vec<Paragraph<'input>>),
IllFormed(Vec<&'input str>),
}
#[derive(PartialEq, Eq, Debug)]
pub struct Document<'input>(pub Vec<Section<'input>>);