Mercurial > thymian
annotate 3rdparty/maddy/codeblockparser.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 * CodeBlockParser |
| ferencd@0 | 23 * |
| ferencd@0 | 24 * From Markdown: 3 times surrounded code (without space in the beginning) |
| ferencd@0 | 25 * |
| ferencd@0 | 26 * ``` |
| ferencd@0 | 27 * ``` |
| ferencd@0 | 28 * some code |
| ferencd@0 | 29 * ``` |
| ferencd@0 | 30 * ``` |
| ferencd@0 | 31 * |
| ferencd@0 | 32 * To HTML: |
| ferencd@0 | 33 * |
| ferencd@0 | 34 * ``` |
| ferencd@0 | 35 * <pre><code> |
| ferencd@0 | 36 * some code |
| ferencd@0 | 37 * </code></pre> |
| ferencd@0 | 38 * ``` |
| ferencd@0 | 39 * |
| ferencd@0 | 40 * @class |
| ferencd@0 | 41 */ |
| ferencd@0 | 42 class CodeBlockParser : public BlockParser |
| ferencd@0 | 43 { |
| ferencd@0 | 44 public: |
| ferencd@0 | 45 /** |
| ferencd@0 | 46 * ctor |
| ferencd@0 | 47 * |
| ferencd@0 | 48 * @method |
| ferencd@0 | 49 * @param {std::function<void(std::string&)>} parseLineCallback |
| ferencd@0 | 50 * @param {std::function<std::shared_ptr<BlockParser>(const std::string& line)>} getBlockParserForLineCallback |
| ferencd@0 | 51 */ |
| ferencd@0 | 52 CodeBlockParser( |
| ferencd@0 | 53 std::function<void(std::string&)> parseLineCallback, |
| ferencd@0 | 54 std::function<std::shared_ptr<BlockParser>(const std::string& line)> getBlockParserForLineCallback |
| ferencd@0 | 55 ) |
| ferencd@0 | 56 : BlockParser(parseLineCallback, getBlockParserForLineCallback) |
| ferencd@0 | 57 , isStarted(false) |
| ferencd@0 | 58 , isFinished(false) |
| ferencd@0 | 59 {} |
| ferencd@0 | 60 |
| ferencd@0 | 61 /** |
| ferencd@0 | 62 * IsStartingLine |
| ferencd@0 | 63 * |
| ferencd@0 | 64 * If the line starts with three code signs, then it is a code block. |
| ferencd@0 | 65 * |
| ferencd@0 | 66 * ``` |
| ferencd@0 | 67 * ``` |
| ferencd@0 | 68 * ``` |
| ferencd@0 | 69 * |
| ferencd@0 | 70 * @method |
| ferencd@0 | 71 * @param {const std::string&} line |
| ferencd@0 | 72 * @return {bool} |
| ferencd@0 | 73 */ |
| ferencd@0 | 74 static bool |
| ferencd@0 | 75 IsStartingLine(const std::string& line) |
| ferencd@0 | 76 { |
| ferencd@0 | 77 static std::regex re("^(?:`){3}$"); |
| ferencd@0 | 78 return std::regex_match(line, re); |
| ferencd@0 | 79 } |
| ferencd@0 | 80 |
| ferencd@0 | 81 /** |
| ferencd@0 | 82 * IsFinished |
| ferencd@0 | 83 * |
| ferencd@0 | 84 * @method |
| ferencd@0 | 85 * @return {bool} |
| ferencd@0 | 86 */ |
| ferencd@0 | 87 bool |
| ferencd@0 | 88 IsFinished() const override |
| ferencd@0 | 89 { |
| ferencd@0 | 90 return this->isFinished; |
| ferencd@0 | 91 } |
| ferencd@0 | 92 |
| ferencd@0 | 93 protected: |
| ferencd@0 | 94 bool |
| ferencd@0 | 95 isInlineBlockAllowed() const override |
| ferencd@0 | 96 { |
| ferencd@0 | 97 return false; |
| ferencd@0 | 98 } |
| ferencd@0 | 99 |
| ferencd@0 | 100 bool |
| ferencd@0 | 101 isLineParserAllowed() const override |
| ferencd@0 | 102 { |
| ferencd@0 | 103 return false; |
| ferencd@0 | 104 } |
| ferencd@0 | 105 |
| ferencd@0 | 106 void |
| ferencd@0 | 107 parseBlock(std::string& line) override |
| ferencd@0 | 108 { |
| ferencd@0 | 109 if (line == "```") |
| ferencd@0 | 110 { |
| ferencd@0 | 111 if (!this->isStarted) |
| ferencd@0 | 112 { |
| ferencd@0 | 113 line = "<pre><code>\n"; |
| ferencd@0 | 114 this->isStarted = true; |
| ferencd@0 | 115 this->isFinished = false; |
| ferencd@0 | 116 return; |
| ferencd@0 | 117 } |
| ferencd@0 | 118 else |
| ferencd@0 | 119 { |
| ferencd@0 | 120 line = "</code></pre>"; |
| ferencd@0 | 121 this->isFinished = true; |
| ferencd@0 | 122 this->isStarted = false; |
| ferencd@0 | 123 return; |
| ferencd@0 | 124 } |
| ferencd@0 | 125 } |
| ferencd@0 | 126 |
| ferencd@0 | 127 line += "\n"; |
| ferencd@0 | 128 } |
| ferencd@0 | 129 |
| ferencd@0 | 130 private: |
| ferencd@0 | 131 bool isStarted; |
| ferencd@0 | 132 bool isFinished; |
| ferencd@0 | 133 }; // class CodeBlockParser |
| ferencd@0 | 134 |
| ferencd@0 | 135 // ----------------------------------------------------------------------------- |
| ferencd@0 | 136 |
| ferencd@0 | 137 } // namespace maddy |
