From beee4381ea0250782a43bc29919f8e0499423ff8 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Fri, 13 Mar 2026 21:23:20 -0400 Subject: [PATCH] Made the bezos.exe fully independant so it can run in any directory and use any font or images. --- sample/about-bezos.md | 3 ++- src/backend.cpp | 29 ++++++++++++++++++++++++++++- src/backend.hpp | 19 ++++++++++++++----- src/main.cpp | 12 ++++++++---- src/md_parser.cpp | 41 ++++++++++++++++++++++------------------- src/md_parser.rl | 3 +++ src/parser.cpp | 7 ++++--- src/parser.hpp | 7 +++++-- tests/parsing.cpp | 11 +++++++---- 9 files changed, 93 insertions(+), 39 deletions(-) diff --git a/sample/about-bezos.md b/sample/about-bezos.md index d5d055d..87cc7e1 100644 --- a/sample/about-bezos.md +++ b/sample/about-bezos.md @@ -1,6 +1,7 @@ { "title": "How to use Bezos", - "description": "A short presentation on Bezos." + "description": "A short presentation on Bezos.", + "font_file": "assets/text.otf" } === # Bezos Slide Format diff --git a/src/backend.cpp b/src/backend.cpp index 19ae66f..824861d 100644 --- a/src/backend.cpp +++ b/src/backend.cpp @@ -1,5 +1,8 @@ #include "backend.hpp" #include "dbc.hpp" +#include + +using std::string; namespace gui { guecs::SpriteTexture Backend::get_sprite(const std::string& file_path) { @@ -14,6 +17,29 @@ namespace gui { return {sprite, texture, {int(size.x), int(size.y)}}; } + guecs::SpriteTexture Backend::get_icon(const string& name) { + dbc::log("Backend::get_icon not implemented"); + return {}; + } + + void Backend::sound_play(const string& name) { + dbc::log("Backend::sound_play not implemented"); + } + + void Backend::sound_stop(const string& name) { + dbc::log("Backend::sound_stop not implemented"); + } + + std::shared_ptr Backend::get_shader(const std::string& name) { + dbc::log("Backend::get_shader not implemented"); + return nullptr; + } + + bool Backend::shader_updated() { + dbc::log("Backend::shader_updated not implemented"); + return false; + } + guecs::Theme Backend::theme() { guecs::Theme theme; @@ -26,7 +52,8 @@ namespace gui { theme.BG_COLOR = theme.DARK_DARK; theme.BORDER_COLOR = theme.DARK_LIGHT; theme.BG_COLOR_DARK = theme.BLACK; - theme.FONT_FILE_NAME = "assets/text.otf"; + fmt::println("FONT FILE IN THEME {}", $font_file); + theme.FONT_FILE_NAME = $font_file; return theme; } diff --git a/src/backend.hpp b/src/backend.hpp index a47bd4e..80a2493 100644 --- a/src/backend.hpp +++ b/src/backend.hpp @@ -4,11 +4,20 @@ #include namespace gui { - class Backend : public sfml::Backend { - int $shaders_version = 0; - + class Backend : public guecs::Backend { public: - guecs::SpriteTexture get_sprite(const std::string& name) override; - guecs::Theme theme() override; + std::string $font_file = "assets/text.otf"; + + guecs::SpriteTexture get_sprite(const std::string& name); + guecs::SpriteTexture get_icon(const std::string& name); + void sound_play(const std::string& name); + void sound_stop(const std::string& name); + std::shared_ptr get_shader(const std::string& name); + bool shader_updated(); + guecs::Theme theme(); + + void set_font(const std::string& file) { + $font_file = file; + } }; } diff --git a/src/main.cpp b/src/main.cpp index f4ac34b..9a04199 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,8 +10,14 @@ int main(int argc, char *argv[]) { dbc::check(argc >= 2, "USAGE: bezos my_fucking_slides.md"); - gui::Backend backend; - guecs::init(&backend); + auto backend = std::make_shared(); + + auto data = parse_slides(argv[1], [&](nlohmann::json& config) { + backend->set_font(config["font_file"]); + guecs::init(backend.get()); + }); + + fmt::println("FONT FILE: {}", backend->$font_file); auto& modes = sf::VideoMode::getFullscreenModes(); auto screen_mode = std::find_if(modes.begin(), modes.end(), [=](const auto& a) -> bool { @@ -26,8 +32,6 @@ int main(int argc, char *argv[]) { presenter.setFramerateLimit(FRAME_LIMIT); presenter.setVerticalSyncEnabled(VSYNC); - auto data = parse_slides(argv[1]); - SlidesUI slides(data); slides.init(); diff --git a/src/md_parser.cpp b/src/md_parser.cpp index 46392dd..35149df 100644 --- a/src/md_parser.cpp +++ b/src/md_parser.cpp @@ -1,7 +1,8 @@ -#line 1 "src/md_parser.rl" +#line 1 "..//src/md_parser.rl" #include #include +#include "guecs/ui.hpp" enum { PLAIN=0, @@ -11,11 +12,11 @@ enum { }; -#line 90 "src/md_parser.rl" +#line 93 "..//src/md_parser.rl" -#line 14 "src/md_parser.cpp" +#line 15 "..//src/md_parser.cpp" static const char _Parser_actions[] = { 0, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, @@ -122,7 +123,7 @@ static const int Parser_error = 0; static const int Parser_en_main = 1; -#line 93 "src/md_parser.rl" +#line 96 "..//src/md_parser.rl" bool Parser::parse(const std::string& input) { @@ -138,14 +139,14 @@ bool Parser::parse(const std::string& input) { last = DECK; -#line 133 "src/md_parser.cpp" +#line 134 "..//src/md_parser.cpp" { cs = Parser_start; } -#line 108 "src/md_parser.rl" +#line 111 "..//src/md_parser.rl" -#line 136 "src/md_parser.cpp" +#line 137 "..//src/md_parser.cpp" { int _klen; unsigned int _trans; @@ -220,23 +221,23 @@ _match: switch ( *_acts++ ) { case 0: -#line 15 "src/md_parser.rl" +#line 16 "..//src/md_parser.rl" { start = p; } break; case 1: -#line 16 "src/md_parser.rl" +#line 17 "..//src/md_parser.rl" { last = TITLE; } break; case 2: -#line 17 "src/md_parser.rl" +#line 18 "..//src/md_parser.rl" { last = PLAIN; } break; case 3: -#line 18 "src/md_parser.rl" +#line 19 "..//src/md_parser.rl" { last = ENUM; } break; case 4: -#line 20 "src/md_parser.rl" +#line 21 "..//src/md_parser.rl" { tk = input.substr(start - begin, p - start); @@ -254,11 +255,13 @@ _match: } break; case 5: -#line 36 "src/md_parser.rl" +#line 37 "..//src/md_parser.rl" { tk = input.substr(start - begin, p - start); if(last == DECK) { deck->config = json::parse(tk); + dbc::check(deck->config.contains("font_file"), "ERROR: missing font_file setting in deck header"); + deck_done(deck->config); std::cout << "META:" << deck->config << '\n'; } else { config = json::parse(tk); @@ -267,7 +270,7 @@ _match: } break; case 6: -#line 47 "src/md_parser.rl" +#line 50 "..//src/md_parser.rl" { std::string image = input.substr(start - begin, p - start); fmt::println("IMAGE image={}, start={}, length={}", @@ -276,27 +279,27 @@ _match: } break; case 7: -#line 54 "src/md_parser.rl" +#line 57 "..//src/md_parser.rl" { last = PLAIN; fmt::println("----- START"); } break; case 8: -#line 59 "src/md_parser.rl" +#line 62 "..//src/md_parser.rl" { title.clear(); content.clear(); } break; case 9: -#line 64 "src/md_parser.rl" +#line 67 "..//src/md_parser.rl" { deck->slides.emplace_back(title, content, config, deck->config); config.clear(); } break; -#line 276 "src/md_parser.cpp" +#line 279 "..//src/md_parser.cpp" } } @@ -309,7 +312,7 @@ _again: _out: {} } -#line 109 "src/md_parser.rl" +#line 112 "..//src/md_parser.rl" bool good = pe - p == 0; diff --git a/src/md_parser.rl b/src/md_parser.rl index 753cfaf..1ac088d 100644 --- a/src/md_parser.rl +++ b/src/md_parser.rl @@ -1,5 +1,6 @@ #include #include +#include "guecs/ui.hpp" enum { PLAIN=0, @@ -37,6 +38,8 @@ enum { tk = input.substr(start - begin, fpc - start); if(last == DECK) { deck->config = json::parse(tk); + dbc::check(deck->config.contains("font_file"), "ERROR: missing font_file setting in deck header"); + deck_done(deck->config); std::cout << "META:" << deck->config << '\n'; } else { config = json::parse(tk); diff --git a/src/parser.cpp b/src/parser.cpp index 884500d..886fd4b 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -18,14 +18,15 @@ string load_file(const string& md_file) { return string(std::istreambuf_iterator(in_file), std::istreambuf_iterator()); } -std::shared_ptr parse_slides(const std::string& md_file) { +std::shared_ptr parse_slides(const std::string& md_file, std::function deck_done) { auto contents = load_file(md_file); - Parser rp; + Parser rp(deck_done); rp.parse(contents); return rp.results(); } -Parser::Parser() +Parser::Parser(std::function cb) : + deck_done(cb) { deck = make_shared(); } diff --git a/src/parser.hpp b/src/parser.hpp index 37aa13d..0725887 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -2,19 +2,22 @@ #include #include #include "slides_ui.hpp" +#include "backend.hpp" +#include -std::shared_ptr parse_slides(const std::string& md_file); +std::shared_ptr parse_slides(const std::string& md_file, std::function deck_done); struct Parser { int last = 0; bool error = false; std::shared_ptr deck; + std::function deck_done; std::string title; std::string content; nlohmann::json config; - Parser(); + Parser(std::function cb); bool parse(const std::string& input); void finalize(); std::shared_ptr results() { return deck; } diff --git a/tests/parsing.cpp b/tests/parsing.cpp index 7f90bfe..7ca2a95 100644 --- a/tests/parsing.cpp +++ b/tests/parsing.cpp @@ -1,13 +1,16 @@ #include -#include "guecs/sfml/backend.hpp" +#include "backend.hpp" #include #include #include "parser.hpp" TEST_CASE("parse a simple example", "[parsing]") { - sfml::Backend backend; - guecs::init(&backend); + gui::Backend backend; + + auto data = parse_slides("./sample/about-bezos.md", [&](nlohmann::json& config) { + backend.set_font(config["font_file"]); + guecs::init(&backend); + }); - auto data = parse_slides("./sample/01-a-good-first-program.md"); REQUIRE(data->slides.size() > 0); }