From d009e158803956c76adbf8f58a62884c3e7affb3 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Tue, 26 Jan 2016 23:47:23 -0800 Subject: 2605 --- html/edit/001-editor.mu.html | 102 ++++++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 45 deletions(-) (limited to 'html/edit/001-editor.mu.html') diff --git a/html/edit/001-editor.mu.html b/html/edit/001-editor.mu.html index 11d1cb9d..ec683ce7 100644 --- a/html/edit/001-editor.mu.html +++ b/html/edit/001-editor.mu.html @@ -37,7 +37,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } # temporary main for this layer: just render the given text at the given # screen dimensions, then stop -recipe! main text:address:array:character [ +recipe! main text:address:shared:array:character [ local-scope load-ingredients open-console @@ -51,8 +51,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-initially-prints-text-to-screen [ assume-screen 10/width, 5/height run [ - 1:address:array:character <- new [abc] - new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right + 1:address:shared:array:character <- new [abc] + new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right ] screen-should-contain [ # top line of screen reserved for menu @@ -64,16 +64,17 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } container editor-data [ # editable text: doubly linked list of characters (head contains a special sentinel) - data:address:duplex-list:character - top-of-screen:address:duplex-list:character - bottom-of-screen:address:duplex-list:character + data:address:shared:duplex-list:character + top-of-screen:address:shared:duplex-list:character + bottom-of-screen:address:shared:duplex-list:character # location before cursor inside data - before-cursor:address:duplex-list:character + before-cursor:address:shared:duplex-list:character # 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:number right:number + bottom:number # raw screen coordinates of cursor cursor-row:number cursor-column:number @@ -82,7 +83,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } # creates a new editor widget and renders its initial appearance to screen # top/left/right constrain the screen area available to the new editor # right is exclusive -recipe new-editor s:address:array:character, screen:address:screen, left:number, right:number -> result:address:editor-data, screen:address:screen [ +recipe new-editor s:address:shared:array:character, screen:address:shared:screen, left:number, right:number -> result:address:shared:editor-data, screen:address:shared:screen [ local-scope load-ingredients # no clipping of bounds @@ -98,11 +99,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } *x <- copy 1/top x <- get-address *result, cursor-column:offset *x <- copy left - init:address:address:duplex-list:character <- get-address *result, data:offset + init:address:address:shared:duplex-list:character <- get-address *result, data:offset *init <- push 167/§, 0/tail - top-of-screen:address:address:duplex-list:character <- get-address *result, top-of-screen:offset + top-of-screen:address:address:shared:duplex-list:character <- get-address *result, top-of-screen:offset *top-of-screen <- copy *init - y:address:address:duplex-list:character <- get-address *result, before-cursor:offset + y:address:address:shared:duplex-list:character <- get-address *result, before-cursor:offset *y <- copy *init result <- insert-text result, s # initialize cursor to top of screen @@ -113,7 +114,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <editor-initialization> ] -recipe insert-text editor:address:editor-data, text:address:array:character -> editor:address:editor-data [ +recipe insert-text editor:address:shared:editor-data, text:address:shared:array:character -> editor:address:shared:editor-data [ local-scope load-ingredients # early exit if text is empty @@ -122,7 +123,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } reply-unless len, editor/same-as-ingredient:0 idx:number <- copy 0 # now we can start appending the rest, character by character - curr:address:duplex-list:character <- get *editor, data:offset + curr:address:shared:duplex-list:character <- get *editor, data:offset { done?:boolean <- greater-or-equal idx, len break-if done? @@ -139,8 +140,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-initializes-without-data [ assume-screen 5/width, 3/height run [ - 1:address:editor-data <- new-editor 0/data, screen:address:screen, 2/left, 5/right - 2:editor-data <- copy *1:address:editor-data + 1:address:shared:editor-data <- new-editor 0/data, screen:address:shared:screen, 2/left, 5/right + 2:editor-data <- copy *1:address:shared:editor-data ] memory-should-contain [ # 2 (data) <- just the § sentinel @@ -149,8 +150,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } # 5 (before cursor) <- the § sentinel 6 <- 2 # left 7 <- 4 # right (inclusive) - 8 <- 1 # cursor row - 9 <- 2 # cursor column + 8 <- 1 # bottom + 9 <- 1 # cursor row + 10 <- 2 # cursor column ] screen-should-contain [ . . @@ -162,7 +164,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } # 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. -recipe render screen:address:screen, editor:address:editor-data -> last-row:number, last-column:number, screen:address:screen, editor:address:editor-data [ +recipe render screen:address:shared:screen, editor:address:shared:editor-data -> last-row:number, last-column:number, screen:address:shared:screen, editor:address:shared:editor-data [ local-scope load-ingredients reply-unless editor, 1/top, 0/left, screen/same-as-ingredient:0, editor/same-as-ingredient:1 @@ -170,8 +172,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } screen-height:number <- screen-height screen right:number <- get *editor, right:offset # traversing editor - curr:address:duplex-list:character <- get *editor, top-of-screen:offset - prev:address:duplex-list:character <- copy curr # just in case curr becomes null and we can't compute prev + curr:address:shared:duplex-list:character <- get *editor, top-of-screen:offset + prev:address:shared:duplex-list:character <- copy curr # just in case curr becomes null and we can't compute prev curr <- next curr # traversing screen +render-loop-initialization @@ -180,7 +182,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } column:number <- copy left cursor-row:address:number <- get-address *editor, cursor-row:offset cursor-column:address:number <- get-address *editor, cursor-column:offset - before-cursor:address:address:duplex-list:character <- get-address *editor, before-cursor:offset + before-cursor:address:address:shared:duplex-list:character <- get-address *editor, before-cursor:offset screen <- move-cursor screen, row, column { +next-character @@ -228,7 +230,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } at-right?:boolean <- equal column, right break-unless at-right? # print wrap icon - print screen, 8617/loop-back-to-left, 245/grey + wrap-icon:character <- 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 @@ -242,7 +245,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } loop } # save first character off-screen - bottom-of-screen:address:address:duplex-list:character <- get-address *editor, bottom-of-screen:offset + bottom-of-screen:address:address:shared:duplex-list:character <- get-address *editor, bottom-of-screen:offset *bottom-of-screen <- copy curr # is cursor to the right of the last line? move to end { @@ -256,22 +259,31 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } *cursor-column <- copy column *before-cursor <- copy prev } + bottom:address:number <- get-address *editor, bottom:offset + *bottom <- copy row reply row, column, screen/same-as-ingredient:0, editor/same-as-ingredient:1 ] -recipe clear-line-delimited screen:address:screen, column:number, right:number -> screen:address:screen [ +recipe clear-line-delimited screen:address:shared:screen, column:number, right:number -> screen:address:shared:screen [ local-scope load-ingredients + space:character <- copy 32/space + bg-color:number, bg-color-found?:boolean <- next-ingredient + { + # default bg-color to black + break-if bg-color-found? + bg-color <- copy 0/black + } { done?:boolean <- greater-than column, right break-if done? - screen <- print screen, 32/space + screen <- print screen, space, 7/white, bg-color # foreground color is mostly unused except if the cursor shows up at this cell column <- add column, 1 loop } ] -recipe clear-screen-from screen:address:screen, row:number, column:number, left:number, right:number -> screen:address:screen [ +recipe clear-screen-from screen:address:shared:screen, row:number, column:number, left:number, right:number -> screen:address:shared:screen [ local-scope load-ingredients # if it's the real screen, use the optimized primitive @@ -287,7 +299,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } reply screen/same-as-ingredient:0 ] -recipe clear-rest-of-screen screen:address:screen, row:number, left:number, right:number -> screen:address:screen [ +recipe clear-rest-of-screen screen:address:shared:screen, row:number, left:number, right:number -> screen:address:shared:screen [ local-scope load-ingredients row <- add row, 1 @@ -306,9 +318,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-initially-prints-multiple-lines [ assume-screen 5/width, 5/height run [ - s:address:array:character <- new [abc + s:address:shared:array:character <- new [abc def] - new-editor s:address:array:character, screen:address:screen, 0/left, 5/right + new-editor s:address:shared:array:character, screen:address:shared:screen, 0/left, 5/right ] screen-should-contain [ . . @@ -321,8 +333,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-initially-handles-offsets [ assume-screen 5/width, 5/height run [ - s:address:array:character <- new [abc] - new-editor s:address:array:character, screen:address:screen, 1/left, 5/right + s:address:shared:array:character <- new [abc] + new-editor s:address:shared:array:character, screen:address:shared:screen, 1/left, 5/right ] screen-should-contain [ . . @@ -334,9 +346,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-initially-prints-multiple-lines-at-offset [ assume-screen 5/width, 5/height run [ - s:address:array:character <- new [abc + s:address:shared:array:character <- new [abc def] - new-editor s:address:array:character, screen:address:screen, 1/left, 5/right + new-editor s:address:shared:array:character, screen:address:shared:screen, 1/left, 5/right ] screen-should-contain [ . . @@ -349,8 +361,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-initially-wraps-long-lines [ assume-screen 5/width, 5/height run [ - s:address:array:character <- new [abc def] - new-editor s:address:array:character, screen:address:screen, 0/left, 5/right + s:address:shared:array:character <- new [abc def] + new-editor s:address:shared:array:character, screen:address:shared:screen, 0/left, 5/right ] screen-should-contain [ . . @@ -369,8 +381,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-initially-wraps-barely-long-lines [ assume-screen 5/width, 5/height run [ - s:address:array:character <- new [abcde] - new-editor s:address:array:character, screen:address:screen, 0/left, 5/right + s:address:shared:array:character <- new [abcde] + new-editor s:address:shared:array:character, screen:address:shared:screen, 0/left, 5/right ] # still wrap, even though the line would fit. We need room to click on the # end of the line @@ -391,10 +403,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-initializes-empty-text [ assume-screen 5/width, 5/height run [ - 1:address:array:character <- new [] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 5/right - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 1:address:shared:array:character <- new [] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 5/right + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] screen-should-contain [ . . @@ -412,10 +424,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario render-colors-comments [ assume-screen 5/width, 5/height run [ - s:address:array:character <- new [abc + s:address:shared:array:character <- new [abc # de f] - new-editor s:address:array:character, screen:address:screen, 0/left, 5/right + new-editor s:address:shared:array:character, screen:address:shared:screen, 0/left, 5/right ] screen-should-contain [ . . @@ -493,10 +505,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario render-colors-assignment [ assume-screen 8/width, 5/height run [ - s:address:array:character <- new [abc + s:address:shared:array:character <- new [abc d <- e f] - new-editor s:address:array:character, screen:address:screen, 0/left, 8/right + new-editor s:address:shared:array:character, screen:address:shared:screen, 0/left, 8/right ] screen-should-contain [ . . -- cgit 1.4.1-2-gfad0