Compare commits

...

3 Commits

Author SHA1 Message Date
51943a5123 Use hpp 2025-01-24 14:05:10 +01:00
0014abc9c7 Add caching 2025-01-24 14:04:42 +01:00
e91759c70d Add no-pretty 2025-01-24 13:43:10 +01:00
10 changed files with 128 additions and 33 deletions

View File

@ -8,9 +8,11 @@ add_executable(${PROJECT_NAME}
stringutil.hpp
stringutil.cpp
Tui.cpp
Tui.h
Command.h
Tui.hpp
Command.hpp
Command.cpp
Pager.cpp
Pager.hpp
)
target_link_libraries(${PROJECT_NAME} PRIVATE LibXml2::LibXml2 cpr::cpr)

View File

@ -6,7 +6,7 @@
// Author: Love Billenius <lovebillenius@disroot.org>
// License: GPL-3
#include "Command.h"
#include "Command.hpp"
#include <iostream>

View File

@ -48,16 +48,6 @@ void italize_numbers(std::string &content, size_t leave_chars = 0) {
}
}
void pretty_format_page(std::string &content) {
content.insert(0, ansi::BOLD);
size_t line_end = content.find('\n');
if (line_end == std::string::npos)
line_end = content.size();
content.insert(line_end, ansi::CLEAR);
italize_numbers(content, line_end + ansi::CLEAR.size());
}
Page::Page(const int number): m_number(number), m_subpage(fetchSubpage()) {
}
@ -77,6 +67,18 @@ Page &Page::operator-=(int) {
}
std::string Page::str_pretty() const {
std::string content = str();
content.insert(0, ansi::BOLD);
size_t line_end = content.find('\n');
if (line_end == std::string::npos)
line_end = content.size();
content.insert(line_end, ansi::CLEAR);
italize_numbers(content, line_end + ansi::CLEAR.size());
return content;
}
std::string Page::str() const {
std::string ret;
std::istringstream stream(m_subpage);
@ -87,7 +89,6 @@ std::string Page::str_pretty() const {
string_utils::limitConsecutiveWhitespace(ret, MAX_WHITESPACE);
string_utils::removeTrailingWhitespace(ret);
pretty_format_page(ret);
return ret;
}

View File

@ -33,6 +33,8 @@ public:
[[nodiscard]] std::string str_pretty() const;
[[nodiscard]] std::string str() const;
bool refresh();
private:

50
src/Pager.cpp Normal file
View File

@ -0,0 +1,50 @@
// _____ _ _____
// |_ _|____ _| ||_ _|_ __
// | |/ _ \ \/ / __|| | \ \ / /
// | | __/> <| |_ | | \ V /
// |_|\___/_/\_\\__||_| \_/
// Author: Love Billenius <lovebillenius@disroot.org>
// License: GPL-3
#include "Pager.hpp"
Page &Pager::seek(const int number) {
Page &page = get_page_at(number);
m_page_number = number;
return page;
}
Pager &Pager::operator+=(const int number) {
seek(m_page_number + number);
return *this;
}
Pager &Pager::operator-=(const int number) {
seek(m_page_number - number);
return *this;
}
Page &Pager::operator*() {
return get_page_at(m_page_number);
}
Page *Pager::operator->() {
return &get_page_at(m_page_number);
}
void Pager::set(const int number) {
m_page_number = number;
}
void Pager::clear() {
m_pages.clear();
}
Page &Pager::get_page_at(const int number) {
if (!m_pages.contains(number)) {
const Page p(number);
m_pages[number] = p;
}
return m_pages.at(number);
}

41
src/Pager.hpp Normal file
View File

@ -0,0 +1,41 @@
// _____ _ _____
// |_ _|____ _| ||_ _|_ __
// | |/ _ \ \/ / __|| | \ \ / /
// | | __/> <| |_ | | \ V /
// |_|\___/_/\_\\__||_| \_/
// Author: Love Billenius <lovebillenius@disroot.org>
// License: GPL-3
#pragma once
#include <unordered_map>
#include "Page.hpp"
class Pager {
public:
Pager() = default;
Page &seek(int number);
Pager &operator+=(int number);
Pager &operator-=(int number);
Page &operator*();
Page *operator->();
void set(int number);
Page &get();
void clear();
private:
Page &get_page_at(int number);
private:
std::unordered_map<int, Page> m_pages{};
int m_page_number = 100;
};

View File

@ -6,19 +6,19 @@
// Author: Love Billenius <lovebillenius@disroot.org>
// License: GPL-3
#include "Tui.h"
#include "Tui.hpp"
#include <iostream>
#include <optional>
#include <ostream>
#include <utility>
#include "Command.h"
#include "Command.hpp"
#include "Pager.hpp"
Tui::Tui(Page page) : m_page(std::move(page)) {
Tui::Tui(Pager pager) : m_pager(std::move(pager)) {
}
std::optional<int> get_page_number(const std::string_view line) {
const size_t space = line.find_first_of(' ');
if (space == std::string::npos)
@ -50,7 +50,7 @@ void printHelp() {
}
void Tui::run() {
std::cout << m_page.str_pretty() << std::endl;
std::cout << m_pager->str_pretty() << std::endl;
for (;;) {
std::cout << "Enter a command: ";
std::flush(std::cout);
@ -71,23 +71,23 @@ void Tui::run() {
std::cout << "Invalid command!" << std::endl;
} else if constexpr (std::is_same_v<T, Command::Next>) {
try {
m_page += 1;
m_pager += 1;
} catch (const std::runtime_error &e) {
std::cout << e.what() << std::endl;
return;
}
std::cout << m_page.str_pretty() << std::endl;
std::cout << m_pager->str_pretty() << std::endl;
} else if constexpr (std::is_same_v<T, Command::Previous>) {
try {
m_page -= 1;
m_pager -= 1;
} catch (const std::runtime_error &e) {
std::cout << e.what() << std::endl;
return;
}
std::cout << m_page.str_pretty() << std::endl;
std::cout << m_pager->str_pretty() << std::endl;
} else if constexpr (std::is_same_v<T, Command::Refresh>) {
m_page.refresh();
std::cout << m_page.str_pretty() << std::endl;
m_pager.clear();
std::cout << m_pager->str_pretty() << std::endl;
} else if constexpr (std::is_same_v<T, Command::Exit>) {
should_exit = true;
} else if constexpr (std::is_same_v<T, Command::Help>) {
@ -96,12 +96,12 @@ void Tui::run() {
const Command::Seek &seek = arg;
const int number = seek.number;
try {
m_page = Page(number);
m_pager.seek(number);
} catch (const std::runtime_error &e) {
std::cout << e.what() << std::endl;
return;
}
std::cout << m_page.str_pretty() << std::endl;
std::cout << m_pager->str_pretty() << std::endl;
}
};
std::visit(visitor, command);

View File

@ -7,15 +7,15 @@
// License: GPL-3
#pragma once
#include "Page.hpp"
#include "Pager.hpp"
class Tui {
public:
Tui(Page page);
Tui(Pager pager);
void run();
private:
Page m_page;
Pager m_pager;
};

View File

@ -6,10 +6,9 @@
// Author: Love Billenius <lovebillenius@disroot.org>
// License: GPL-3
#include "Page.hpp"
#include "Tui.h"
#include "Tui.hpp"
int main(int argc, char *argv[]) {
Tui tui = Page();
Tui tui(Pager{});
tui.run();
}