From 79655b81180a6e4d36b2cdbde5772f3a3860ee49 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 18 Feb 2021 18:31:06 -0600 Subject: [PATCH] added variables --- dist/prez.wasm | Bin 30910 -> 33281 bytes onyx.prez | 71 +++++++++++++++++++++++------ src/show_parser.onyx | 103 ++++++++++++++++++++++++++++++++----------- src/slides.onyx | 8 +++- 4 files changed, 142 insertions(+), 40 deletions(-) diff --git a/dist/prez.wasm b/dist/prez.wasm index 75cf0cdaf2790f811de93bc2f01dbcd97f2a3ef9..598ac5a4ea5db3dd4ff0b49896bef2c830ecb6a5 100644 GIT binary patch delta 10476 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 L;7DG*fBOFd54~qN delta 9212 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 M{Yvir@D=_4393BB*Z=?k diff --git a/onyx.prez b/onyx.prez index b81dfff..5b38c68 100644 --- a/onyx.prez +++ b/onyx.prez @@ -1,11 +1,18 @@ -[define_text_style normal color 255 255 255 font_size 40 font_name "Arial" left padding 10] -[define_text_style title color 255 255 255 font_attr bold font_size 72 font_name "Arial" centered] -[define_text_style subtitle color 255 255 255 font_attr italic font_size 72 font_name "Arial" centered] -[define_text_style header color 255 255 255 font_attr bold font_size 72 font_name "Arial" left padding 10] +[var tbright 236] +[var bbright 20] + +[define_text_style normal color $tbright $tbright $tbright font_size 40 font_name "Arial" left padding 10] +[define_text_style title color $tbright $tbright $tbright font_attr bold font_size 72 font_name "Arial" centered] +[define_text_style subtitle color $tbright $tbright $tbright font_attr italic font_size 72 font_name "Arial" centered] +[define_text_style header color $tbright $tbright $tbright font_attr bold font_size 72 font_name "Arial" left padding 10] + +[define_text_style hyperlink color 100 100 255 font_attr italic font_size 40 font_name "Arial" left padding 10] + +[load_image wasm_logo "https://webassembly.org/css/webassembly.svg"] # --------------------------------------------- -[slide] [background 30 30 30] +[slide] [background $bbright $bbright $bbright] [rect color 0 0 0 x 0 w 100 y 40 h 20] @@ -21,21 +28,59 @@ # Introduce what Onyx is, the design goals, the improvements over C, etc. [slide] -[rect color 0 0 0 x 0 w 100 y 5 h 10] +[rect color 40 40 40 x 8 w 84 y 0 h 100] +[rect color 0 0 0 x 0 w 100 y 5 h 10] [text_style header] [y 12] What is Onyx? [text_style normal] -[y 20] ▪ New programming language for WebAssembly -[y 25] ▪ No dependence on other langauges -[y 30] ▪ Fast compilation by design -[y 35] ▪ Easy to write by design +[y 22] New programming language for WebAssembly developed entirely by me. +[y 34] Some important design features: +[text_style inherit padding 15] +▪ No dependence on other langauges +▪ Fast compilation +▪ Easy to write +▪ Easy to read + + +# --------------------------------------------- +# BRIEFLY introduce WASM and its capabilities [slide] -[rect color 0 0 0 x 0 w 100 y 5 h 10] +[rect color 40 40 40 x 8 w 84 y 0 h 100] +[rect color 0 0 0 x 0 w 100 y 5 h 10] [text_style header] -[y 12] Design of Onyx +[y 12] Brief aside: WebAssembly [text_style normal] -[y 20] +[y 20] WebAssembly (WASM for short) is a new execution platform for the web. + +[y 30] It defines: +[text_style inherit padding 15] +▪ A Virtual Instruction Set Architecture +▪ Linear Memory Model +▪ Arbitrary imports +▪ Safe indirect function calls + +[text_style normal centered] +[y 75] For more information, you can check out, +[text_style hyperlink centered] +https://webassembly.org/ + +[image wasm_logo x 65 y 34 width 20] + + +# --------------------------------------------- +# High-level language features and design that make it super cozy to program in. + +[slide] +[rect color 40 40 40 x 8 w 84 y 0 h 100] +[rect color 0 0 0 x 0 w 100 y 5 h 10] +[text_style header] +[y 12] Design of Onyx + +[text_style normal font_attr italic font_size 44] +[y 20] Declare anywhere. +Polymorphic procedures and structures. +Package system. diff --git a/src/show_parser.onyx b/src/show_parser.onyx index 38fb95c..a3c5d27 100644 --- a/src/show_parser.onyx +++ b/src/show_parser.onyx @@ -1,5 +1,10 @@ use package core +ParseContext :: struct { + reader: ^io.Reader; + variables: ^map.Map(str, u32); +} + parse_slideshow :: (source: str, slideshow: ^Slideshow) { use io @@ -21,6 +26,11 @@ parse_slideshow :: (source: str, slideshow: ^Slideshow) { text_styles := map.make(str, Slide_Item_Text, default_text_style); defer map.free(^text_styles); + variables := map.make(str, u32); + defer map.free(^variables); + + parse_context := ParseContext.{ ^show_reader, ^variables }; + current_slide: ^Slide; current_item_idx := 0; current_text_style: Slide_Item_Text; @@ -48,7 +58,7 @@ parse_slideshow :: (source: str, slideshow: ^Slideshow) { slide_init(current_slide, background_color=prev_slide.background, item_count = 16); } elseif command_name == "background" { - r, g, b := parse_color(^show_reader); + r, g, b := parse_color(^parse_context); current_slide.background = Color.{ r, g, b }; } elseif command_name == "y" { @@ -62,27 +72,33 @@ parse_slideshow :: (source: str, slideshow: ^Slideshow) { } text_style := map.get(^text_styles, text_style_name); + + old_y := current_text_style.y_pos; current_text_style = text_style; + current_text_style.y_pos = old_y; + + parse_text_style(^parse_context, ^current_text_style, parse_alloc); - parse_text_style(^show_reader, ^current_text_style, parse_alloc); + // So 'inherit' can be used to copy all existing text styling. + map.put(^text_styles, "inherit", current_text_style); } elseif command_name == "define_text_style" { text_style_name := read_word(^show_reader, numeric_allowed=true); current_text_style = default_text_style; - parse_text_style(^show_reader, ^current_text_style, parse_alloc); + parse_text_style(^parse_context, ^current_text_style, parse_alloc); map.put(^text_styles, text_style_name, current_text_style); } elseif command_name == "load_image" { image_name := read_word(^show_reader, numeric_allowed=true); - image_path := parse_string(^show_reader, allocator=parse_alloc); + image_path := parse_string(^parse_context, allocator=parse_alloc); slideshow_load_image(slideshow, image_name, image_path); } elseif command_name == "image" { new_slide_image := slideshow_make_item(slideshow); new_slide_image.kind = Slide_Item.Kind.Image; - parse_image_style(^show_reader, ^new_slide_image.image, parse_alloc); + parse_image_style(^parse_context, ^new_slide_image.image, parse_alloc); current_slide.items[current_item_idx] = new_slide_image; current_item_idx += 1; @@ -90,11 +106,17 @@ parse_slideshow :: (source: str, slideshow: ^Slideshow) { elseif command_name == "rect" { new_slide_rect := slideshow_make_item(slideshow); new_slide_rect.kind = Slide_Item.Kind.Rect; - parse_rect_style(^show_reader, ^new_slide_rect.rect, parse_alloc); + parse_rect_style(^parse_context, ^new_slide_rect.rect, parse_alloc); current_slide.items[current_item_idx] = new_slide_rect; current_item_idx += 1; } + elseif command_name == "var" { + var_name := read_word(^show_reader, numeric_allowed=true); + var_value := read_u32(^show_reader); + + map.put(^variables, var_name, var_value); + } else { printf("******** Unknown command: '%s'.\n", command_name); } @@ -116,6 +138,11 @@ parse_slideshow :: (source: str, slideshow: ^Slideshow) { current_slide.items[current_item_idx] = new_slide_text; current_item_idx += 1; + + // @Robustness + // This feels like the right amount, but obviously this should change + // depending on font size, window height, etc... + current_text_style.y_pos += .05; } } } @@ -124,7 +151,7 @@ parse_slideshow :: (source: str, slideshow: ^Slideshow) { } #private_file -parse_text_style :: (reader: ^io.Reader, text_style: ^Slide_Item_Text, parse_alloc := context.allocator) { +parse_text_style :: (use pc: ^ParseContext, text_style: ^Slide_Item_Text, parse_alloc := context.allocator) { use io while !stream_end_of_file(reader.stream) && peek_byte(reader) != #char "]" { @@ -133,14 +160,14 @@ parse_text_style :: (reader: ^io.Reader, text_style: ^Slide_Item_Text, parse_all style_name := read_word(reader, allocator=parse_alloc); if style_name == "color" { - r, g, b := parse_color(reader); + r, g, b := parse_color(pc); text_style.color = Color.{ r, g, b }; } elseif style_name == "font_size" { - text_style.font_size = read_u32(reader); + text_style.font_size = parse_numeric_value(pc); } elseif style_name == "font_name" { - text_style.font_name = parse_string(reader); + text_style.font_name = parse_string(pc); } elseif style_name == "font_attr" { font_attr := read_word(reader, allocator=parse_alloc); @@ -149,7 +176,7 @@ parse_text_style :: (reader: ^io.Reader, text_style: ^Slide_Item_Text, parse_all elseif font_attr == "italic" do text_style.font_attr |= Slide_Item_Text.FontAttributes.Italic; } elseif style_name == "padding" { - padding := read_u32(reader); + padding := parse_numeric_value(pc); text_style.padding = cast(f32) padding / 100; } elseif style_name == "left" do text_style.justify = Slide_Item_Text.Justify.Left; @@ -164,7 +191,7 @@ parse_text_style :: (reader: ^io.Reader, text_style: ^Slide_Item_Text, parse_all } #private_file -parse_image_style :: (reader: ^io.Reader, image_style: ^Slide_Item_Image, parse_alloc := context.allocator) { +parse_image_style :: (use pc: ^ParseContext, image_style: ^Slide_Item_Image, parse_alloc := context.allocator) { use io image_name := read_word(reader, numeric_allowed=true); @@ -176,15 +203,15 @@ parse_image_style :: (reader: ^io.Reader, image_style: ^Slide_Item_Image, parse_ style_name := read_word(reader, allocator=parse_alloc); if style_name == "x" { - x := read_u32(reader); + x := parse_numeric_value(pc); image_style.x = cast(f32) x / 100; } elseif style_name == "y" { - y := read_u32(reader); + y := parse_numeric_value(pc); image_style.y = cast(f32) y / 100; } elseif style_name == "width" { - width := read_u32(reader); + width := parse_numeric_value(pc); image_style.width = cast(f32) width / 100; } else { @@ -196,7 +223,7 @@ parse_image_style :: (reader: ^io.Reader, image_style: ^Slide_Item_Image, parse_ } #private_file -parse_rect_style :: (reader: ^io.Reader, rect_style: ^Slide_Item_Rect, parse_alloc := context.allocator) { +parse_rect_style :: (use pc: ^ParseContext, rect_style: ^Slide_Item_Rect, parse_alloc := context.allocator) { use io while !stream_end_of_file(reader.stream) && peek_byte(reader) != #char "]" { @@ -205,23 +232,23 @@ parse_rect_style :: (reader: ^io.Reader, rect_style: ^Slide_Item_Rect, parse_all style_name := read_word(reader, allocator=parse_alloc); if style_name == "x" { - x := read_u32(reader); + x := parse_numeric_value(pc); rect_style.x = cast(f32) x / 100; } elseif style_name == "y" { - y := read_u32(reader); + y := parse_numeric_value(pc); rect_style.y = cast(f32) y / 100; } elseif style_name == "w" { - w := read_u32(reader); + w := parse_numeric_value(pc); rect_style.w = cast(f32) w / 100; } elseif style_name == "h" { - h := read_u32(reader); + h := parse_numeric_value(pc); rect_style.h = cast(f32) h / 100; } elseif style_name == "color" { - r, g, b := parse_color(reader); + r, g, b := parse_color(pc); rect_style.color = Color.{ r, g, b }; } else { @@ -233,10 +260,34 @@ parse_rect_style :: (reader: ^io.Reader, rect_style: ^Slide_Item_Rect, parse_all } #private_file -parse_color :: (reader: ^io.Reader) -> (f32, f32, f32) { - r := io.read_u32(reader); - g := io.read_u32(reader); - b := io.read_u32(reader); +parse_numeric_value :: (use pc: ^ParseContext) -> u32 { + use io + + skip_whitespace(reader); + _, next_byte := stream_peek_byte(reader.stream); + if next_byte == #char "$" { + io.read_byte(reader); + var_name := read_word(reader, numeric_allowed=true); + + value := 0; + + if map.has(variables, var_name) { + value = map.get(variables, var_name); + } else { + printf("Variable '%s' was never defined!\n", var_name); + } + + return value; + } + + return read_u32(reader); +} + +#private_file +parse_color :: (use pc: ^ParseContext) -> (f32, f32, f32) { + r := parse_numeric_value(pc); + g := parse_numeric_value(pc); + b := parse_numeric_value(pc); fr := cast(f32) r / 255; fg := cast(f32) g / 255; @@ -246,7 +297,7 @@ parse_color :: (reader: ^io.Reader) -> (f32, f32, f32) { } #private_file -parse_string :: (reader: ^io.Reader, allocator := context.allocator) -> str { +parse_string :: (use pc: ^ParseContext, allocator := context.allocator) -> str { use io // @Cleanup diff --git a/src/slides.onyx b/src/slides.onyx index 44f1cf5..0af702f 100644 --- a/src/slides.onyx +++ b/src/slides.onyx @@ -92,12 +92,18 @@ Slide_Item_Rect :: struct { slideshow_make :: (allocator := context.allocator) -> Slideshow { slideshow: Slideshow; slideshow_init(^slideshow, allocator); + + // @Reconsider: By not reseting the current_slide to 0 in the init function, + // the current slide can persist over resets. This makes it easier to be + // editing a slideshow because you will remain on the same slide, provided + // no other slides were added before the slide you're working on. + slideshow.current_slide = 0; + return slideshow; } slideshow_init :: (use s: ^Slideshow, allocator := context.allocator) { title = "Untitled Slideshow"; - current_slide = 0; arena = alloc.arena.make(allocator, arena_size = 16 * 1024); array.init(^slides, 4); -- 2.25.1