Mercurial > thymian
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 |
