aboutsummaryrefslogtreecommitdiff
path: root/ricochet/src/core/browser.cc
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-04-11 02:48:24 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-04-11 02:48:24 +0800
commit997415e3bad0b9ff37aa9abf930841e039695a27 (patch)
tree6ba7f867b4e56330ef0396f24824d4846f9dc88e /ricochet/src/core/browser.cc
parentbfb85334541e44cf03823fe8f0f80c89ee1feeba (diff)
downloadrcc-project-997415e3bad0b9ff37aa9abf930841e039695a27.tar.gz
rcc-project-997415e3bad0b9ff37aa9abf930841e039695a27.tar.xz
feat: implement HTML lexer and integrate tokenization into browser output
Diffstat (limited to 'ricochet/src/core/browser.cc')
-rw-r--r--ricochet/src/core/browser.cc50
1 files changed, 36 insertions, 14 deletions
diff --git a/ricochet/src/core/browser.cc b/ricochet/src/core/browser.cc
index ccda9a1..1e9d044 100644
--- a/ricochet/src/core/browser.cc
+++ b/ricochet/src/core/browser.cc
@@ -18,26 +18,48 @@
#include "ricochet/core/browser.hh"
#include "ricochet/net/http_client.hh"
+#include "ricochet/parser/html_lexer.hh"
#include <iostream>
+namespace {
+struct TokenPrinter {
+ void operator()(const ricochet::parser::TextToken& t) const {
+ std::cout << "[TEXT] " << t.content << "\n";
+ }
+ void operator()(const ricochet::parser::TagOpenToken& t) const {
+ std::cout << "[OPEN] <" << t.name << ">\n";
+ }
+ void operator()(const ricochet::parser::TagCloseToken& t) const {
+ std::cout << "[CLOSE] </" << t.name << ">\n";
+ }
+};
+} // namespace
namespace ricochet::core {
int Browser::run( std::string_view initial_url )
{
- std::cout << "Browser: Navigating to " << initial_url << "...\n";
-
- const net::HttpClient client;
- auto response_result = client.fetch( initial_url );
- if ( !response_result.has_value() ) {
- std::cerr << "[!] Ricochet failed to load page: " << response_result.error() << "\n";
- return 1;
- }
-
- const auto& response = response_result.value();
- std::cout << "\n[=== HTTP Status: " << response.status_code << " ===]\n";
- std::cout << "[=== HTML Content Below ===]\n\n";
- std::cout << response.body << "\n";
- return 0;
+ std::cout << "-> Fetching: " << initial_url << "...\n";
+
+ const net::HttpClient client;
+ auto response_result = client.fetch(initial_url);
+
+ if (!response_result.has_value()) {
+ std::cerr << "[!] Ricochet failed to load page: " << response_result.error() << "\n";
+ return 1;
+ }
+
+ const auto& response = response_result.value();
+ std::cout << "[=== HTTP Status: " << response.status_code << " ===]\n";
+
+ std::cout << "\n[=== Tokenizing HTML ===]\n";
+ const parser::HtmlLexer lexer;
+ auto tokens = lexer.tokenize(response.body);
+
+ for (const auto& token : tokens) {
+ std::visit(TokenPrinter{}, token);
+ }
+
+ return 0;
}
} // namespace ricochet::core