Line data Source code
1 : /**
2 : Copyright (c) 2024 Stappler LLC <admin@stappler.dev>
3 :
4 : Permission is hereby granted, free of charge, to any person obtaining a copy
5 : of this software and associated documentation files (the "Software"), to deal
6 : in the Software without restriction, including without limitation the rights
7 : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 : copies of the Software, and to permit persons to whom the Software is
9 : furnished to do so, subject to the following conditions:
10 :
11 : The above copyright notice and this permission notice shall be included in
12 : all copies or substantial portions of the Software.
13 :
14 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 : AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 : LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 : OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 : THE SOFTWARE.
21 : **/
22 :
23 : #ifndef EXTRA_WEBSERVER_PUG_SPPUGLEXER_H_
24 : #define EXTRA_WEBSERVER_PUG_SPPUGLEXER_H_
25 :
26 : #include "SPPugToken.h"
27 :
28 : namespace STAPPLER_VERSIONIZED stappler::pug {
29 :
30 : struct Lexer {
31 : using OutStream = Callback<void(StringView)>;
32 :
33 : Lexer(const StringView &, const OutStream & = nullptr);
34 :
35 : bool perform(const OutStream &);
36 : bool parseToken(const OutStream &, Token &);
37 :
38 : bool readAttributes(const OutStream &, Token *, StringView &) const;
39 : bool readOutputExpression(Token *, StringView &) const;
40 : bool readTagInfo(const OutStream &, Token *, StringView &, bool interpolated = false) const;
41 : bool readCode(Token *, StringView &) const;
42 : bool readCodeBlock(Token *, StringView &) const;
43 :
44 : bool readPlainTextInterpolation(const OutStream &errCb, Token *, StringView &, bool interpolated = false) const;
45 :
46 : Token *readLine(const OutStream &errCb, const StringView &line, StringView &, Token *rootLine);
47 : Token *readPlainLine(const OutStream &errCb, const StringView &line, StringView &);
48 : Token *readCommonLine(const OutStream &errCb, const StringView &line, StringView &);
49 : Token *readKeywordLine(const OutStream &errCb, const StringView &line, StringView &);
50 :
51 : bool onError(const OutStream &, const StringView &r, const StringView &) const;
52 :
53 525 : operator bool () const { return success; }
54 :
55 : uint32_t offset = 0;
56 : uint32_t lineOffset = 0;
57 :
58 : uint32_t indentStep = maxOf<uint32_t>();
59 : uint32_t indentLevel = 0;
60 :
61 : bool success = false;
62 :
63 : StringView content;
64 : Token root;
65 : };
66 :
67 : }
68 :
69 : #endif /* EXTRA_WEBSERVER_PUG_SPPUGLEXER_H_ */
|