diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-06-06 07:41:00 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-06-06 08:27:48 -0700 |
commit | 0fa80fb1a3a2a8741e3f48df76033cf1b3990ce0 (patch) | |
tree | f955e601365e4c18a68a474c3eebf0bd3e91923e | |
parent | 725f6702ff90a2da35ce83b298fbc7f991ebd9d1 (diff) | |
download | mu-0fa80fb1a3a2a8741e3f48df76033cf1b3990ce0.tar.gz |
6489 - browse app: headers
Again quite ugly. There's an increasing amount of state here, particularly the interplay between headers and soft newlines.
-rw-r--r-- | prototypes/browse/25-soft-newlines/main.mu | 5 | ||||
-rw-r--r-- | prototypes/browse/26-headers/main.mu | 91 |
2 files changed, 94 insertions, 2 deletions
diff --git a/prototypes/browse/25-soft-newlines/main.mu b/prototypes/browse/25-soft-newlines/main.mu index ec573e9a..7db4050c 100644 --- a/prototypes/browse/25-soft-newlines/main.mu +++ b/prototypes/browse/25-soft-newlines/main.mu @@ -40,7 +40,8 @@ $render-normal:loop: { # if (c == EOF) break compare c, 0xffffffff # EOF marker break-if-= - # if (c == newline) + + ## if (c == newline) perform some fairly sophisticated parsing for soft newlines compare c, 0xa # newline { break-if-!= @@ -80,6 +81,8 @@ $render-normal:flush-buffered-newline: { add-char state, 0x20 # space # fall through to print c } + ## end soft newline support + # if (c == '*') switch to bold compare c, 0x2a # '*' { diff --git a/prototypes/browse/26-headers/main.mu b/prototypes/browse/26-headers/main.mu index ec573e9a..c6272343 100644 --- a/prototypes/browse/26-headers/main.mu +++ b/prototypes/browse/26-headers/main.mu @@ -30,6 +30,7 @@ fn render fs: (addr file-state), state: (addr screen-position-state) { fn render-normal fs: (addr file-state), state: (addr screen-position-state) { var newline-seen?/esi: boolean <- copy 0 # false + var start-of-paragraph?/edi: boolean <- copy 1 # true $render-normal:loop: { # if done-drawing?(state) break var done?/eax: boolean <- done-drawing? state @@ -40,7 +41,8 @@ $render-normal:loop: { # if (c == EOF) break compare c, 0xffffffff # EOF marker break-if-= - # if (c == newline) + + ## if (c == newline) perform some fairly sophisticated parsing for soft newlines compare c, 0xa # newline { break-if-!= @@ -57,6 +59,7 @@ $render-normal:loop: { add-char state, 0xa # newline add-char state, 0xa # newline newline-seen? <- copy 0 # false + start-of-paragraph? <- copy 1 # true loop $render-normal:loop } } @@ -80,6 +83,17 @@ $render-normal:flush-buffered-newline: { add-char state, 0x20 # space # fall through to print c } + ## end soft newline support + + # if start of paragraph and c == '#', switch to header + compare c, 0x23 # '#' + { + break-if-!= + render-header-line fs, state + newline-seen? <- copy 1 # true + loop $render-normal:loop + } + # if (c == '*') switch to bold compare c, 0x2a # '*' { @@ -107,6 +121,81 @@ $render-normal:flush-buffered-newline: { } } +fn render-header-line fs: (addr file-state), state: (addr screen-position-state) { +$render-header-line:body: { + # compute color based on number of '#'s + var header-level/esi: int <- copy 1 # caller already grabbed one + var c/eax: byte <- copy 0 + { + # if done-drawing?(state) return + var done?/eax: boolean <- done-drawing? state + compare done?, 0 # false + break-if-!= $render-header-line:body + # + c <- next-char fs + # if (c != '#') break + compare c, 0x23 # '#' + break-if-!= + # + header-level <- increment + # + loop + } + start-heading header-level + { + # if done-drawing?(state) break + var done?/eax: boolean <- done-drawing? state + compare done?, 0 # false + break-if-!= + # + c <- next-char fs + # if (c == EOF) break + compare c, 0xffffffff # EOF marker + break-if-= + # if (c == newline) break + compare c, 0xa # newline + break-if-= + # + add-char state, c + # + loop + } + normal-text +} +} + +# colors for a light background, going from bright to dark (meeting up with bold-text) +fn start-heading header-level: int { +$start-heading:body: { + start-bold + compare header-level, 1 + { + break-if-!= + start-color 0xa0, 7 + break $start-heading:body + } + compare header-level, 2 + { + break-if-!= + start-color 0x7c, 7 + break $start-heading:body + } + compare header-level, 3 + { + break-if-!= + start-color 0x58, 7 + break $start-heading:body + } + compare header-level, 4 + { + break-if-!= + start-color 0x34, 7 + break $start-heading:body + } + start-color 0xe8, 7 +} +} + fn render-until-asterisk fs: (addr file-state), state: (addr screen-position-state) { { # if done-drawing?(state) break |