|
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
|
|
ferencd@0
|
12 #include "maddy/blockparser.h"
|
|
ferencd@0
|
13
|
|
ferencd@0
|
14 // -----------------------------------------------------------------------------
|
|
ferencd@0
|
15
|
|
ferencd@0
|
16 namespace maddy {
|
|
ferencd@0
|
17
|
|
ferencd@0
|
18 // -----------------------------------------------------------------------------
|
|
ferencd@0
|
19
|
|
ferencd@0
|
20 /**
|
|
ferencd@0
|
21 * HtmlParser
|
|
ferencd@0
|
22 *
|
|
ferencd@0
|
23 * @class
|
|
ferencd@0
|
24 */
|
|
ferencd@0
|
25 class HtmlParser : public BlockParser
|
|
ferencd@0
|
26 {
|
|
ferencd@0
|
27 public:
|
|
ferencd@0
|
28 /**
|
|
ferencd@0
|
29 * ctor
|
|
ferencd@0
|
30 *
|
|
ferencd@0
|
31 * @method
|
|
ferencd@0
|
32 * @param {std::function<void(std::string&)>} parseLineCallback
|
|
ferencd@0
|
33 * @param {std::function<std::shared_ptr<BlockParser>(const std::string& line)>} getBlockParserForLineCallback
|
|
ferencd@0
|
34 */
|
|
ferencd@0
|
35 HtmlParser(
|
|
ferencd@0
|
36 std::function<void(std::string&)> parseLineCallback,
|
|
ferencd@0
|
37 std::function<std::shared_ptr<BlockParser>(const std::string& line)> getBlockParserForLineCallback
|
|
ferencd@0
|
38 )
|
|
ferencd@0
|
39 : BlockParser(parseLineCallback, getBlockParserForLineCallback)
|
|
ferencd@0
|
40 , isStarted(false)
|
|
ferencd@0
|
41 , isFinished(false)
|
|
ferencd@0
|
42 , isGreaterThanFound(false)
|
|
ferencd@0
|
43 {}
|
|
ferencd@0
|
44
|
|
ferencd@0
|
45 /**
|
|
ferencd@0
|
46 * IsStartingLine
|
|
ferencd@0
|
47 *
|
|
ferencd@0
|
48 * If the line is starting with `<`, HTML is expected to follow.
|
|
ferencd@0
|
49 * Nothing after that will be parsed, it only is copied.
|
|
ferencd@0
|
50 *
|
|
ferencd@0
|
51 * @method
|
|
ferencd@0
|
52 * @param {const std::string&} line
|
|
ferencd@0
|
53 * @return {bool}
|
|
ferencd@0
|
54 */
|
|
ferencd@0
|
55 static bool
|
|
ferencd@0
|
56 IsStartingLine(const std::string& line)
|
|
ferencd@0
|
57 {
|
|
ferencd@0
|
58 return line[0] == '<';
|
|
ferencd@0
|
59 }
|
|
ferencd@0
|
60
|
|
ferencd@0
|
61 /**
|
|
ferencd@0
|
62 * IsFinished
|
|
ferencd@0
|
63 *
|
|
ferencd@0
|
64 * `>` followed by an empty line will end the HTML block.
|
|
ferencd@0
|
65 *
|
|
ferencd@0
|
66 * @method
|
|
ferencd@0
|
67 * @return {bool}
|
|
ferencd@0
|
68 */
|
|
ferencd@0
|
69 bool
|
|
ferencd@0
|
70 IsFinished() const override
|
|
ferencd@0
|
71 {
|
|
ferencd@0
|
72 return this->isFinished;
|
|
ferencd@0
|
73 }
|
|
ferencd@0
|
74
|
|
ferencd@0
|
75 protected:
|
|
ferencd@0
|
76 bool
|
|
ferencd@0
|
77 isInlineBlockAllowed() const override
|
|
ferencd@0
|
78 {
|
|
ferencd@0
|
79 return false;
|
|
ferencd@0
|
80 }
|
|
ferencd@0
|
81
|
|
ferencd@0
|
82 bool
|
|
ferencd@0
|
83 isLineParserAllowed() const override
|
|
ferencd@0
|
84 {
|
|
ferencd@0
|
85 return false;
|
|
ferencd@0
|
86 }
|
|
ferencd@0
|
87
|
|
ferencd@0
|
88 void
|
|
ferencd@0
|
89 parseBlock(std::string& line) override
|
|
ferencd@0
|
90 {
|
|
ferencd@0
|
91 if (!this->isStarted)
|
|
ferencd@0
|
92 {
|
|
ferencd@0
|
93 this->isStarted = true;
|
|
ferencd@0
|
94 }
|
|
ferencd@0
|
95
|
|
ferencd@0
|
96 if (!line.empty() && line[line.size() - 1] == '>')
|
|
ferencd@0
|
97 {
|
|
ferencd@0
|
98 this->isGreaterThanFound = true;
|
|
ferencd@0
|
99 return;
|
|
ferencd@0
|
100 }
|
|
ferencd@0
|
101
|
|
ferencd@0
|
102 if (line.empty() && this->isGreaterThanFound)
|
|
ferencd@0
|
103 {
|
|
ferencd@0
|
104 this->isFinished = true;
|
|
ferencd@0
|
105 return;
|
|
ferencd@0
|
106 }
|
|
ferencd@0
|
107
|
|
ferencd@0
|
108 if (!line.empty() && this->isGreaterThanFound)
|
|
ferencd@0
|
109 {
|
|
ferencd@0
|
110 this->isGreaterThanFound = false;
|
|
ferencd@0
|
111 }
|
|
ferencd@0
|
112
|
|
ferencd@0
|
113 if (!line.empty())
|
|
ferencd@0
|
114 {
|
|
ferencd@0
|
115 line += " ";
|
|
ferencd@0
|
116 }
|
|
ferencd@0
|
117 }
|
|
ferencd@0
|
118
|
|
ferencd@0
|
119 private:
|
|
ferencd@0
|
120 bool isStarted;
|
|
ferencd@0
|
121 bool isFinished;
|
|
ferencd@0
|
122 bool isGreaterThanFound;
|
|
ferencd@0
|
123 }; // class HtmlParser
|
|
ferencd@0
|
124
|
|
ferencd@0
|
125 // -----------------------------------------------------------------------------
|
|
ferencd@0
|
126
|
|
ferencd@0
|
127 } // namespace maddy
|