From 7d3c9ec7368a5d25235e818c2c147ba7e89f6567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Gassmann?= Date: Sun, 27 Feb 2022 14:06:15 +0100 Subject: [+] Added base project --- inc/maddy/orderedlistparser.h | 142 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 inc/maddy/orderedlistparser.h (limited to 'inc/maddy/orderedlistparser.h') diff --git a/inc/maddy/orderedlistparser.h b/inc/maddy/orderedlistparser.h new file mode 100644 index 0000000..e41d3b1 --- /dev/null +++ b/inc/maddy/orderedlistparser.h @@ -0,0 +1,142 @@ +/* + * This project is licensed under the MIT license. For more information see the + * LICENSE file. + */ +#pragma once + +// ----------------------------------------------------------------------------- + +#include +#include +#include + +#include "maddy/blockparser.h" + +// ----------------------------------------------------------------------------- + +namespace maddy { + +// ----------------------------------------------------------------------------- + +/** + * OrderedListParser + * + * @class + */ +class OrderedListParser : public BlockParser +{ +public: + /** + * ctor + * + * @method + * @param {std::function} parseLineCallback + * @param {std::function(const std::string& line)>} getBlockParserForLineCallback + */ + OrderedListParser( + std::function parseLineCallback, + std::function(const std::string& line)> getBlockParserForLineCallback + ) + : BlockParser(parseLineCallback, getBlockParserForLineCallback) + , isStarted(false) + , isFinished(false) + {} + + /** + * IsStartingLine + * + * An ordered list starts with `1. `. + * + * @method + * @param {const std::string&} line + * @return {bool} + */ + static bool + IsStartingLine(const std::string& line) + { + static std::regex re("^1\\. .*"); + return std::regex_match(line, re); + } + + /** + * IsFinished + * + * @method + * @return {bool} + */ + bool + IsFinished() const override + { + return this->isFinished; + } + +protected: + bool + isInlineBlockAllowed() const override + { + return true; + } + + bool + isLineParserAllowed() const override + { + return true; + } + + void + parseBlock(std::string& line) override + { + bool isStartOfNewListItem = this->isStartOfNewListItem(line); + uint32_t indentation = getIndentationWidth(line); + + static std::regex orderedlineRegex("^[1-9]+[0-9]*\\. "); + line = std::regex_replace(line, orderedlineRegex, ""); + static std::regex unorderedlineRegex("^\\* "); + line = std::regex_replace(line, unorderedlineRegex, ""); + + if (!this->isStarted) + { + line = "
  1. " + line; + this->isStarted = true; + return; + } + + if (indentation >= 2) + { + line = line.substr(2); + return; + } + + if ( + line.empty() || + line.find("
  2. ") != std::string::npos || + line.find("
") != std::string::npos || + line.find("") != std::string::npos + ) + { + line = "" + line; + this->isFinished = true; + return; + } + + if (isStartOfNewListItem) + { + line = "
  • " + line; + } + } + +private: + bool isStarted; + bool isFinished; + + bool + isStartOfNewListItem(const std::string& line) const + { + static std::regex re("^(?:[1-9]+[0-9]*\\. |\\* ).*"); + return std::regex_match(line, re); + } +}; // class OrderedListParser + +// ----------------------------------------------------------------------------- + +} // namespace maddy -- cgit v1.2.3