about summary refs log tree commit diff stats
path: root/js/map-maker/imgs/extracted-1688-map/MapPartsWhite/towns_white/100.png
blob: 1249f87617505142f93b06f412e8698bcc709c98 (plain)
ofshex dumpascii
0000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 27 00 00 00 1d 08 06 00 00 00 29 42 75 .PNG........IHDR...'.........)Bu
0020 fe 00 00 02 b9 49 44 41 54 78 da ed 97 6f 68 8d 61 18 c6 e7 5f 32 cb 9f 2f 2b 09 99 4c 12 8d 7c .....IDATx...oh.a..._2../+..L..|
0040 58 6d 5f 88 c8 a2 74 7c 20 da ca 17 a9 b3 d4 b2 a6 95 b6 26 59 a4 95 2f d4 a2 e5 44 c9 52 cb 22 Xm_...t|...........&Y../...D.R."
0060 6b a2 64 11 25 44 13 1a 1d 6d da ca 96 36 7f 76 1c c7 75 e5 b7 3a a9 73 5a 67 73 36 39 4f fd 3a k.d.%D...m...6.v..u..:.sZgs69O.:
0080 9d f7 79 df e7 b9 de fb be af fb 39 27 2b 2b 33 32 23 33 fe a3 11 8b c5 72 26 b3 b8 eb 22 7f a2 ..y........9'++32#3.....r&..."..
00a0 36 9f 99 64 6e 9e 88 88 03 13 21 6c 9d 38 2d 8a 13 cc cf 16 1f c5 25 51 94 6e 71 ab 44 8d 58 9e 6..dn.....!l.8-.......%Q.nq.D.X.
00c0 64 3e 2a 42 d0 94 4e 71 1b c4 51 3e 1d a5 3c b1 c7 26 10 53 c5 76 c4 5d 16 f7 44 67 ba 84 6d 11 d>*B..Nq..Q>..<..&.S.v.]..Dg..m.
00e0 15 a2 56 1c 11 e5 a2 45 0c 8a 80 58 24 76 8a 1f a4 f5 ae 78 f9 d7 5b 03 d1 f9 20 6e 21 ee aa e8 ..V....E...X$v.....x..[....n!...
0100 a3 f8 df 8a 5c ee 5d 18 fb 3d 1a 44 ab e8 4a 47 d4 a6 89 7a 71 58 6c 13 65 a4 ce 82 bb e3 ee 5b ....\.]..=.D..JG...zqXl.e......[
0120 4d e4 ce f1 22 6f c4 dc 74 08 b4 a0 fd a4 37 80 d8 e7 a4 b5 50 ac 21 dd 5f c5 7d 84 0d 50 a3 05 M..."o..t.....7.....P.!._.}..P..
0140 62 01 6e 77 bd 66 8f b7 38 d7 5b 9d 08 8a 6a ea aa 53 0c 8b 57 e2 b5 08 8b 5e 04 3b 82 3f 49 73 b.nw.f..8.[...j..S..W....^.;.?Is
0160 18 b1 23 df cf 8a 29 e3 29 6e a3 d8 c4 db 3b 72 37 5d f0 e2 a9 f8 8e 4b 2d aa 4d 9c e7 a4 e8 22 ..#...).)n....;r7].....K-.M...."
0180 92 11 44 bb 0e bf 10 d1 33 e3 29 ce ee dc 2c e6 60 12 3b f5 bd 78 28 be e1 ce 43 71 29 cc 17 a5 ..D.....3.)...,.`.;..x(...Cq)...
01a0 e2 31 c2 1e 91 f6 56 1a b5 23 bd 62 ac a2 96 89 1d a2 5d ec 8b bb 7e 01 43 3c 10 3d 76 74 82 e7 .1....V..#.b......]...~.C<.=vt..
01c0 8f 21 ec 86 d8 c5 77 3f d3 2d ae b8 71 a7 22 ca 4d f5 04 f5 12 21 6d 15 71 f3 c7 31 84 5d f9 2c .!....w?.-..q.".M....!m.q..1.].,
01e0 c9 a9 b1 54 dc 11 4f 30 43 a3 68 26 fd 5e 33 98 6a d4 56 62 84 06 3e 1d c1 c5 cc d5 61 04 47 6f ...T..O0C.h&.^3.j.Vb..>.....a.Go
0200 c8 1b 27 58 a3 80 48 d9 c1 4b fc a3 80 b5 4e f1 d2 bb c7 92 56 bf 79 91 23 e3 85 c4 41 ea ae 9c ..'X..H..K....N.....V.y.#...A...
0220 88 f4 e3 d8 aa 04 cf 57 63 9a 66 9a 74 19 ed 25 84 a3 9b 48 77 31 fb 94 d8 74 a3 15 e7 05 d7 8b .......Wc.f.t..%...Hw1...t......
0240 b5 a4 b9 85 c5 4a 71 65 1f 91 bb 4d 54 e6 ff f1 62 36 cd 3b c4 94 90 85 76 ae 45 31 d3 20 ae 1e .....Jqe...MT...b6.;....v.E1....
0260 a0 e5 d4 27 13 94 2d b6 8a 6b 2c 62 3a 10 d0 86 e3 3c f7 82 0d fa 11 38 c4 bd e1 b8 9e 17 a5 d5 ...'..-..k,b:....<.....8........
0280 7c 66 7e 18 41 9f 70 6c 23 2e 0e 12 80 9c d1 46 ad 90 68 d4 d2 38 3b 70 66 0f 35 34 d2 26 c2 6c |f~.A.pl#......F..h..8;pf.54.&.l
02a0 1a 65 d3 5e 84 bb 17 5e e4 34 f1 1a 27 49 73 80 13 25 6f cc 3f eb b5 c0 74 fa 56 15 69 f5 b9 5a .e.^...^.4..'Is..%o.?...t.V.i..Z
02c0 89 f0 4a 9c 1b e2 7a 0d 66 f1 bd 7b 6d 20 31 8b f3 79 c6 64 f9 2f 91 9b 52 0f fb 17 c7 2f 77 07 ..J...z.f..{m.1..y.d./..R..../w.
02e0 e4 16 20 66 50 ff 00 00 00 00 49 45 4e 44 ae 42 60 82 ...fP.....IEND.B`.
ious revision' href='/akkartik/mu/blame/edit/001-editor.mu?h=main&id=cea49fdee2835c366b917125cd496ac7f0d09232'>^
9baf76ec ^
6f65d591 ^
a90faae9 ^
9baf76ec ^
a90faae9 ^
9baf76ec ^
a90faae9 ^

ae244ebd ^
a90faae9 ^





2d91279b ^
a90faae9 ^
3d8b137c ^


a90faae9 ^
3d8b137c ^
a90faae9 ^


3d8b137c ^


a90faae9 ^
3d8b137c ^

a90faae9 ^

9baf76ec ^
e01277f7 ^
9baf76ec ^
a90faae9 ^
4a48bedc ^
a90faae9 ^
a90faae9 ^
2d91279b ^
a90faae9 ^
ea5e7fd4 ^





01ce563d ^
ea5e7fd4 ^


a90faae9 ^
a90faae9 ^
a90faae9 ^

2d91279b ^
a90faae9 ^
4a48bedc ^
3d8b137c ^
aac76bca ^
a90faae9 ^


6f65d591 ^
a90faae9 ^

01ce563d ^
23d3a022 ^
a90faae9 ^

23d3a022 ^










a90faae9 ^







a90faae9 ^


2d91279b ^
a90faae9 ^
4a48bedc ^
06ef635e ^
3d8b137c ^


a90faae9 ^
3d8b137c ^

741ef43e ^
a90faae9 ^
3d8b137c ^





a90faae9 ^



3d8b137c ^
a90faae9 ^
2d91279b ^
a90faae9 ^


3d8b137c ^
a90faae9 ^
3d8b137c ^
a90faae9 ^
ea5e7fd4 ^
a90faae9 ^
3d8b137c ^
a90faae9 ^


3d8b137c ^
a90faae9 ^


3d8b137c ^
a90faae9 ^
3d8b137c ^
a90faae9 ^
ea5e7fd4 ^

a90faae9 ^

1521e4e3 ^
a90faae9 ^



741ef43e ^

ada5eb55 ^
a90faae9 ^



3d8b137c ^
a90faae9 ^

3d8b137c ^
bbe0801a ^
a90faae9 ^



ada5eb55 ^
a90faae9 ^
136412d2 ^
741ef43e ^

a90faae9 ^



ea5e7fd4 ^
a90faae9 ^

3d8b137c ^




a90faae9 ^
ea5e7fd4 ^


a90faae9 ^
ea5e7fd4 ^



3eaca808 ^


a90faae9 ^

3d8b137c ^
a90faae9 ^
4a48bedc ^
a90faae9 ^



06ef635e ^
a90faae9 ^


1521e4e3 ^
a90faae9 ^
a90faae9 ^

3d8b137c ^
a90faae9 ^
4a48bedc ^
a90faae9 ^
ace7ffb7 ^





a90faae9 ^
3d8b137c ^
a90faae9 ^
3d8b137c ^
a90faae9 ^

1521e4e3 ^
a90faae9 ^




9baf76ec ^
6f65d591 ^
a90faae9 ^
9baf76ec ^
a90faae9 ^
9baf76ec ^


a90faae9 ^








9baf76ec ^
6f65d591 ^
a90faae9 ^
9baf76ec ^
a90faae9 ^
9baf76ec ^
a90faae9 ^







9baf76ec ^
6f65d591 ^
a90faae9 ^
9baf76ec ^
a90faae9 ^
9baf76ec ^


a90faae9 ^








9baf76ec ^
6f65d591 ^
a90faae9 ^
9baf76ec ^
a90faae9 ^
9baf76ec ^
a90faae9 ^














9baf76ec ^
6f65d591 ^
a90faae9 ^
9baf76ec ^
a90faae9 ^
9baf76ec ^
a90faae9 ^
















9baf76ec ^
6f65d591 ^
a90faae9 ^
9baf76ec ^
a90faae9 ^
9baf76ec ^
6f65d591 ^

a90faae9 ^











9a81d746 ^
a90faae9 ^

6f65d591 ^
a90faae9 ^
9baf76ec ^
a90faae9 ^

9baf76ec ^


a90faae9 ^



























a90faae9 ^
3d8b137c ^
a90faae9 ^
4a48bedc ^
3d8b137c ^
a90faae9 ^


3d8b137c ^
a90faae9 ^

63513e9f ^
a90faae9 ^


3d8b137c ^
a90faae9 ^
3d8b137c ^
a90faae9 ^

63513e9f ^
a90faae9 ^



3d8b137c ^
a90faae9 ^
63513e9f ^
a90faae9 ^


3d8b137c ^
a90faae9 ^
3d8b137c ^
a90faae9 ^
63513e9f ^
a90faae9 ^

1ead3562 ^
a90faae9 ^


6f65d591 ^
a90faae9 ^
9baf76ec ^
a90faae9 ^

9baf76ec ^


a90faae9 ^















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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464

                                                                          
                                                                        
                              
                    
             
             
              
                                               
                                                

                             


               
                                        
             
                                  
                                                  
       
                    

                         
                                          





                
                  
                                                                                      


                                     
                                      
                                  


                                                                                            


            
                                    

                   

 
                             
                      
                                                               
             
             
                         
                            
                           
                                    





                                                    
                                              


                                                    
                                 
                         

 
                                                               
             
             
                                                     
                   


                                          
             

                                 
                                                       
                           

                         










                                                            







                         


                                                                         
                                                                                                                
             
             
                                     


                                           
                     

                                                                                                  
                   
                     





                                                                       



                                           
                                                           
                        
                                 


                                                                              
                                                  
                                 
                                                    
                             
                                
     
                                     


                                           
                                          


                                  
                                                    
                                   
                                                                 
                                    

                                    

                                         
                                    



                                               

                       
                          



                                                                          
                                           

                            
                                                   
                                       



                                               
                          
     
                          

                     



                                   
                                                       

                                                        




                                                                                
                               


                                
   



                                                             


                                

 
                                                                                                    
             
             



                                                        
          


                                           
                                
                                               

 
                                                                                           
             
             
                   





                                                        
                                         
                                           
   
                                                                    

                                           
                                  




                     
                                       
             
                                 
                    
    


                                             








                         
                                 
             
                                 
                                                 
       
                    







                         
                                                 
             
                                 
                    
    


                                             








                         
                                  
             
                                 
                                                     
       
                    














                                           
                                         
             
                                 
                                                   
       
                    
















                                                                            
                                 
             
                                 
                                              
       
                    

                                             











                           
                                 

                                 
             
                                 
                    

    


                                             



























                                                
                                                                           
                                              
             
             
                                              


                                                                     
                                           

                                                
                       


                                                                         
                                                    
                               
                                               

                                                 
                  



                                                                                  
                                              
                                     
                


                                                                      
                                            
                              
                                                
                                   
                  

                       
              


                                   
             
                                 
                    

      


                                             















                                         
## the basic editor data structure, and how it displays text to the screen

# temporary main for this layer: just render the given text at the given
# screen dimensions, then stop
def main text:text [
  local-scope
  load-inputs
  open-console
  clear-screen null/screen  # non-scrolling app
  e:&:editor <- new-editor text, 0/left, 5/right
  render null/screen, e
  wait-for-event null/console
  close-console
]

scenario editor-renders-text-to-screen [
  local-scope
  assume-screen 10/width, 5/height
  e:&:editor <- new-editor [abc], 0/left, 10/right
  run [
    render screen, e
  ]
  screen-should-contain [
    # top line of screen reserved for menu
    .          .
    .abc       .
    .          .
  ]
]

container editor [
  # editable text: doubly linked list of characters (head contains a special sentinel)
  data:&:duplex-list:char
  top-of-screen:&:duplex-list:char
  bottom-of-screen:&:duplex-list:char
  # location before cursor inside data
  before-cursor:&:duplex-list:char

  # raw bounds of display area on screen
  # always displays from row 1 (leaving row 0 for a menu) and at most until bottom of screen
  left:num
  right:num
  bottom:num
  # raw screen coordinates of cursor
  cursor-row:num
  cursor-column:num
]

# creates a new editor widget
#   right is exclusive
def new-editor s:text, left:num, right:num -> result:&:editor [
  local-scope
  load-inputs
  # no clipping of bounds
  right <- subtract right, 1
  result <- new editor:type
  # initialize screen-related fields
  *result <- put *result, left:offset, left
  *result <- put *result, right:offset, right
  # initialize cursor coordinates
  *result <- put *result, cursor-row:offset, 1/top
  *result <- put *result, cursor-column:offset, left
  # initialize empty contents
  init:&:duplex-list:char <- push 167/§, null
  *result <- put *result, data:offset, init
  *result <- put *result, top-of-screen:offset, init
  *result <- put *result, before-cursor:offset, init
  result <- insert-text result, s
  <editor-initialization>
]

def insert-text editor:&:editor, text:text -> editor:&:editor [
  local-scope
  load-inputs
  curr:&:duplex-list:char <- get *editor, data:offset
  insert curr, text
]

scenario editor-initializes-without-data [
  local-scope
  assume-screen 5/width, 3/height
  run [
    e:&:editor <- new-editor null/data, 2/left, 5/right
    1:editor/raw <- copy *e
  ]
  memory-should-contain [
    # 1,2 (data) <- just the § sentinel
    # 3,4 (top of screen) <- the § sentinel
    # 5 (bottom of screen) <- null since text fits on screen
    5 <- 0
    6 <- 0
    # 7,8 (before cursor) <- the § sentinel
    9 <- 2  # left
    10 <- 4  # right  (inclusive)
    11 <- 0  # bottom (not set until render)
    12 <- 1  # cursor row
    13 <- 2  # cursor column
  ]
  screen-should-contain [
    .     .
    .     .
    .     .
  ]
]

# Assumes cursor should be at coordinates (cursor-row, cursor-column) and
# updates before-cursor to match. Might also move coordinates if they're
# outside text.
def render screen:&:screen, editor:&:editor -> last-row:num, last-column:num, screen:&:screen, editor:&:editor [
  local-scope
  load-inputs
  return-unless editor, 1/top, 0/left
  left:num <- get *editor, left:offset
  screen-height:num <- screen-height screen
  right:num <- get *editor, right:offset
  # traversing editor
  curr:&:duplex-list:char <- get *editor, top-of-screen:offset
  prev:&:duplex-list:char <- copy curr  # just in case curr becomes null and we can't compute prev
  curr <- next curr
  # traversing screen
  color:num <- copy 7/white
  row:num <- copy 1/top
  column:num <- copy left
  cursor-row:num <- get *editor, cursor-row:offset
  cursor-column:num <- get *editor, cursor-column:offset
  before-cursor:&:duplex-list:char <- get *editor, before-cursor:offset
  screen <- move-cursor screen, row, column
  {
    +next-character
    break-unless curr
    off-screen?:bool <- greater-or-equal row, screen-height
    break-if off-screen?
    # update editor.before-cursor
    # Doing so at the start of each iteration ensures it stays one step behind
    # the current character.
    {
      at-cursor-row?:bool <- equal row, cursor-row
      break-unless at-cursor-row?
      at-cursor?:bool <- equal column, cursor-column
      break-unless at-cursor?
      before-cursor <- copy prev
    }
    c:char <- get *curr, value:offset
    <character-c-received>
    {
      # newline? move to left rather than 0
      newline?:bool <- equal c, 10/newline
      break-unless newline?
      # adjust cursor if necessary
      {
        at-cursor-row?:bool <- equal row, cursor-row
        break-unless at-cursor-row?
        left-of-cursor?:bool <- lesser-than column, cursor-column
        break-unless left-of-cursor?
        cursor-column <- copy column
        before-cursor <- prev curr
      }
      # clear rest of line in this window
      clear-line-until screen, right
      # skip to next line
      row <- add row, 1
      column <- copy left
      screen <- move-cursor screen, row, column
      curr <- next curr
      prev <- next prev
      loop +next-character
    }
    {
      # at right? wrap. even if there's only one more letter left; we need
      # room for clicking on the cursor after it.
      at-right?:bool <- equal column, right
      break-unless at-right?
      # print wrap icon
      wrap-icon:char <- copy 8617/loop-back-to-left
      print screen, wrap-icon, 245/grey
      column <- copy left
      row <- add row, 1
      screen <- move-cursor screen, row, column
      # don't increment curr
      loop +next-character
    }
    print screen, c, color
    curr <- next curr
    prev <- next prev
    column <- add column, 1
    loop
  }
  # save first character off-screen
  *editor <- put *editor, bottom-of-screen:offset, curr
  # is cursor to the right of the last line? move to end
  {
    at-cursor-row?:bool <- equal row, cursor-row
    cursor-outside-line?:bool <- lesser-or-equal column, cursor-column
    before-cursor-on-same-line?:bool <- and at-cursor-row?, cursor-outside-line?
    above-cursor-row?:bool <- lesser-than row, cursor-row
    before-cursor?:bool <- or before-cursor-on-same-line?, above-cursor-row?
    break-unless before-cursor?
    cursor-row <- copy row
    cursor-column <- copy column
    before-cursor <- copy prev
  }
  *editor <- put *editor, bottom:offset, row
  *editor <- put *editor, cursor-row:offset, cursor-row
  *editor <- put *editor, cursor-column:offset, cursor-column
  *editor <- put *editor, before-cursor:offset, before-cursor
  clear-line-until screen, right
  row <- add row, 1
  return row, left/column
]

def clear-screen-from screen:&:screen, row:num, column:num, left:num, right:num -> screen:&:screen [
  local-scope
  load-inputs
  # if it's the real screen, use the optimized primitive
  {
    break-if screen
    clear-display-from row, column, left, right
    return
  }
  # if not, go the slower route
  screen <- move-cursor screen, row, column
  clear-line-until screen, right
  clear-rest-of-screen screen, row, left, right
]

def clear-rest-of-screen screen:&:screen, row:num, left:num, right:num -> screen:&:screen [
  local-scope
  load-inputs
  row <- add row, 1
  # if it's the real screen, use the optimized primitive
  {
    break-if screen
    clear-display-from row, left, left, right
    return
  }
  screen <- move-cursor screen, row, left
  screen-height:num <- screen-height screen
  {
    at-bottom-of-screen?:bool <- greater-or-equal row, screen-height
    break-if at-bottom-of-screen?
    screen <- move-cursor screen, row, left
    clear-line-until screen, right
    row <- add row, 1
    loop
  }
]

scenario editor-prints-multiple-lines [
  local-scope
  assume-screen 5/width, 5/height
  s:text <- new [abc
def]
  e:&:editor <- new-editor s, 0/left, 5/right
  run [
    render screen, e
  ]
  screen-should-contain [
    .     .
    .abc  .
    .def  .
    .     .
  ]
]

scenario editor-handles-offsets [
  local-scope
  assume-screen 5/width, 5/height
  e:&:editor <- new-editor [abc], 1/left, 5/right
  run [
    render screen, e
  ]
  screen-should-contain [
    .     .
    . abc .
    .     .
  ]
]

scenario editor-prints-multiple-lines-at-offset [
  local-scope
  assume-screen 5/width, 5/height
  s:text <- new [abc
def]
  e:&:editor <- new-editor s, 1/left, 5/right
  run [
    render screen, e
  ]
  screen-should-contain [
    .     .
    . abc .
    . def .
    .     .
  ]
]

scenario editor-wraps-long-lines [
  local-scope
  assume-screen 5/width, 5/height
  e:&:editor <- new-editor [abc def], 0/left, 5/right
  run [
    render screen, e
  ]
  screen-should-contain [
    .     .
    .abc .
    .def  .
    .     .
  ]
  screen-should-contain-in-color 245/grey [
    .     .
    .    .
    .     .
    .     .
  ]
]

scenario editor-wraps-barely-long-lines [
  local-scope
  assume-screen 5/width, 5/height
  e:&:editor <- new-editor [abcde], 0/left, 5/right
  run [
    render screen, e
  ]
  # still wrap, even though the line would fit. We need room to click on the
  # end of the line
  screen-should-contain [
    .     .
    .abcd.
    .e    .
    .     .
  ]
  screen-should-contain-in-color 245/grey [
    .     .
    .    .
    .     .
    .     .
  ]
]

scenario editor-with-empty-text [
  local-scope
  assume-screen 5/width, 5/height
  e:&:editor <- new-editor [], 0/left, 5/right
  run [
    render screen, e
    3:num/raw <- get *e, cursor-row:offset
    4:num/raw <- get *e, cursor-column:offset
  ]
  screen-should-contain [
    .     .
    .     .
    .     .
  ]
  memory-should-contain [
    3 <- 1  # cursor row
    4 <- 0  # cursor column
  ]
]

# just a little color for Mu code

scenario render-colors-comments [
  local-scope
  assume-screen 5/width, 5/height
  s:text <- new [abc
# de
f]
  e:&:editor <- new-editor s, 0/left, 5/right
  run [
    render screen, e
  ]
  screen-should-contain [
    .     .
    .abc  .
    .# de .
    .f    .
    .     .
  ]
  screen-should-contain-in-color 12/lightblue, [
    .     .
    .     .
    .# de .
    .     .
    .     .
  ]
  screen-should-contain-in-color 7/white, [
    .     .
    .abc  .
    .     .
    .f    .
    .     .
  ]
]

after <character-c-received> [
  color <- get-color color, c
]

# so far the previous color is all the information we need; that may change
def get-color color:num, c:char -> color:num [
  local-scope
  load-inputs
  color-is-white?:bool <- equal color, 7/white
  # if color is white and next character is '#', switch color to blue
  {
    break-unless color-is-white?
    starting-comment?:bool <- equal c, 35/#
    break-unless starting-comment?
    trace 90, [app], [switch color back to blue]
    return 12/lightblue
  }
  # if color is blue and next character is newline, switch color to white
  {
    color-is-blue?:bool <- equal color, 12/lightblue
    break-unless color-is-blue?
    ending-comment?:bool <- equal c, 10/newline
    break-unless ending-comment?
    trace 90, [app], [switch color back to white]
    return 7/white
  }
  # if color is white (no comments) and next character is '<', switch color to red
  {
    break-unless color-is-white?
    starting-assignment?:bool <- equal c, 60/<
    break-unless starting-assignment?
    return 1/red
  }
  # if color is red and next character is space, switch color to white
  {
    color-is-red?:bool <- equal color, 1/red
    break-unless color-is-red?
    ending-assignment?:bool <- equal c, 32/space
    break-unless ending-assignment?
    return 7/white
  }
  # otherwise no change
  return color
]

scenario render-colors-assignment [
  local-scope
  assume-screen 8/width, 5/height
  s:text <- new [abc
d <- e
f]
  e:&:editor <- new-editor s, 0/left, 8/right
  run [
    render screen, e
  ]
  screen-should-contain [
    .        .
    .abc     .
    .d <- e  .
    .f       .
    .        .
  ]
  screen-should-contain-in-color 1/red, [
    .        .
    .        .
    .  <-    .
    .        .
    .        .
  ]
]