-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathadd.html
189 lines (189 loc) · 9.87 KB
/
add.html
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Adding blocks in editor</title>
<link rel="stylesheet" type="text/css" href="slides/slides.css"></head>
<body>
<h1>Adding blocks in editor</h1>
<div class="slides">
<div class="page">
<div class="slide slide-header"><div class="slide-nr">1</div><div class="headers">
<h1>Adding blocks in editor</h1>
</div></div>
<ul><li>
define commands to add a header, code block or paragraph block after the current slide
</li><li>
when reading again <code><span class="var">hx</span></code> will merge continuous paragraphs into one block
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">2</div>
<code>
<span class="macro">@Add(<span class="name">global elements</span>)</span><br/>
<span class="in1"></span><span class="type">void</span> <span class="fn">add_block</span>(<span class="type">Read_State</span> <span class="var">state</span>) {<br/>
<span class="in2"></span><span class="macro">@put(<span class="name">add block</span>)</span>;<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">global elements</span>)</span>;<br/>
</code></div>
<ul><li>
the <code><span class="fn">add_block</span></code> function adds a new block after the current block
</li><li>
it sets its value to a default text
</li><li>
and makes the new block the current block
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">3</div>
<code>
<span class="macro">@Add(<span class="name">run loop</span>)</span><br/>
<span class="in1"></span><span class="keyword">if</span> (<span class="var">cmd</span> == <span class="str">"h"</span> || <span class="var">cmd</span> == <span class="str">"header"</span>) {<br/>
<span class="in2"></span><span class="fn">add_block</span>(<span class="var">RS</span>::<span class="var">header</span>);<br/>
<span class="in2"></span><span class="keyword">continue</span>;<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">run loop</span>)</span><br/>
</code></div>
<ul><li>
generates a new header block
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">4</div>
<code>
<span class="macro">@Add(<span class="name">run loop</span>)</span><br/>
<span class="in1"></span><span class="keyword">if</span> (<span class="var">cmd</span> == <span class="str">"c"</span> || <span class="var">cmd</span> == <span class="str">"code"</span>) {<br/>
<span class="in2"></span><span class="fn">add_block</span>(<span class="var">RS</span>::<span class="var">code</span>);<br/>
<span class="in2"></span><span class="keyword">continue</span>;<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">run loop</span>)</span><br/>
</code></div>
<ul><li>
generates a new code block
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">5</div>
<code>
<span class="macro">@Add(<span class="name">run loop</span>)</span><br/>
<span class="in1"></span><span class="keyword">if</span> (<span class="var">cmd</span> == <span class="str">"o"</span> || <span class="var">cmd</span> == <span class="str">"other"</span>) {<br/>
<span class="in2"></span><span class="fn">add_block</span>(<span class="var">RS</span>::<span class="var">para</span>);<br/>
<span class="in2"></span><span class="keyword">continue</span>;<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">run loop</span>)</span><br/>
</code></div>
<ul><li>
generates a new paragraph blocks
</li><li>
multiple paragraph blocks will be merged into one paragraph block on read
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">6</div>
<code>
<span class="macro">@def(<span class="name">add block</span>)</span><br/>
<span class="in1"></span><span class="keyword">if</span> (<span class="var">curInput</span> != <span class="var">inputs</span>.<span class="fn">end</span>()) {<br/>
<span class="in2"></span><span class="macro">@put(<span class="name">increase block</span>)</span>;<br/>
<span class="in2"></span><span class="type">int</span> <span class="var">i</span> = <span class="var">curBlock</span> - <span class="var">curInput</span>-><span class="var">second</span>.<span class="var">blocks</span>.<span class="fn">begin</span>();<br/>
<span class="in2"></span><span class="macro">@put(<span class="name">insert block</span>)</span>;<br/>
<span class="in2"></span><span class="var">curBlock</span> = <span class="var">curInput</span>-><span class="var">second</span>.<span class="var">blocks</span>.<span class="fn">begin</span>() + <span class="var">i</span>;<br/>
<span class="in1"></span>} <span class="keyword">else</span> {<br/>
<span class="in2"></span><span class="type">std</span>::<span class="var">cerr</span> << <span class="str">"! no file\n"</span>;<br/>
<span class="in1"></span>}<br/>
<span class="in1"></span><span class="fn">draw_block</span>();<br/>
<span class="macro">@end(<span class="name">add block</span>)</span><br/>
</code></div>
<ul><li>
<code><span class="fn">add_block</span></code> increases the current block if possible
</li><li>
so it can insert the new block before the iterator
</li><li>
as the insert can invalidate the iterators, it saves the distance
</li><li>
and restores it afterwards
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">7</div>
<code>
<span class="macro">@def(<span class="name">increase block</span>)</span><br/>
<span class="in1"></span><span class="keyword">if</span> (<span class="var">curBlock</span> != <span class="var">curInput</span>-><span class="var">second</span>.<span class="var">blocks</span>.<span class="fn">end</span>()) {<br/>
<span class="in2"></span>++<span class="var">curBlock</span>;<br/>
<span class="in1"></span>}<br/>
<span class="macro">@end(<span class="name">increase block</span>)</span><br/>
</code></div>
<ul><li>
<code><span class="fn">add_block</span></code> does not advance beyond the end of the container
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">8</div>
<code>
<span class="macro">@def(<span class="name">insert block</span>)</span><br/>
<span class="in1"></span><span class="var">curInput</span>-><span class="var">second</span>.<span class="var">blocks</span>.<span class="fn">insert</span>(<span class="var">curBlock</span>, {<br/>
<span class="in2"></span><span class="var">state</span>, { <span class="str">"REPLACE"</span> }, {},<br/>
<span class="in2"></span><span class="var">state</span> == <span class="var">RS</span>::<span class="var">header</span> ? <span class="num">1</span> : <span class="num">0</span><br/>
<span class="in1"></span>});<br/>
<span class="macro">@end(<span class="name">insert block</span>)</span><br/>
</code></div>
<ul><li>
<code><span class="fn">add_block</span></code> creates a new block with the requested <code><span class="var">state</span></code>
</li><li>
and a default text
</li></ul>
</div>
</div>
<h2>Duplicating the current block</h2>
<div class="slides">
<div class="page">
<div class="slide slide-header"><div class="slide-nr">9</div><div class="headers">
<h2>Duplicating the current block</h2>
</div></div>
<ul><li>
duplicates the current block
</li><li>
and sets the current block to the new copy
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">10</div>
<code>
<span class="macro">@Add(<span class="name">run loop</span>)</span><br/>
<span class="in1"></span><span class="keyword">if</span> (<span class="var">cmd</span> == <span class="str">"d"</span> || <span class="var">cmd</span> == <span class="str">"dup"</span>) {<br/>
<span class="in2"></span><span class="keyword">if</span> (<span class="var">curInput</span> != <span class="var">inputs</span>.<span class="fn">end</span>()) {<br/>
<span class="in3"></span><span class="keyword">if</span> (<span class="var">curBlock</span> != <span class="var">curInput</span>-><span class="var">second</span>.<span class="var">blocks</span>.<span class="fn">end</span>()) {<br/>
<span class="in4"></span><span class="macro">@put(<span class="name">duplicate</span>)</span>;<br/>
<span class="in3"></span>}<br/>
<span class="in2"></span>} <span class="keyword">else</span> {<br/>
<span class="in3"></span><span class="type">std</span>::<span class="var">cerr</span> << <span class="str">"! no file\n"</span>;<br/>
<span class="in2"></span>}<br/>
<span class="in2"></span><span class="keyword">continue</span>;<br/>
<span class="in1"></span>}<br/>
<span class="macro">@End(<span class="name">run loop</span>)</span><br/>
</code></div>
<ul><li>
duplicates the current block
</li><li>
if the file is valid
</li><li>
and the current block is valid
</li></ul>
</div>
<div class="page"><div class="slide"><div class="slide-nr">11</div>
<code>
<span class="macro">@def(<span class="name">duplicate</span>)</span><br/>
<span class="in1"></span><span class="type">int</span> <span class="var">i</span> = <span class="var">curBlock</span> - <span class="var">curInput</span>-><span class="var">second</span>.<span class="var">blocks</span>.<span class="fn">begin</span>();<br/>
<span class="in1"></span><span class="var">curInput</span>-><span class="var">second</span>.<span class="var">blocks</span>.<span class="fn">insert</span>(<span class="var">curBlock</span>, *<span class="var">curBlock</span>);<br/>
<span class="in1"></span><span class="var">curBlock</span> = <span class="var">curInput</span>-><span class="var">second</span>.<span class="var">blocks</span>.<span class="fn">begin</span>() + <span class="var">i</span> + <span class="num">1</span>;<br/>
<span class="macro">@end(<span class="name">duplicate</span>)</span><br/>
</code></div>
<ul><li>
the insert invalidates the iterator
</li><li>
so the offset is saved
</li><li>
a copy of the current block is inserted before the current block
</li><li>
that is the wrong way around but easier
</li><li>
and doesn't matter in the end
</li><li>
the new current block is set to the old current block
</li><li>
which is now the second of the two duplicates
</li></ul>
</div>
</body>
</html>