/* * Mirai. Copyright (C) 2024 Vyn * This file is licensed under version 3 of the GNU General Public License (GPL-3.0-only) * The license can be found in the LICENSE file or at https://www.gnu.org/licenses/gpl-3.0.txt */ #ifndef MIRAI_TODOTXT_H #define MIRAI_TODOTXT_H #include "TaskItem.h" #include "utils.h" #include #include #include #include #include #include #include #include namespace mirai { class TodoTxtFormat { public: static TaskList readFile() { std::ifstream file("../newqml/todo.txt"); if (!file.is_open()) { throw std::runtime_error("todo.txt file not found"); } std::vector taskItems; std::string line; while (std::getline(file, line)) { auto taskItem = parseLine(line); taskItems.push_back(taskItem); } file.close(); TaskList tasks({ .tasks = taskItems }); return tasks; } static void writeFile(TaskList& tasks) { std::ofstream file("../newqml/todo.txt"); if (!file.is_open()) { throw std::runtime_error("can't create todo.txt"); } for (const auto& task : tasks.getTasks()) { file << fieldWithSpace(task->state == DONE ? "x" : task->priority); file << fieldWithSpace(task->state == DONE ? task->getDate() : ""); file << fieldWithSpace(task->getCreationDate()); file << task->getText() << '\n'; } file.close(); } private: static std::string fieldWithSpace(const std::string& field) { if (field.length() == 0) return ""; return (field + " "); } static TaskItem parseLine(const std::string& line) { std::smatch matches; std::regex regex("(^x )?(\\([A-Z]\\) )?([0-9]{4}-[0-9]{2}-[0-9]{2} )?([0-9]{4}-[0-9]{2}-[0-9]{2} )?(.*)"); std::regex_match(line, matches, regex); for (size_t i = 0; i < matches.size(); ++i) { std::ssub_match sub_match = matches[i]; std::string piece = sub_match.str(); } const TaskItemState taskState = trim_copy(matches[1].str()) == "x" ? DONE : TODO; const std::string priority = trim_copy(matches[2].str()); const std::string firstDate = trim_copy(matches[3].str()); const std::string secondDate = trim_copy(matches[4].str()); const std::string text = trim_copy(matches[5].str()); const std::string date = taskState == DONE ? firstDate : ""; return { .text = text, .state = taskState, .date = date, }; } }; } #endif