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