diff options
Diffstat (limited to 'html/edit')
-rw-r--r-- | html/edit/001-editor.mu.html | 14 | ||||
-rw-r--r-- | html/edit/002-typing.mu.html | 6 | ||||
-rw-r--r-- | html/edit/003-shortcuts.mu.html | 8 | ||||
-rw-r--r-- | html/edit/004-programming-environment.mu.html | 162 | ||||
-rw-r--r-- | html/edit/005-sandbox.mu.html | 34 | ||||
-rw-r--r-- | html/edit/008-sandbox-test.mu.html | 8 | ||||
-rw-r--r-- | html/edit/009-sandbox-trace.mu.html | 6 | ||||
-rw-r--r-- | html/edit/010-warnings.mu.html | 91 | ||||
-rw-r--r-- | html/edit/011-editor-undo.mu.html | 4 |
9 files changed, 144 insertions, 189 deletions
diff --git a/html/edit/001-editor.mu.html b/html/edit/001-editor.mu.html index cf10dc6c..59982193 100644 --- a/html/edit/001-editor.mu.html +++ b/html/edit/001-editor.mu.html @@ -35,7 +35,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <pre id='vimCodeElement'> <span class="SalientComment">## the basic editor data structure, and how it displays text to the screen</span> -<span class="Comment"># temporary main for this layer: just render the given string at the given</span> +<span class="Comment"># temporary main for this layer: just render the given text at the given</span> <span class="Comment"># screen dimensions, then stop</span> <span class="muRecipe">recipe!</span> main text:address:array:character [ <span class="Constant">local-scope</span> @@ -48,7 +48,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } close-console ] -<span class="muScenario">scenario</span> editor-initially-prints-string-to-screen [ +<span class="muScenario">scenario</span> editor-initially-prints-text-to-screen [ assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> run [ <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> @@ -82,7 +82,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Comment"># creates a new editor widget and renders its initial appearance to screen</span> <span class="Comment"># top/left/right constrain the screen area available to the new editor</span> <span class="Comment"># right is exclusive</span> -<span class="muRecipe">recipe</span> new-editor s:address:array:character, screen:address:screen, left:number, right:number<span class="muRecipe"> -> </span>result:address:editor-data [ +<span class="muRecipe">recipe</span> new-editor s:address:array:character, screen:address:screen, left:number, right:number<span class="muRecipe"> -> </span>result:address:editor-data, screen:address:screen [ <span class="Constant">local-scope</span> <span class="Constant">load-ingredients</span> <span class="Comment"># no clipping of bounds</span> @@ -228,14 +228,14 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } at-right?:boolean<span class="Special"> <- </span>equal column, right <span class="muControl">break-unless</span> at-right? <span class="Comment"># print wrap icon</span> - print-character screen, <span class="Constant">8617/loop-back-to-left</span>, <span class="Constant">245/grey</span> + print screen, <span class="Constant">8617/loop-back-to-left</span>, <span class="Constant">245/grey</span> column<span class="Special"> <- </span>copy left row<span class="Special"> <- </span>add row, <span class="Constant">1</span> screen<span class="Special"> <- </span>move-cursor screen, row, column <span class="Comment"># don't increment curr</span> <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> <span class="Delimiter">}</span> - print-character screen, c, color + print screen, c, color curr<span class="Special"> <- </span>next curr prev<span class="Special"> <- </span>next prev column<span class="Special"> <- </span>add column, <span class="Constant">1</span> @@ -259,13 +259,13 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muControl">reply</span> row, column, screen/same-as-ingredient:<span class="Constant">0</span>, editor/same-as-ingredient:<span class="Constant">1</span> ] -<span class="muRecipe">recipe</span> clear-line-delimited screen:address:screen, column:number, right:number [ +<span class="muRecipe">recipe</span> clear-line-delimited screen:address:screen, column:number, right:number<span class="muRecipe"> -> </span>screen:address:screen [ <span class="Constant">local-scope</span> <span class="Constant">load-ingredients</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>greater-than column, right <span class="muControl">break-if</span> done? - print-character screen, <span class="Constant">32/space</span> + screen<span class="Special"> <- </span>print screen, <span class="Constant">32/space</span> column<span class="Special"> <- </span>add column, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> diff --git a/html/edit/002-typing.mu.html b/html/edit/002-typing.mu.html index 538bbf5d..efed71b6 100644 --- a/html/edit/002-typing.mu.html +++ b/html/edit/002-typing.mu.html @@ -259,7 +259,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } overflow?:boolean<span class="Special"> <- </span>and at-bottom?, at-right? <span class="muControl">break-if</span> overflow? move-cursor screen, save-row, save-column - print-character screen, c + print screen, c go-render?<span class="Special"> <- </span>copy <span class="Constant">0/false</span> <span class="muControl">reply</span> <span class="Delimiter">}</span> @@ -281,7 +281,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } currc:character<span class="Special"> <- </span>get *curr, <span class="Constant">value:offset</span> at-newline?:boolean<span class="Special"> <- </span>equal currc, <span class="Constant">10/newline</span> <span class="muControl">break-if</span> at-newline? - print-character screen, currc + print screen, currc curr-column<span class="Special"> <- </span>add curr-column, <span class="Constant">1</span> curr<span class="Special"> <- </span>next curr <span class="muControl">loop</span> @@ -1070,7 +1070,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">{</span> continue?:boolean<span class="Special"> <- </span>lesser-or-equal x, right <span class="Comment"># right is inclusive, to match editor-data semantics</span> <span class="muControl">break-unless</span> continue? - print-character screen, style, color, bg-color + print screen, style, color, bg-color x<span class="Special"> <- </span>add x, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> diff --git a/html/edit/003-shortcuts.mu.html b/html/edit/003-shortcuts.mu.html index aabe23e0..5518a680 100644 --- a/html/edit/003-shortcuts.mu.html +++ b/html/edit/003-shortcuts.mu.html @@ -152,13 +152,13 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } currc:character<span class="Special"> <- </span>get *curr, <span class="Constant">value:offset</span> at-newline?:boolean<span class="Special"> <- </span>equal currc, <span class="Constant">10/newline</span> <span class="muControl">break-if</span> at-newline? - screen<span class="Special"> <- </span>print-character screen, currc + screen<span class="Special"> <- </span>print screen, currc curr-column<span class="Special"> <- </span>add curr-column, <span class="Constant">1</span> curr<span class="Special"> <- </span>next curr <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># we're guaranteed not to be at the right margin</span> - screen<span class="Special"> <- </span>print-character screen, <span class="Constant">32/space</span> + screen<span class="Special"> <- </span>print screen, <span class="Constant">32/space</span> go-render?<span class="Special"> <- </span>copy <span class="Constant">0/false</span> ] @@ -392,13 +392,13 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } currc:character<span class="Special"> <- </span>get *curr, <span class="Constant">value:offset</span> at-newline?:boolean<span class="Special"> <- </span>equal currc, <span class="Constant">10/newline</span> <span class="muControl">break-if</span> at-newline? - screen<span class="Special"> <- </span>print-character screen, currc + screen<span class="Special"> <- </span>print screen, currc curr-column<span class="Special"> <- </span>add curr-column, <span class="Constant">1</span> curr<span class="Special"> <- </span>next curr <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># we're guaranteed not to be at the right margin</span> - screen<span class="Special"> <- </span>print-character screen, <span class="Constant">32/space</span> + screen<span class="Special"> <- </span>print screen, <span class="Constant">32/space</span> go-render?<span class="Special"> <- </span>copy <span class="Constant">0/false</span> ] diff --git a/html/edit/004-programming-environment.mu.html b/html/edit/004-programming-environment.mu.html index 172b1dcc..a2001520 100644 --- a/html/edit/004-programming-environment.mu.html +++ b/html/edit/004-programming-environment.mu.html @@ -20,7 +20,6 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .SalientComment { color: #00ffff; } -.CommentedCode { color: #6c6c6c; } .Delimiter { color: #a04060; } .muScenario { color: #00af00; } --> @@ -70,7 +69,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } assert button-on-screen?, <span class="Constant">[screen too narrow for menu]</span> screen<span class="Special"> <- </span>move-cursor screen, <span class="Constant">0/row</span>, button-start run-button:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ run (F4) ]</span> - print-string screen, run-button, <span class="Constant">255/white</span>, <span class="Constant">161/reddish</span> + print screen, run-button, <span class="Constant">255/white</span>, <span class="Constant">161/reddish</span> <span class="Comment"># dotted line down the middle</span> divider:number, _<span class="Special"> <- </span>divide-with-remainder width, <span class="Constant">2</span> draw-vertical screen, divider, <span class="Constant">1/top</span>, height, <span class="Constant">9482/vertical-dotted</span> @@ -303,7 +302,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } ] <span class="Comment"># show the cursor at the right window</span> run [ - print-character screen:address:screen, <span class="Constant">9251/␣/cursor</span> + print screen:address:screen, <span class="Constant">9251/␣/cursor</span> ] screen-should-contain [ <span class="Constant"> . run (F4) .</span> @@ -343,7 +342,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } assume-console <span class="Constant">[]</span> run [ event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data - print-character screen:address:screen, <span class="Constant">9251/␣/cursor</span> + print screen:address:screen, <span class="Constant">9251/␣/cursor</span> ] <span class="Comment"># is cursor at the right place?</span> screen-should-contain [ @@ -358,7 +357,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } ] run [ event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data - print-character screen:address:screen, <span class="Constant">9251/␣/cursor</span> + print screen:address:screen, <span class="Constant">9251/␣/cursor</span> ] <span class="Comment"># cursor should still be right</span> screen-should-contain [ @@ -392,7 +391,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } ] run [ event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data - print-character screen:address:screen, <span class="Constant">9251/␣/cursor</span> + print screen:address:screen, <span class="Constant">9251/␣/cursor</span> ] <span class="Comment"># cursor moves to end of old line</span> screen-should-contain [ @@ -417,7 +416,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } assert button-on-screen?, <span class="Constant">[screen too narrow for menu]</span> screen<span class="Special"> <- </span>move-cursor screen, <span class="Constant">0/row</span>, button-start run-button:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ run (F4) ]</span> - print-string screen, run-button, <span class="Constant">255/white</span>, <span class="Constant">161/reddish</span> + print screen, run-button, <span class="Constant">255/white</span>, <span class="Constant">161/reddish</span> <span class="Comment"># dotted line down the middle</span> trace <span class="Constant">11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render divider]</span> divider:number, _<span class="Special"> <- </span>divide-with-remainder width, <span class="Constant">2</span> @@ -486,9 +485,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } screen<span class="Special"> <- </span>move-cursor screen, cursor-row, cursor-column ] -<span class="Comment"># print a string 's' to 'editor' in 'color' starting at 'row'</span> +<span class="Comment"># print a text 's' to 'editor' in 'color' starting at 'row'</span> <span class="Comment"># clear rest of last line, move cursor to next line</span> -<span class="muRecipe">recipe</span> render-string screen:address:screen, s:address:array:character, left:number, right:number, color:number, row:number<span class="muRecipe"> -> </span>row:number, screen:address:screen [ +<span class="muRecipe">recipe</span> render screen:address:screen, s:address:array:character, left:number, right:number, color:number, row:number<span class="muRecipe"> -> </span>row:number, screen:address:screen [ <span class="Constant">local-scope</span> <span class="Constant">load-ingredients</span> <span class="muControl">reply-unless</span> s @@ -509,7 +508,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } at-right?:boolean<span class="Special"> <- </span>equal column, right <span class="muControl">break-unless</span> at-right? <span class="Comment"># print wrap icon</span> - print-character screen, <span class="Constant">8617/loop-back-to-left</span>, <span class="Constant">245/grey</span> + print screen, <span class="Constant">8617/loop-back-to-left</span>, <span class="Constant">245/grey</span> column<span class="Special"> <- </span>copy left row<span class="Special"> <- </span>add row, <span class="Constant">1</span> screen<span class="Special"> <- </span>move-cursor screen, row, column @@ -524,7 +523,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>greater-than column, right <span class="muControl">break-if</span> done? - print-character screen, <span class="Constant">32/space</span> + print screen, <span class="Constant">32/space</span> column<span class="Special"> <- </span>add column, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> @@ -533,7 +532,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } screen<span class="Special"> <- </span>move-cursor screen, row, column <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> <span class="Delimiter">}</span> - print-character screen, c, color + print screen, c, color column<span class="Special"> <- </span>add column, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> @@ -546,8 +545,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } move-cursor screen, row, left ] -<span class="Comment"># like 'render-string' but with colorization for comments like in the editor</span> -<span class="muRecipe">recipe</span> render-code-string screen:address:screen, s:address:array:character, left:number, right:number, row:number<span class="muRecipe"> -> </span>row:number, screen:address:screen [ +<span class="Comment"># like 'render' for texts, but with colorization for comments like in the editor</span> +<span class="muRecipe">recipe</span> render-code screen:address:screen, s:address:array:character, left:number, right:number, row:number<span class="muRecipe"> -> </span>row:number, screen:address:screen [ <span class="Constant">local-scope</span> <span class="Constant">load-ingredients</span> <span class="muControl">reply-unless</span> s @@ -564,13 +563,13 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } done?<span class="Special"> <- </span>greater-or-equal row, screen-height <span class="muControl">break-if</span> done? c:character<span class="Special"> <- </span>index *s, i - <span class="Constant"><character-c-received></span> <span class="Comment"># only line different from render-string</span> + <span class="Constant"><character-c-received></span> <span class="Comment"># only line different from render</span> <span class="Delimiter">{</span> <span class="Comment"># at right? wrap.</span> at-right?:boolean<span class="Special"> <- </span>equal column, right <span class="muControl">break-unless</span> at-right? <span class="Comment"># print wrap icon</span> - print-character screen, <span class="Constant">8617/loop-back-to-left</span>, <span class="Constant">245/grey</span> + print screen, <span class="Constant">8617/loop-back-to-left</span>, <span class="Constant">245/grey</span> column<span class="Special"> <- </span>copy left row<span class="Special"> <- </span>add row, <span class="Constant">1</span> screen<span class="Special"> <- </span>move-cursor screen, row, column @@ -585,7 +584,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>greater-than column, right <span class="muControl">break-if</span> done? - print-character screen, <span class="Constant">32/space</span> + print screen, <span class="Constant">32/space</span> column<span class="Special"> <- </span>add column, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> @@ -594,7 +593,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } screen<span class="Special"> <- </span>move-cursor screen, row, column <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> <span class="Delimiter">}</span> - print-character screen, c, color + print screen, c, color column<span class="Special"> <- </span>add column, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> @@ -632,131 +631,6 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">}</span> ] -<span class="Comment"># ctrl-x - maximize/unmaximize the side with focus</span> - -<span class="muScenario">scenario</span> maximize-side [ - trace-until <span class="Constant">100/app</span> <span class="Comment"># trace too long</span> - assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span> - <span class="Comment"># initialize both halves of screen</span> - <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[def]</span> - <span class="Constant">3</span>:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address:screen, <span class="Constant">1</span>:address:array:character, <span class="Constant">2</span>:address:array:character - screen<span class="Special"> <- </span>render-all screen, <span class="Constant">3</span>:address:programming-environment-data - screen-should-contain [ - <span class="Constant"> . run (F4) .</span> - <span class="Constant"> .abc ┊def .</span> -<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span> - <span class="Constant"> . ┊ .</span> - ] - <span class="Comment"># hit ctrl-x</span> - assume-console [ - press ctrl-x - ] - run [ - event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data - ] - <span class="Comment"># only left side visible</span> - screen-should-contain [ - <span class="Constant"> . run (F4) .</span> - <span class="Constant"> .abc .</span> -<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈.</span> - <span class="Constant"> . .</span> - ] - <span class="Comment"># hit any key to toggle back</span> - assume-console [ - press ctrl-x - ] - run [ - event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data - ] - screen-should-contain [ - <span class="Constant"> . run (F4) .</span> - <span class="Constant"> .abc ┊def .</span> -<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span> - <span class="Constant"> . ┊ .</span> - ] -] - -<span class="CommentedCode">#? # ctrl-t - browse trace</span> -<span class="CommentedCode">#? after <global-type> [</span> -<span class="CommentedCode">#? {</span> -<span class="CommentedCode">#? browse-trace?:boolean <- equal *c, 20/ctrl-t</span> -<span class="CommentedCode">#? break-unless browse-trace?</span> -<span class="CommentedCode">#? $browse-trace</span> -<span class="CommentedCode">#? screen <- render-all screen, env:address:programming-environment-data</span> -<span class="CommentedCode">#? loop +next-event:label</span> -<span class="CommentedCode">#? }</span> -<span class="CommentedCode">#? ]</span> - -<span class="muData">container</span> programming-environment-data [ - maximized?:boolean -] - -<span class="muRecipe">after</span> <span class="Constant"><global-type></span> [ - <span class="Delimiter">{</span> - maximize?:boolean<span class="Special"> <- </span>equal *c, <span class="Constant">24/ctrl-x</span> - <span class="muControl">break-unless</span> maximize? - screen, console<span class="Special"> <- </span>maximize screen, console, env:address:programming-environment-data - <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> - <span class="Delimiter">}</span> -] - -<span class="muRecipe">recipe</span> maximize screen:address:screen, console:address:console, env:address:programming-environment-data<span class="muRecipe"> -> </span>screen:address:screen, console:address:console [ - <span class="Constant">local-scope</span> - <span class="Constant">load-ingredients</span> - hide-screen screen - <span class="Comment"># maximize one of the sides</span> - maximized?:address:boolean<span class="Special"> <- </span>get-address *env, <span class="Constant">maximized?:offset</span> - *maximized?<span class="Special"> <- </span>copy <span class="Constant">1/true</span> - <span class="Comment">#</span> - sandbox-in-focus?:boolean<span class="Special"> <- </span>get *env, <span class="Constant">sandbox-in-focus?:offset</span> - <span class="Delimiter">{</span> - <span class="muControl">break-if</span> sandbox-in-focus? - editor:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">recipes:offset</span> - right:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">right:offset</span> - *right<span class="Special"> <- </span>screen-width screen - *right<span class="Special"> <- </span>subtract *right, <span class="Constant">1</span> - screen<span class="Special"> <- </span>render-recipes screen, env - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> sandbox-in-focus? - editor:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">current-sandbox:offset</span> - left:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">left:offset</span> - *left<span class="Special"> <- </span>copy <span class="Constant">0</span> - screen<span class="Special"> <- </span>render-sandbox-side screen, env - <span class="Delimiter">}</span> - show-screen screen -] - -<span class="Comment"># when maximized, wait for any event and simply unmaximize</span> -<span class="muRecipe">after</span> <span class="Constant"><handle-event></span> [ - <span class="Delimiter">{</span> - maximized?:address:boolean<span class="Special"> <- </span>get-address *env, <span class="Constant">maximized?:offset</span> - <span class="muControl">break-unless</span> *maximized? - *maximized?<span class="Special"> <- </span>copy <span class="Constant">0/false</span> - <span class="Comment"># undo maximize</span> - <span class="Delimiter">{</span> - <span class="muControl">break-if</span> *sandbox-in-focus? - editor:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">recipes:offset</span> - right:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">right:offset</span> - *right<span class="Special"> <- </span>screen-width screen - *right<span class="Special"> <- </span>divide *right, <span class="Constant">2</span> - *right<span class="Special"> <- </span>subtract *right, <span class="Constant">1</span> - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> *sandbox-in-focus? - editor:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">current-sandbox:offset</span> - left:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">left:offset</span> - *left<span class="Special"> <- </span>screen-width screen - *left<span class="Special"> <- </span>divide *left, <span class="Constant">2</span> - *left<span class="Special"> <- </span>add *left, <span class="Constant">1</span> - <span class="Delimiter">}</span> - render-all screen, env - show-screen screen - <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> - <span class="Delimiter">}</span> -] - <span class="SalientComment">## helpers</span> <span class="muRecipe">recipe</span> draw-vertical screen:address:screen, col:number, y:number, bottom:number [ @@ -777,7 +651,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } continue?:boolean<span class="Special"> <- </span>lesser-than y, bottom <span class="muControl">break-unless</span> continue? screen<span class="Special"> <- </span>move-cursor screen, y, col - print-character screen, style, color + print screen, style, color y<span class="Special"> <- </span>add y, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> diff --git a/html/edit/005-sandbox.mu.html b/html/edit/005-sandbox.mu.html index 85fdf7da..9c219526 100644 --- a/html/edit/005-sandbox.mu.html +++ b/html/edit/005-sandbox.mu.html @@ -229,7 +229,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Constant">local-scope</span> <span class="Constant">load-ingredients</span> screen<span class="Special"> <- </span>move-cursor screen, <span class="Constant">0</span>, <span class="Constant">2</span> - screen<span class="Special"> <- </span>print-string screen, msg, color, <span class="Constant">238/grey/background</span> + screen<span class="Special"> <- </span>print screen, msg, color, <span class="Constant">238/grey/background</span> ] <span class="muRecipe">recipe</span> save-sandboxes env:address:programming-environment-data [ @@ -244,12 +244,12 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">{</span> <span class="muControl">break-unless</span> curr data:address:array:character<span class="Special"> <- </span>get *curr, <span class="Constant">data:offset</span> - filename:address:array:character<span class="Special"> <- </span>integer-to-decimal-string idx + filename:address:array:character<span class="Special"> <- </span>to-text idx save filename, data <span class="Delimiter">{</span> expected-response:address:array:character<span class="Special"> <- </span>get *curr, <span class="Constant">expected-response:offset</span> <span class="muControl">break-unless</span> expected-response - filename<span class="Special"> <- </span>string-append filename, suffix + filename<span class="Special"> <- </span>append filename, suffix save filename, expected-response <span class="Delimiter">}</span> idx<span class="Special"> <- </span>add idx, <span class="Constant">1</span> @@ -285,7 +285,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } row<span class="Special"> <- </span>add row, <span class="Constant">1</span> screen<span class="Special"> <- </span>move-cursor screen, row, left clear-line-delimited screen, left, right - print-character screen, <span class="Constant">120/x</span>, <span class="Constant">245/grey</span> + print screen, <span class="Constant">120/x</span>, <span class="Constant">245/grey</span> <span class="Comment"># save menu row so we can detect clicks to it later</span> starting-row:address:number<span class="Special"> <- </span>get-address *sandbox, <span class="Constant">starting-row-on-screen:offset</span> *starting-row<span class="Special"> <- </span>copy row @@ -293,7 +293,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } row<span class="Special"> <- </span>add row, <span class="Constant">1</span> screen<span class="Special"> <- </span>move-cursor screen, row, left sandbox-data:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">data:offset</span> - row, screen<span class="Special"> <- </span>render-code-string screen, sandbox-data, left, right, row + row, screen<span class="Special"> <- </span>render-code screen, sandbox-data, left, right, row code-ending-row:address:number<span class="Special"> <- </span>get-address *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span> *code-ending-row<span class="Special"> <- </span>copy row <span class="Comment"># render sandbox warnings, screen or response, in that order</span> @@ -310,7 +310,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muControl">break-unless</span> empty-screen? *response-starting-row<span class="Special"> <- </span>copy row <span class="Constant"> <render-sandbox-response></span> - row, screen<span class="Special"> <- </span>render-string screen, sandbox-response, left, right, <span class="Constant">245/grey</span>, row + row, screen<span class="Special"> <- </span>render screen, sandbox-response, left, right, <span class="Constant">245/grey</span>, row <span class="Delimiter">}</span> <span class="Constant"> +render-sandbox-end</span> at-bottom?:boolean<span class="Special"> <- </span>greater-or-equal row, screen-height @@ -331,7 +331,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } idx:number<span class="Special"> <- </span>copy <span class="Constant">0</span> curr:address:address:sandbox-data<span class="Special"> <- </span>get-address *env, <span class="Constant">sandbox:offset</span> <span class="Delimiter">{</span> - filename:address:array:character<span class="Special"> <- </span>integer-to-decimal-string idx + filename:address:array:character<span class="Special"> <- </span>to-text idx contents:address:array:character<span class="Special"> <- </span>restore filename <span class="muControl">break-unless</span> contents <span class="Comment"># stop at first error; assuming file didn't exist</span> <span class="Comment"># create new sandbox for file</span> @@ -340,7 +340,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } *data<span class="Special"> <- </span>copy contents <span class="Comment"># restore expected output for sandbox if it exists</span> <span class="Delimiter">{</span> - filename<span class="Special"> <- </span>string-append filename, suffix + filename<span class="Special"> <- </span>append filename, suffix contents<span class="Special"> <- </span>restore filename <span class="muControl">break-unless</span> contents expected-response:address:address:array:character<span class="Special"> <- </span>get-address **curr, <span class="Constant">expected-response:offset</span> @@ -361,7 +361,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muControl">reply-unless</span> sandbox-screen <span class="Comment"># print 'screen:'</span> header:address:array:character<span class="Special"> <- </span>new <span class="Constant">[screen:]</span> - row<span class="Special"> <- </span>render-string screen, header, left, right, <span class="Constant">245/grey</span>, row + row<span class="Special"> <- </span>render screen, header, left, right, <span class="Constant">245/grey</span>, row screen<span class="Special"> <- </span>move-cursor screen, row, left <span class="Comment"># start printing sandbox-screen</span> column:number<span class="Special"> <- </span>copy left @@ -381,9 +381,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } column<span class="Special"> <- </span>copy left screen<span class="Special"> <- </span>move-cursor screen, row, column <span class="Comment"># initial leader for each row: two spaces and a '.'</span> - print-character screen, <span class="Constant">32/space</span>, <span class="Constant">245/grey</span> - print-character screen, <span class="Constant">32/space</span>, <span class="Constant">245/grey</span> - print-character screen, <span class="Constant">46/full-stop</span>, <span class="Constant">245/grey</span> + print screen, <span class="Constant">32/space</span>, <span class="Constant">245/grey</span> + print screen, <span class="Constant">32/space</span>, <span class="Constant">245/grey</span> + print screen, <span class="Constant">46/full-stop</span>, <span class="Constant">245/grey</span> column<span class="Special"> <- </span>add left, <span class="Constant">3</span> <span class="Delimiter">{</span> <span class="Comment"># print row</span> @@ -398,19 +398,19 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muControl">break-unless</span> white? color<span class="Special"> <- </span>copy <span class="Constant">245/grey</span> <span class="Delimiter">}</span> - print-character screen, c, color + print screen, c, color column<span class="Special"> <- </span>add column, <span class="Constant">1</span> i<span class="Special"> <- </span>add i, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># print final '.'</span> - print-character screen, <span class="Constant">46/full-stop</span>, <span class="Constant">245/grey</span> + print screen, <span class="Constant">46/full-stop</span>, <span class="Constant">245/grey</span> column<span class="Special"> <- </span>add column, <span class="Constant">1</span> <span class="Delimiter">{</span> <span class="Comment"># clear rest of current line</span> line-done?:boolean<span class="Special"> <- </span>greater-than column, right <span class="muControl">break-if</span> line-done? - print-character screen, <span class="Constant">32/space</span> + print screen, <span class="Constant">32/space</span> column<span class="Special"> <- </span>add column, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> @@ -514,7 +514,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">{</span> <span class="muControl">break-unless</span> curr c:character<span class="Special"> <- </span>get *curr, <span class="Constant">value:offset</span> - buffer-append buf, c + buf<span class="Special"> <- </span>append buf, c curr<span class="Special"> <- </span>next curr <span class="muControl">loop</span> <span class="Delimiter">}</span> @@ -535,7 +535,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Constant">4</span>:array:character<span class="Special"> <- </span>copy *<span class="Constant">3</span>:address:array:character ] memory-should-contain [ - <span class="Constant">4</span>:string<span class="Special"> <- </span><span class="Constant">[abdefc]</span> + <span class="Constant">4</span>:array:character<span class="Special"> <- </span><span class="Constant">[abdefc]</span> ] ] </pre> diff --git a/html/edit/008-sandbox-test.mu.html b/html/edit/008-sandbox-test.mu.html index 08b62ddc..bdf918e8 100644 --- a/html/edit/008-sandbox-test.mu.html +++ b/html/edit/008-sandbox-test.mu.html @@ -79,7 +79,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } ] <span class="Comment"># cursor should remain unmoved</span> run [ - print-character screen:address:screen, <span class="Constant">9251/␣/cursor</span> + print screen:address:screen, <span class="Constant">9251/␣/cursor</span> ] screen-should-contain [ <span class="Constant"> . run (F4) .</span> @@ -191,14 +191,14 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muControl">break-unless</span> sandbox-response expected-response:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">expected-response:offset</span> <span class="muControl">break-unless</span> expected-response <span class="Comment"># fall-through to print in grey</span> - response-is-expected?:boolean<span class="Special"> <- </span>string-equal expected-response, sandbox-response + response-is-expected?:boolean<span class="Special"> <- </span>equal expected-response, sandbox-response <span class="Delimiter">{</span> <span class="muControl">break-if</span> response-is-expected?:boolean - row, screen<span class="Special"> <- </span>render-string screen, sandbox-response, left, right, <span class="Constant">1/red</span>, row + row, screen<span class="Special"> <- </span>render screen, sandbox-response, left, right, <span class="Constant">1/red</span>, row <span class="Delimiter">}</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> response-is-expected?:boolean - row, screen<span class="Special"> <- </span>render-string screen, sandbox-response, left, right, <span class="Constant">2/green</span>, row + row, screen<span class="Special"> <- </span>render screen, sandbox-response, left, right, <span class="Constant">2/green</span>, row <span class="Delimiter">}</span> <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end:label</span> <span class="Delimiter">}</span> diff --git a/html/edit/009-sandbox-trace.mu.html b/html/edit/009-sandbox-trace.mu.html index 071f62af..6d5603bd 100644 --- a/html/edit/009-sandbox-trace.mu.html +++ b/html/edit/009-sandbox-trace.mu.html @@ -65,7 +65,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } ] run [ event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data - print-character screen:address:screen, <span class="Constant">9251/␣/cursor</span> + print screen:address:screen, <span class="Constant">9251/␣/cursor</span> ] <span class="Comment"># trace now printed and cursor shouldn't have budged</span> screen-should-contain [ @@ -94,7 +94,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } ] run [ event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data - print-character screen:address:screen, <span class="Constant">9251/␣/cursor</span> + print screen:address:screen, <span class="Constant">9251/␣/cursor</span> ] <span class="Comment"># trace hidden again</span> screen-should-contain [ @@ -238,7 +238,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muControl">break-unless</span> display-trace? sandbox-trace:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">trace:offset</span> <span class="muControl">break-unless</span> sandbox-trace <span class="Comment"># nothing to print; move on</span> - row, screen<span class="Special"> <- </span>render-string, screen, sandbox-trace, left, right, <span class="Constant">245/grey</span>, row + row, screen<span class="Special"> <- </span>render screen, sandbox-trace, left, right, <span class="Constant">245/grey</span>, row <span class="Delimiter">}</span> <span class="Constant"> <render-sandbox-trace-done></span> ] diff --git a/html/edit/010-warnings.mu.html b/html/edit/010-warnings.mu.html index 335bfb42..6d746bf5 100644 --- a/html/edit/010-warnings.mu.html +++ b/html/edit/010-warnings.mu.html @@ -20,6 +20,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .SalientComment { color: #00ffff; } +.CommentedCode { color: #6c6c6c; } .Delimiter { color: #a04060; } .muScenario { color: #00af00; } --> @@ -73,7 +74,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">{</span> recipe-warnings:address:array:character<span class="Special"> <- </span>get *env, <span class="Constant">recipe-warnings:offset</span> <span class="muControl">break-unless</span> recipe-warnings - row, screen<span class="Special"> <- </span>render-string screen, recipe-warnings, left, right, <span class="Constant">1/red</span>, row + row, screen<span class="Special"> <- </span>render screen, recipe-warnings, left, right, <span class="Constant">1/red</span>, row <span class="Delimiter">}</span> ] @@ -89,6 +90,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } warnings:address:address:array:character<span class="Special"> <- </span>get-address *sandbox, <span class="Constant">warnings:offset</span> trace:address:address:array:character<span class="Special"> <- </span>get-address *sandbox, <span class="Constant">trace:offset</span> fake-screen:address:address:screen<span class="Special"> <- </span>get-address *sandbox, <span class="Constant">screen:offset</span> +<span class="CommentedCode">#? $print [run-interactive], 10/newline</span> *response, *warnings, *fake-screen, *trace, completed?:boolean<span class="Special"> <- </span>run-interactive data <span class="Delimiter">{</span> <span class="muControl">break-if</span> *warnings @@ -96,6 +98,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } *warnings<span class="Special"> <- </span>new <span class="Constant">[took too long!</span> <span class="Constant">]</span> <span class="Delimiter">}</span> +<span class="CommentedCode">#? $print [done with run-interactive], 10/newline</span> ] <span class="Comment"># make sure we render any trace</span> @@ -104,7 +107,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } sandbox-warnings:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">warnings:offset</span> <span class="muControl">break-unless</span> sandbox-warnings *response-starting-row<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># no response</span> - row, screen<span class="Special"> <- </span>render-string screen, sandbox-warnings, left, right, <span class="Constant">1/red</span>, row + row, screen<span class="Special"> <- </span>render screen, sandbox-warnings, left, right, <span class="Constant">1/red</span>, row <span class="Comment"># don't try to print anything more for this sandbox</span> <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end:label</span> <span class="Delimiter">}</span> @@ -150,6 +153,88 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } ] ] +<span class="muScenario">scenario</span> run-hides-warnings-from-past-sandboxes [ + trace-until <span class="Constant">100/app</span> <span class="Comment"># trace too long</span> + assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[]</span> + <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[get foo, x:offset]</span> <span class="Comment"># invalid</span> + <span class="Constant">3</span>:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address:screen, <span class="Constant">1</span>:address:array:character, <span class="Constant">2</span>:address:array:character + assume-console [ + press F4 <span class="Comment"># generate error</span> + ] + run [ + event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data + ] + assume-console [ + left-click <span class="Constant">3</span>, <span class="Constant">80</span> + press ctrl-k + type <span class="Constant">[add 2, 2]</span> <span class="Comment"># valid code</span> + press F4 <span class="Comment"># error should disappear</span> + ] + run [ + event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data + ] + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> . ┊ .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ x.</span> + <span class="Constant"> . ┊add 2, 2 .</span> + <span class="Constant"> . ┊4 .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] +] + +<span class="muScenario">scenario</span> run-updates-warnings-for-shape-shifting-recipes [ + trace-until <span class="Constant">100/app</span> <span class="Comment"># trace too long</span> + assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span> + <span class="Comment"># define a shape-shifting recipe with an error</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[recipe foo x:_elem -> z:_elem [</span> +<span class="Constant">local-scope</span> +<span class="Constant">load-ingredients</span> +<span class="Constant">z <- add x, [a]</span> +]] + <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[foo 2]</span> + <span class="Constant">3</span>:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address:screen, <span class="Constant">1</span>:address:array:character, <span class="Constant">2</span>:address:array:character + assume-console [ + press F4 + ] + run [ + event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data + ] + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> .recipe foo x:_elem -> z:_elem [ ┊ .</span> + <span class="Constant"> .local-scope ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> .load-ingredients ┊ x.</span> + <span class="Constant"> .z <- add x, [a] ┊foo 2 .</span> + <span class="Constant"> .] ┊foo_2: 'add' requires number ingredients, but go↩.</span> + <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊t [a] .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + <span class="Comment"># now rerun everything</span> + assume-console [ + press F4 + ] + run [ + event-loop screen:address:screen, console:address:console, <span class="Constant">3</span>:address:programming-environment-data + ] + <span class="Comment"># error should remain unchanged</span> + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> .recipe foo x:_elem -> z:_elem [ ┊ .</span> + <span class="Constant"> .local-scope ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> .load-ingredients ┊ x.</span> + <span class="Constant"> .z <- add x, [a] ┊foo 2 .</span> + <span class="Constant"> .] ┊foo_2: 'add' requires number ingredients, but go↩.</span> + <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊t [a] .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] +] + <span class="muScenario">scenario</span> run-shows-missing-type-warnings [ trace-until <span class="Constant">100/app</span> <span class="Comment"># trace too long</span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span> @@ -183,7 +268,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Constant">recipe foo «</span> <span class="Constant"> x <- copy 0</span> <span class="Constant">]</span> - string-replace <span class="Constant">1</span>:address:array:character, <span class="Constant">171/«</span>, <span class="Constant">91</span> <span class="Comment"># '['</span> + replace <span class="Constant">1</span>:address:array:character, <span class="Constant">171/«</span>, <span class="Constant">91</span> <span class="Comment"># '['</span> <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[foo]</span> <span class="Constant">3</span>:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address:screen, <span class="Constant">1</span>:address:array:character, <span class="Constant">2</span>:address:array:character assume-console [ diff --git a/html/edit/011-editor-undo.mu.html b/html/edit/011-editor-undo.mu.html index 5a3f537e..801ca648 100644 --- a/html/edit/011-editor-undo.mu.html +++ b/html/edit/011-editor-undo.mu.html @@ -2105,10 +2105,6 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Constant"> . .</span> ] ] - -<span class="Comment"># todo:</span> -<span class="Comment"># operations for recipe side and each sandbox-data</span> -<span class="Comment"># undo delete sandbox as a separate primitive on the status bar</span> </pre> </body> </html> |