Made the bezos.exe fully independant so it can run in any directory and use any font or images.

master
Zed A. Shaw 1 week ago
parent de225cf25c
commit beee4381ea
  1. 3
      sample/about-bezos.md
  2. 29
      src/backend.cpp
  3. 19
      src/backend.hpp
  4. 12
      src/main.cpp
  5. 41
      src/md_parser.cpp
  6. 3
      src/md_parser.rl
  7. 7
      src/parser.cpp
  8. 7
      src/parser.hpp
  9. 11
      tests/parsing.cpp

@ -1,6 +1,7 @@
{ {
"title": "How to use Bezos", "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 # Bezos Slide Format

@ -1,5 +1,8 @@
#include "backend.hpp" #include "backend.hpp"
#include "dbc.hpp" #include "dbc.hpp"
#include <string>
using std::string;
namespace gui { namespace gui {
guecs::SpriteTexture Backend::get_sprite(const std::string& file_path) { 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)}}; 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<sf::Shader> 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 Backend::theme() {
guecs::Theme theme; guecs::Theme theme;
@ -26,7 +52,8 @@ namespace gui {
theme.BG_COLOR = theme.DARK_DARK; theme.BG_COLOR = theme.DARK_DARK;
theme.BORDER_COLOR = theme.DARK_LIGHT; theme.BORDER_COLOR = theme.DARK_LIGHT;
theme.BG_COLOR_DARK = theme.BLACK; 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; return theme;
} }

@ -4,11 +4,20 @@
#include <string> #include <string>
namespace gui { namespace gui {
class Backend : public sfml::Backend { class Backend : public guecs::Backend {
int $shaders_version = 0;
public: public:
guecs::SpriteTexture get_sprite(const std::string& name) override; std::string $font_file = "assets/text.otf";
guecs::Theme theme() override;
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<sf::Shader> get_shader(const std::string& name);
bool shader_updated();
guecs::Theme theme();
void set_font(const std::string& file) {
$font_file = file;
}
}; };
} }

@ -10,8 +10,14 @@
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
dbc::check(argc >= 2, "USAGE: bezos my_fucking_slides.md"); dbc::check(argc >= 2, "USAGE: bezos my_fucking_slides.md");
gui::Backend backend; auto backend = std::make_shared<gui::Backend>();
guecs::init(&backend);
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& modes = sf::VideoMode::getFullscreenModes();
auto screen_mode = std::find_if(modes.begin(), modes.end(), [=](const auto& a) -> bool { 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.setFramerateLimit(FRAME_LIMIT);
presenter.setVerticalSyncEnabled(VSYNC); presenter.setVerticalSyncEnabled(VSYNC);
auto data = parse_slides(argv[1]);
SlidesUI slides(data); SlidesUI slides(data);
slides.init(); slides.init();

@ -1,7 +1,8 @@
#line 1 "src/md_parser.rl" #line 1 "..//src/md_parser.rl"
#include <fmt/core.h> #include <fmt/core.h>
#include <iostream> #include <iostream>
#include "guecs/ui.hpp"
enum { enum {
PLAIN=0, 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[] = { static const char _Parser_actions[] = {
0, 1, 0, 1, 1, 1, 2, 1, 0, 1, 0, 1, 1, 1, 2, 1,
3, 1, 4, 1, 5, 1, 6, 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; 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) { bool Parser::parse(const std::string& input) {
@ -138,14 +139,14 @@ bool Parser::parse(const std::string& input) {
last = DECK; last = DECK;
#line 133 "src/md_parser.cpp" #line 134 "..//src/md_parser.cpp"
{ {
cs = Parser_start; 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; int _klen;
unsigned int _trans; unsigned int _trans;
@ -220,23 +221,23 @@ _match:
switch ( *_acts++ ) switch ( *_acts++ )
{ {
case 0: case 0:
#line 15 "src/md_parser.rl" #line 16 "..//src/md_parser.rl"
{ start = p; } { start = p; }
break; break;
case 1: case 1:
#line 16 "src/md_parser.rl" #line 17 "..//src/md_parser.rl"
{ last = TITLE; } { last = TITLE; }
break; break;
case 2: case 2:
#line 17 "src/md_parser.rl" #line 18 "..//src/md_parser.rl"
{ last = PLAIN; } { last = PLAIN; }
break; break;
case 3: case 3:
#line 18 "src/md_parser.rl" #line 19 "..//src/md_parser.rl"
{ last = ENUM; } { last = ENUM; }
break; break;
case 4: case 4:
#line 20 "src/md_parser.rl" #line 21 "..//src/md_parser.rl"
{ {
tk = input.substr(start - begin, p - start); tk = input.substr(start - begin, p - start);
@ -254,11 +255,13 @@ _match:
} }
break; break;
case 5: case 5:
#line 36 "src/md_parser.rl" #line 37 "..//src/md_parser.rl"
{ {
tk = input.substr(start - begin, p - start); tk = input.substr(start - begin, p - start);
if(last == DECK) { if(last == DECK) {
deck->config = json::parse(tk); 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'; std::cout << "META:" << deck->config << '\n';
} else { } else {
config = json::parse(tk); config = json::parse(tk);
@ -267,7 +270,7 @@ _match:
} }
break; break;
case 6: case 6:
#line 47 "src/md_parser.rl" #line 50 "..//src/md_parser.rl"
{ {
std::string image = input.substr(start - begin, p - start); std::string image = input.substr(start - begin, p - start);
fmt::println("IMAGE image={}, start={}, length={}", fmt::println("IMAGE image={}, start={}, length={}",
@ -276,27 +279,27 @@ _match:
} }
break; break;
case 7: case 7:
#line 54 "src/md_parser.rl" #line 57 "..//src/md_parser.rl"
{ {
last = PLAIN; last = PLAIN;
fmt::println("----- START"); fmt::println("----- START");
} }
break; break;
case 8: case 8:
#line 59 "src/md_parser.rl" #line 62 "..//src/md_parser.rl"
{ {
title.clear(); title.clear();
content.clear(); content.clear();
} }
break; break;
case 9: case 9:
#line 64 "src/md_parser.rl" #line 67 "..//src/md_parser.rl"
{ {
deck->slides.emplace_back(title, content, config, deck->config); deck->slides.emplace_back(title, content, config, deck->config);
config.clear(); config.clear();
} }
break; break;
#line 276 "src/md_parser.cpp" #line 279 "..//src/md_parser.cpp"
} }
} }
@ -309,7 +312,7 @@ _again:
_out: {} _out: {}
} }
#line 109 "src/md_parser.rl" #line 112 "..//src/md_parser.rl"
bool good = pe - p == 0; bool good = pe - p == 0;

@ -1,5 +1,6 @@
#include <fmt/core.h> #include <fmt/core.h>
#include <iostream> #include <iostream>
#include "guecs/ui.hpp"
enum { enum {
PLAIN=0, PLAIN=0,
@ -37,6 +38,8 @@ enum {
tk = input.substr(start - begin, fpc - start); tk = input.substr(start - begin, fpc - start);
if(last == DECK) { if(last == DECK) {
deck->config = json::parse(tk); 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'; std::cout << "META:" << deck->config << '\n';
} else { } else {
config = json::parse(tk); config = json::parse(tk);

@ -18,14 +18,15 @@ string load_file(const string& md_file) {
return string(std::istreambuf_iterator<char>(in_file), std::istreambuf_iterator<char>()); return string(std::istreambuf_iterator<char>(in_file), std::istreambuf_iterator<char>());
} }
std::shared_ptr<SlideDeck> parse_slides(const std::string& md_file) { std::shared_ptr<SlideDeck> parse_slides(const std::string& md_file, std::function<void(nlohmann::json&)> deck_done) {
auto contents = load_file(md_file); auto contents = load_file(md_file);
Parser rp; Parser rp(deck_done);
rp.parse(contents); rp.parse(contents);
return rp.results(); return rp.results();
} }
Parser::Parser() Parser::Parser(std::function<void(nlohmann::json&)> cb) :
deck_done(cb)
{ {
deck = make_shared<SlideDeck>(); deck = make_shared<SlideDeck>();
} }

@ -2,19 +2,22 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include "slides_ui.hpp" #include "slides_ui.hpp"
#include "backend.hpp"
#include <functional>
std::shared_ptr<SlideDeck> parse_slides(const std::string& md_file); std::shared_ptr<SlideDeck> parse_slides(const std::string& md_file, std::function<void(nlohmann::json&)> deck_done);
struct Parser { struct Parser {
int last = 0; int last = 0;
bool error = false; bool error = false;
std::shared_ptr<SlideDeck> deck; std::shared_ptr<SlideDeck> deck;
std::function<void(nlohmann::json&)> deck_done;
std::string title; std::string title;
std::string content; std::string content;
nlohmann::json config; nlohmann::json config;
Parser(); Parser(std::function<void(nlohmann::json&)> cb);
bool parse(const std::string& input); bool parse(const std::string& input);
void finalize(); void finalize();
std::shared_ptr<SlideDeck> results() { return deck; } std::shared_ptr<SlideDeck> results() { return deck; }

@ -1,13 +1,16 @@
#include <catch2/catch_test_macros.hpp> #include <catch2/catch_test_macros.hpp>
#include "guecs/sfml/backend.hpp" #include "backend.hpp"
#include <fmt/core.h> #include <fmt/core.h>
#include <string> #include <string>
#include "parser.hpp" #include "parser.hpp"
TEST_CASE("parse a simple example", "[parsing]") { TEST_CASE("parse a simple example", "[parsing]") {
sfml::Backend backend; gui::Backend backend;
guecs::init(&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); REQUIRE(data->slides.size() > 0);
} }

Loading…
Cancel
Save