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: * HeadlineParser ferencd@0: * ferencd@0: * From Markdown: ferencd@0: * ferencd@0: * ``` ferencd@0: * # Headline 1 ferencd@0: * ## Headline 2 ferencd@0: * ### Headline 3 ferencd@0: * #### Headline 4 ferencd@0: * ##### Headline 5 ferencd@0: * ###### Headline 6 ferencd@0: * ``` ferencd@0: * ferencd@0: * To HTML: ferencd@0: * ferencd@0: * ``` ferencd@0: *

Headline 1

ferencd@0: *

Headline 2

ferencd@0: *

Headline 3

ferencd@0: *

Headline 4

ferencd@0: *
Headline 5
ferencd@0: *
Headline 6
ferencd@0: * ``` ferencd@0: * ferencd@0: * @class ferencd@0: */ ferencd@0: class HeadlineParser : 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: HeadlineParser( ferencd@0: std::function parseLineCallback, ferencd@0: std::function(const std::string& line)> getBlockParserForLineCallback ferencd@0: ) ferencd@0: : BlockParser(parseLineCallback, getBlockParserForLineCallback) ferencd@0: {} ferencd@0: ferencd@0: /** ferencd@0: * IsStartingLine ferencd@0: * ferencd@0: * If the line starts with 1 - 6 `#`, then it is a headline. 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("^(?:#){1,6} (.*)"); ferencd@0: return std::regex_match(line, re); ferencd@0: } ferencd@0: ferencd@0: /** ferencd@0: * IsFinished ferencd@0: * ferencd@0: * The headline is always only one line long, so this method always returns ferencd@0: * true. ferencd@0: * ferencd@0: * @method ferencd@0: * @return {bool} ferencd@0: */ ferencd@0: bool ferencd@0: IsFinished() const override ferencd@0: { ferencd@0: return true; ferencd@0: } ferencd@0: ferencd@0: protected: ferencd@0: bool ferencd@0: isInlineBlockAllowed() const override ferencd@0: { ferencd@0: return false; ferencd@0: } ferencd@0: ferencd@0: bool ferencd@0: isLineParserAllowed() const override ferencd@0: { ferencd@0: return false; ferencd@0: } ferencd@0: ferencd@0: void ferencd@0: parseBlock(std::string& line) override ferencd@0: { ferencd@0: static std::vector hlRegex = { ferencd@0: std::regex("^# (.*)") ferencd@0: , std::regex("^(?:#){2} (.*)") ferencd@0: , std::regex("^(?:#){3} (.*)") ferencd@0: , std::regex("^(?:#){4} (.*)") ferencd@0: , std::regex("^(?:#){5} (.*)") ferencd@0: , std::regex("^(?:#){6} (.*)") ferencd@0: }; ferencd@0: static std::vector hlReplacement = { ferencd@0: "

$1

" ferencd@0: , "

$1

" ferencd@0: , "

$1

" ferencd@0: , "

$1

" ferencd@0: , "
$1
" ferencd@0: , "
$1
" ferencd@0: }; ferencd@0: ferencd@0: for (uint8_t i = 0; i < 6; ++i) ferencd@0: { ferencd@0: line = std::regex_replace(line, hlRegex[i], hlReplacement[i]); ferencd@0: } ferencd@0: } ferencd@0: }; // class HeadlineParser ferencd@0: ferencd@0: // ----------------------------------------------------------------------------- ferencd@0: ferencd@0: } // namespace maddy