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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#[macro_export]
macro_rules! doc {
( @str_literal $e:expr ) => { $e };
( @kind DocText $b:expr $(,)* ) => {
DocText($crate::rtf::StyleSet::new(), $crate::doc::DocString::from_str($b))
};
( @kind DocText { $( $e:expr ),+ $(,)* } , $b:expr $(,)* ) => {
{
let mut map = ::std::collections::HashSet::new();
$(
map.insert($e);
)*
$crate::doc::DocText($crate::rtf::StyleSet::from(map), $crate::doc::DocString::from_str($b))
}
};
( @kind DocGroup $b:expr , [ $( $v:tt )* ] $(,)* ) => {
{
$crate::doc::DocGroup($b, doc![ @span $( $v )* ])
}
};
( @span $( $i:ident ( $( $v:tt )+ ) ),+ $(,)* ) => {
vec![
$( doc!(@kind $i $( $v )* , ) ),*
]
};
( ) => {
$crate::doc::Doc(vec![])
};
( $( $v:tt )+ ) => {
$crate::doc::Doc(doc![ @span $( $v )* ])
};
}
#[macro_export]
macro_rules! add_span {
( @str_literal $e:expr ) => { $e };
( @kind AddSkip $b:expr $(,)* ) => {
AddSkip($b)
};
( @kind AddText { $( $e:expr => $c:expr ),+ , $b:expr $(,)* } $(,)* ) => {
{
let mut map = ::std::collections::HashSet();
$(
map.insert($e, $c);
)*
AddText($crate::rtf::StyleSet::from(map), $crate::doc::DocString::from_str($b))
}
};
( @kind AddText $b:expr $(,)* ) => {
AddText($crate::rtf::StyleSet::new(), $crate::doc::DocString::from_str($b))
};
( @kind AddWithGroup [ $( $v:tt )* ] $(,)* ) => {
AddWithGroup(add_span![ $( $v )* ])
};
( @kind AddGroup $b:expr , [ $( $v:tt )* ] $(,)* ) => {
{
AddGroup($b, add_span![ $( $v )* ])
}
};
( ) => {
vec![]
};
( $( $i:ident ( $( $b:tt )+ ) ),+ $(,)* ) => {
vec![
$( add_span!(@kind $i $( $b )* , ) ),*
]
};
}
#[macro_export]
macro_rules! del_span {
( @str_literal $e:expr ) => { $e };
( @kind DelSkip $b:expr $(,)* ) => {
DelSkip($b)
};
( @kind DelText $b:expr $(,)* ) => {
DelText($b.to_owned())
};
( @kind DelWithGroup [ $( $v:tt )* ] $(,)* ) => {
DelWithGroup(del_span![ $( $v )* ])
};
( @kind DelGroup [ $( $v:tt )* ] $(,)* ) => {
DelGroup(del_span![ $( $v )* ])
};
( @kind DelGroupAll $(,)* ) => {
DelGroupAll
};
( ) => {
vec![]
};
( $( $i:ident ( $( $b:tt )* ) ),+ $(,)* ) => {
vec![
$( del_span!(@kind $i $( $b )* , ) ),*
]
};
( $( $i:ident ),+ $(,)* ) => {
vec![
$( del_span!(@kind $i , ) ),*
]
};
}
#[macro_export]
macro_rules! op {
( [ $( $d:tt )* ], [ $( $a:tt )* ] $(,)* ) => {
$crate::doc::Op(
del_span![ $( $d )* ],
add_span![ $( $a )* ],
)
};
}