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",
"description": "A short presentation on Bezos."
"description": "A short presentation on Bezos.",
"font_file": "assets/text.otf"
}
===
# Bezos Slide Format

@ -1,5 +1,8 @@
#include "backend.hpp"
#include "dbc.hpp"
#include <string>
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<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 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;
}

@ -4,11 +4,20 @@
#include <string>
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<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[]) {
dbc::check(argc >= 2, "USAGE: bezos my_fucking_slides.md");
gui::Backend backend;
guecs::init(&backend);
auto backend = std::make_shared<gui::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 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();

@ -1,7 +1,8 @@
#line 1 "src/md_parser.rl"
#line 1 "..//src/md_parser.rl"
#include <fmt/core.h>
#include <iostream>
#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;

@ -1,5 +1,6 @@
#include <fmt/core.h>
#include <iostream>
#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);

@ -18,14 +18,15 @@ string load_file(const string& md_file) {
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);
Parser rp;
Parser rp(deck_done);
rp.parse(contents);
return rp.results();
}
Parser::Parser()
Parser::Parser(std::function<void(nlohmann::json&)> cb) :
deck_done(cb)
{
deck = make_shared<SlideDeck>();
}

@ -2,19 +2,22 @@
#include <memory>
#include <string>
#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 {
int last = 0;
bool error = false;
std::shared_ptr<SlideDeck> deck;
std::function<void(nlohmann::json&)> deck_done;
std::string title;
std::string content;
nlohmann::json config;
Parser();
Parser(std::function<void(nlohmann::json&)> cb);
bool parse(const std::string& input);
void finalize();
std::shared_ptr<SlideDeck> results() { return deck; }

@ -1,13 +1,16 @@
#include <catch2/catch_test_macros.hpp>
#include "guecs/sfml/backend.hpp"
#include "backend.hpp"
#include <fmt/core.h>
#include <string>
#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);
}

Loading…
Cancel
Save