annotate 3rdparty/maddy/horizontallineparser.h @ 0:a4671277546c tip

created the repository for the thymian project
author ferencd
date Tue, 17 Aug 2021 11:19:54 +0200
parents
children
rev   line source
ferencd@0 1 /*
ferencd@0 2 * This project is licensed under the MIT license. For more information see the
ferencd@0 3 * LICENSE file.
ferencd@0 4 */
ferencd@0 5 #pragma once
ferencd@0 6
ferencd@0 7 // -----------------------------------------------------------------------------
ferencd@0 8
ferencd@0 9 #include <functional>
ferencd@0 10 #include <string>
ferencd@0 11 #include <regex>
ferencd@0 12
ferencd@0 13 #include "maddy/blockparser.h"
ferencd@0 14
ferencd@0 15 // -----------------------------------------------------------------------------
ferencd@0 16
ferencd@0 17 namespace maddy {
ferencd@0 18
ferencd@0 19 // -----------------------------------------------------------------------------
ferencd@0 20
ferencd@0 21 /**
ferencd@0 22 * HorizontalLineParser
ferencd@0 23 *
ferencd@0 24 * From Markdown: `---`
ferencd@0 25 *
ferencd@0 26 * To HTML: `<hr/>`
ferencd@0 27 *
ferencd@0 28 * @class
ferencd@0 29 */
ferencd@0 30 class HorizontalLineParser : public BlockParser
ferencd@0 31 {
ferencd@0 32 public:
ferencd@0 33 /**
ferencd@0 34 * ctor
ferencd@0 35 *
ferencd@0 36 * @method
ferencd@0 37 * @param {std::function<void(std::string&)>} parseLineCallback
ferencd@0 38 * @param {std::function<std::shared_ptr<BlockParser>(const std::string& line)>} getBlockParserForLineCallback
ferencd@0 39 */
ferencd@0 40 HorizontalLineParser(
ferencd@0 41 std::function<void(std::string&)> parseLineCallback,
ferencd@0 42 std::function<std::shared_ptr<BlockParser>(const std::string& line)> getBlockParserForLineCallback
ferencd@0 43 )
ferencd@0 44 : BlockParser(parseLineCallback, getBlockParserForLineCallback)
ferencd@0 45 , lineRegex("^---$")
ferencd@0 46 {}
ferencd@0 47
ferencd@0 48 /**
ferencd@0 49 * IsStartingLine
ferencd@0 50 *
ferencd@0 51 * If the line has exact three dashes `---`, then it is a horizontal line.
ferencd@0 52 *
ferencd@0 53 * @method
ferencd@0 54 * @param {const std::string&} line
ferencd@0 55 * @return {bool}
ferencd@0 56 */
ferencd@0 57 static bool
ferencd@0 58 IsStartingLine(const std::string& line)
ferencd@0 59 {
ferencd@0 60 static std::regex re("^---$");
ferencd@0 61 return std::regex_match(line, re);
ferencd@0 62 }
ferencd@0 63
ferencd@0 64 /**
ferencd@0 65 * IsFinished
ferencd@0 66 *
ferencd@0 67 * The horizontal line is always only one line long, so this method always
ferencd@0 68 * returns true.
ferencd@0 69 *
ferencd@0 70 * @method
ferencd@0 71 * @return {bool}
ferencd@0 72 */
ferencd@0 73 bool
ferencd@0 74 IsFinished() const override
ferencd@0 75 {
ferencd@0 76 return true;
ferencd@0 77 }
ferencd@0 78
ferencd@0 79 protected:
ferencd@0 80 bool
ferencd@0 81 isInlineBlockAllowed() const override
ferencd@0 82 {
ferencd@0 83 return false;
ferencd@0 84 }
ferencd@0 85
ferencd@0 86 bool
ferencd@0 87 isLineParserAllowed() const override
ferencd@0 88 {
ferencd@0 89 return false;
ferencd@0 90 }
ferencd@0 91
ferencd@0 92 void
ferencd@0 93 parseBlock(std::string& line) override
ferencd@0 94 {
ferencd@0 95 static std::string replacement = "<hr/>";
ferencd@0 96
ferencd@0 97 line = std::regex_replace(line, lineRegex, replacement);
ferencd@0 98 }
ferencd@0 99
ferencd@0 100 private:
ferencd@0 101 std::regex lineRegex;
ferencd@0 102 }; // class HorizontalLineParser
ferencd@0 103
ferencd@0 104 // -----------------------------------------------------------------------------
ferencd@0 105
ferencd@0 106 } // namespace maddy