Initial node rendering
This commit is contained in:
parent
3e90fdc0d1
commit
59c2cd5a9c
@ -19,9 +19,10 @@ add_subdirectory(external/raylib-cpp-4.5.1)
|
|||||||
|
|
||||||
add_subdirectory(external/utfcpp-3.2.5)
|
add_subdirectory(external/utfcpp-3.2.5)
|
||||||
|
|
||||||
add_executable(browser src/main.cpp src/fetch.cpp
|
add_executable(browser src/main.cpp
|
||||||
|
src/fetch.cpp
|
||||||
src/html_parse.cpp
|
src/html_parse.cpp
|
||||||
src/utf8.hpp)
|
src/html_render.cpp)
|
||||||
|
|
||||||
target_include_directories(browser PRIVATE external/raygui-4.0/src)
|
target_include_directories(browser PRIVATE external/raygui-4.0/src)
|
||||||
|
|
||||||
|
7
data/tests/html.html
Normal file
7
data/tests/html.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head></head>
|
||||||
|
<body>
|
||||||
|
Hello World!
|
||||||
|
</body>
|
||||||
|
</html>
|
31
src/html_render.cpp
Normal file
31
src/html_render.cpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#include "html_render.hpp"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace html {
|
||||||
|
|
||||||
|
void render_doc(const NodeDoc& doc, Bounds bounds, const raylib::Font& font)
|
||||||
|
{
|
||||||
|
for (const std::variant<NodeElem, Utf8String>& child : doc.children) {
|
||||||
|
if (const NodeElem* elem = std::get_if<NodeElem>(&child)) {
|
||||||
|
render_elem(*elem, bounds, font);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void render_elem(const NodeElem& elem, Bounds bounds, const raylib::Font& font)
|
||||||
|
{
|
||||||
|
if (const NodeElemReg* reg = std::get_if<NodeElemReg>(&elem.var)) {
|
||||||
|
Utf8String inner_str;
|
||||||
|
for (const std::variant<NodeElem, Utf8String>& inner : reg->inner) {
|
||||||
|
if (const Utf8String* str = std::get_if<Utf8String>(&inner)) {
|
||||||
|
inner_str += *str;
|
||||||
|
}
|
||||||
|
else if (const NodeElem* inner_elem = std::get_if<NodeElem>(&inner)) {
|
||||||
|
render_elem(*inner_elem, bounds, font);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DrawTextEx(font, inner_str.str(), { (float)bounds.left, (float)bounds.right }, 24, 1.0f, BLACK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
32
src/html_render.hpp
Normal file
32
src/html_render.hpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <variant>
|
||||||
|
|
||||||
|
#include <raylib-cpp.hpp>
|
||||||
|
|
||||||
|
#include "html_parse.hpp"
|
||||||
|
|
||||||
|
enum class BoundHintRel { shrink, grow };
|
||||||
|
|
||||||
|
using BoundHint = std::variant<int, BoundHintRel>;
|
||||||
|
|
||||||
|
namespace html {
|
||||||
|
|
||||||
|
struct BoundHints {
|
||||||
|
BoundHint left;
|
||||||
|
BoundHint right;
|
||||||
|
BoundHint top;
|
||||||
|
BoundHint bottom;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Bounds {
|
||||||
|
int left;
|
||||||
|
int right;
|
||||||
|
int top;
|
||||||
|
int bottom;
|
||||||
|
};
|
||||||
|
|
||||||
|
void render_doc(const NodeDoc& doc, Bounds bounds, const raylib::Font& font);
|
||||||
|
void render_elem(const NodeElem& elem, Bounds bounds, const raylib::Font& font);
|
||||||
|
|
||||||
|
}
|
13
src/main.cpp
13
src/main.cpp
@ -8,12 +8,13 @@
|
|||||||
#include <raylib-cpp.hpp>
|
#include <raylib-cpp.hpp>
|
||||||
|
|
||||||
#include "html_parse.hpp"
|
#include "html_parse.hpp"
|
||||||
|
#include "html_render.hpp"
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
init_curl();
|
init_curl();
|
||||||
|
|
||||||
std::optional<std::string> page_data = fetch_url("test://text.html");
|
std::optional<std::string> page_data = fetch_url("test://html.html");
|
||||||
// std::optional<std::string> page_data = fetch_url("https://example.com");
|
// std::optional<std::string> page_data = fetch_url("https://example.com");
|
||||||
|
|
||||||
SetConfigFlags(ConfigFlags::FLAG_WINDOW_RESIZABLE | ConfigFlags::FLAG_MSAA_4X_HINT | ConfigFlags ::FLAG_VSYNC_HINT);
|
SetConfigFlags(ConfigFlags::FLAG_WINDOW_RESIZABLE | ConfigFlags::FLAG_MSAA_4X_HINT | ConfigFlags ::FLAG_VSYNC_HINT);
|
||||||
@ -28,10 +29,11 @@ int main()
|
|||||||
|
|
||||||
bool is_editing_url = false;
|
bool is_editing_url = false;
|
||||||
// std::string url_input = "https://example.com";
|
// std::string url_input = "https://example.com";
|
||||||
std::string url_input = "test://text.html";
|
std::string url_input = "test://html.html";
|
||||||
url_input.reserve(1024);
|
url_input.reserve(1024);
|
||||||
float scroll_pos = 0.0f;
|
float scroll_pos = 0.0f;
|
||||||
|
|
||||||
|
std::optional<html::NodeDoc> doc;
|
||||||
if (page_data.has_value()) {
|
if (page_data.has_value()) {
|
||||||
html::Tokenizer tokenizer(page_data.value());
|
html::Tokenizer tokenizer(page_data.value());
|
||||||
std::vector<html::Token> tokens = tokenizer.tokenize();
|
std::vector<html::Token> tokens = tokenizer.tokenize();
|
||||||
@ -39,7 +41,7 @@ int main()
|
|||||||
// std::cout << token.to_string() << std::endl;
|
// std::cout << token.to_string() << std::endl;
|
||||||
// }
|
// }
|
||||||
html::Parser parser(std::move(tokens));
|
html::Parser parser(std::move(tokens));
|
||||||
html::NodeDoc doc = parser.parse();
|
doc = parser.parse();
|
||||||
std::cout << "HERE" << std::endl;
|
std::cout << "HERE" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,8 +63,9 @@ int main()
|
|||||||
|
|
||||||
scroll_pos += GetMouseWheelMove();
|
scroll_pos += GetMouseWheelMove();
|
||||||
|
|
||||||
if (page_data.has_value()) {
|
if (doc.has_value()) {
|
||||||
DrawTextEx(sans_font, page_data.value(), { 0, 20 + scroll_pos * 40 }, 24, 1.0f, BLACK);
|
html::render_doc(doc.value(), { 0, 20, GetScreenWidth(), GetScreenHeight() - 20 }, sans_font);
|
||||||
|
// DrawTextEx(sans_font, page_data.value(), { 0, 20 + scroll_pos * 40 }, 24, 1.0f, BLACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
|
16
src/utf8.hpp
16
src/utf8.hpp
@ -86,6 +86,11 @@ public:
|
|||||||
using Iterator = utf8::iterator<std::string::iterator>;
|
using Iterator = utf8::iterator<std::string::iterator>;
|
||||||
using ConstIterator = utf8::iterator<std::string::const_iterator>;
|
using ConstIterator = utf8::iterator<std::string::const_iterator>;
|
||||||
|
|
||||||
|
inline Utf8String()
|
||||||
|
: m_str()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
explicit inline Utf8String(std::string str)
|
explicit inline Utf8String(std::string str)
|
||||||
: m_str(std::move(str))
|
: m_str(std::move(str))
|
||||||
{
|
{
|
||||||
@ -114,11 +119,22 @@ public:
|
|||||||
return ConstIterator(m_str.end(), m_str.begin(), m_str.end());
|
return ConstIterator(m_str.end(), m_str.begin(), m_str.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] const std::string& str() const
|
||||||
|
{
|
||||||
|
return m_str;
|
||||||
|
}
|
||||||
|
|
||||||
bool operator==(const Utf8String& other) const
|
bool operator==(const Utf8String& other) const
|
||||||
{
|
{
|
||||||
return m_str == other.m_str;
|
return m_str == other.m_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Utf8String& operator+=(const Utf8String& other)
|
||||||
|
{
|
||||||
|
m_str += other.m_str;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t operator[](size_t index)
|
uint32_t operator[](size_t index)
|
||||||
{
|
{
|
||||||
auto it = begin();
|
auto it = begin();
|
||||||
|
Loading…
Reference in New Issue
Block a user