ferencd@0: /* ferencd@0: * This project is licensed under the MIT license. For more information see the ferencd@0: * LICENSE file. ferencd@0: */ ferencd@0: #pragma once ferencd@0: ferencd@0: // ----------------------------------------------------------------------------- ferencd@0: ferencd@0: #include ferencd@0: #include ferencd@0: #include ferencd@0: ferencd@0: #include "maddy/blockparser.h" ferencd@0: ferencd@0: // ----------------------------------------------------------------------------- ferencd@0: ferencd@0: namespace maddy { ferencd@0: ferencd@0: // ----------------------------------------------------------------------------- ferencd@0: ferencd@0: /** ferencd@0: * QuoteParser ferencd@0: * ferencd@0: * @class ferencd@0: */ ferencd@0: class QuoteParser : public BlockParser ferencd@0: { ferencd@0: public: ferencd@0: /** ferencd@0: * ctor ferencd@0: * ferencd@0: * @method ferencd@0: * @param {std::function} parseLineCallback ferencd@0: * @param {std::function(const std::string& line)>} getBlockParserForLineCallback ferencd@0: */ ferencd@0: QuoteParser( ferencd@0: std::function parseLineCallback, ferencd@0: std::function(const std::string& line)> getBlockParserForLineCallback ferencd@0: ) ferencd@0: : BlockParser(parseLineCallback, getBlockParserForLineCallback) ferencd@0: , isStarted(false) ferencd@0: , isFinished(false) ferencd@0: {} ferencd@0: ferencd@0: /** ferencd@0: * IsStartingLine ferencd@0: * ferencd@0: * A quote starts with `> `. ferencd@0: * ferencd@0: * @method ferencd@0: * @param {const std::string&} line ferencd@0: * @return {bool} ferencd@0: */ ferencd@0: static bool ferencd@0: IsStartingLine(const std::string& line) ferencd@0: { ferencd@0: static std::regex re("^\\>.*"); ferencd@0: return std::regex_match(line, re); ferencd@0: } ferencd@0: ferencd@0: /** ferencd@0: * AddLine ferencd@0: * ferencd@0: * Adding a line which has to be parsed. ferencd@0: * ferencd@0: * @method ferencd@0: * @param {std::string&} line ferencd@0: * @return {void} ferencd@0: */ ferencd@0: void ferencd@0: AddLine(std::string& line) override ferencd@0: { ferencd@0: if (!this->isStarted) ferencd@0: { ferencd@0: this->result << "
"; ferencd@0: this->isStarted = true; ferencd@0: } ferencd@0: ferencd@0: bool finish = false; ferencd@0: if (line.empty()) ferencd@0: { ferencd@0: finish = true; ferencd@0: } ferencd@0: ferencd@0: this->parseBlock(line); ferencd@0: ferencd@0: if (this->isInlineBlockAllowed() && !this->childParser) ferencd@0: { ferencd@0: this->childParser = this->getBlockParserForLine(line); ferencd@0: } ferencd@0: ferencd@0: if (this->childParser) ferencd@0: { ferencd@0: this->childParser->AddLine(line); ferencd@0: ferencd@0: if (this->childParser->IsFinished()) ferencd@0: { ferencd@0: this->result << this->childParser->GetResult().str(); ferencd@0: this->childParser = nullptr; ferencd@0: } ferencd@0: ferencd@0: return; ferencd@0: } ferencd@0: ferencd@0: if (this->isLineParserAllowed()) ferencd@0: { ferencd@0: this->parseLine(line); ferencd@0: } ferencd@0: ferencd@0: if (finish) ferencd@0: { ferencd@0: this->result << "
"; ferencd@0: this->isFinished = true; ferencd@0: } ferencd@0: ferencd@0: this->result << line; ferencd@0: } ferencd@0: ferencd@0: /** ferencd@0: * IsFinished ferencd@0: * ferencd@0: * @method ferencd@0: * @return {bool} ferencd@0: */ ferencd@0: bool ferencd@0: IsFinished() const override ferencd@0: { ferencd@0: return this->isFinished; ferencd@0: } ferencd@0: ferencd@0: protected: ferencd@0: bool ferencd@0: isInlineBlockAllowed() const override ferencd@0: { ferencd@0: return true; ferencd@0: } ferencd@0: ferencd@0: bool ferencd@0: isLineParserAllowed() const override ferencd@0: { ferencd@0: return true; ferencd@0: } ferencd@0: ferencd@0: void ferencd@0: parseBlock(std::string& line) override ferencd@0: { ferencd@0: static std::regex lineRegexWithSpace("^\\> "); ferencd@0: line = std::regex_replace(line, lineRegexWithSpace, ""); ferencd@0: static std::regex lineRegexWithoutSpace("^\\>"); ferencd@0: line = std::regex_replace(line, lineRegexWithoutSpace, ""); ferencd@0: ferencd@0: if (!line.empty()) ferencd@0: { ferencd@0: line += " "; ferencd@0: } ferencd@0: } ferencd@0: ferencd@0: private: ferencd@0: bool isStarted; ferencd@0: bool isFinished; ferencd@0: }; // class QuoteParser ferencd@0: ferencd@0: // ----------------------------------------------------------------------------- ferencd@0: ferencd@0: } // namespace maddy