bbcode-compiler 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -0
  3. package/dist/generateHtml.d.ts +2 -0
  4. package/dist/generateHtml.d.ts.map +1 -0
  5. package/dist/generateHtml.js +13 -0
  6. package/dist/generateHtml.js.map +1 -0
  7. package/dist/generator/Generator.d.ts +8 -0
  8. package/dist/generator/Generator.d.ts.map +1 -0
  9. package/dist/generator/Generator.js +54 -0
  10. package/dist/generator/Generator.js.map +1 -0
  11. package/dist/generator/transforms/Transform.d.ts +10 -0
  12. package/dist/generator/transforms/Transform.d.ts.map +1 -0
  13. package/dist/generator/transforms/Transform.js +2 -0
  14. package/dist/generator/transforms/Transform.js.map +1 -0
  15. package/dist/generator/transforms/htmlTransforms.d.ts +3 -0
  16. package/dist/generator/transforms/htmlTransforms.d.ts.map +1 -0
  17. package/dist/generator/transforms/htmlTransforms.js +198 -0
  18. package/dist/generator/transforms/htmlTransforms.js.map +1 -0
  19. package/dist/generator/utils/getTagImmediateAttrVal.d.ts +14 -0
  20. package/dist/generator/utils/getTagImmediateAttrVal.d.ts.map +1 -0
  21. package/dist/generator/utils/getTagImmediateAttrVal.js +19 -0
  22. package/dist/generator/utils/getTagImmediateAttrVal.js.map +1 -0
  23. package/dist/generator/utils/getTagImmediateText.d.ts +12 -0
  24. package/dist/generator/utils/getTagImmediateText.d.ts.map +1 -0
  25. package/dist/generator/utils/getTagImmediateText.js +29 -0
  26. package/dist/generator/utils/getTagImmediateText.js.map +1 -0
  27. package/dist/generator/utils/getWidthHeightAttr.d.ts +31 -0
  28. package/dist/generator/utils/getWidthHeightAttr.d.ts.map +1 -0
  29. package/dist/generator/utils/getWidthHeightAttr.js +47 -0
  30. package/dist/generator/utils/getWidthHeightAttr.js.map +1 -0
  31. package/dist/generator/utils/isDangerousUrl.d.ts +2 -0
  32. package/dist/generator/utils/isDangerousUrl.d.ts.map +1 -0
  33. package/dist/generator/utils/isDangerousUrl.js +14 -0
  34. package/dist/generator/utils/isDangerousUrl.js.map +1 -0
  35. package/dist/generator/utils/isOrderedList.d.ts +19 -0
  36. package/dist/generator/utils/isOrderedList.d.ts.map +1 -0
  37. package/dist/generator/utils/isOrderedList.js +26 -0
  38. package/dist/generator/utils/isOrderedList.js.map +1 -0
  39. package/dist/index.d.ts +16 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +16 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/lexer/Lexer.d.ts +5 -0
  44. package/dist/lexer/Lexer.d.ts.map +1 -0
  45. package/dist/lexer/Lexer.js +81 -0
  46. package/dist/lexer/Lexer.js.map +1 -0
  47. package/dist/lexer/Token.d.ts +8 -0
  48. package/dist/lexer/Token.d.ts.map +1 -0
  49. package/dist/lexer/Token.js +54 -0
  50. package/dist/lexer/Token.js.map +1 -0
  51. package/dist/lexer/TokenType.d.ts +17 -0
  52. package/dist/lexer/TokenType.d.ts.map +1 -0
  53. package/dist/lexer/TokenType.js +41 -0
  54. package/dist/lexer/TokenType.js.map +1 -0
  55. package/dist/parser/AstNode.d.ts +105 -0
  56. package/dist/parser/AstNode.d.ts.map +1 -0
  57. package/dist/parser/AstNode.js +263 -0
  58. package/dist/parser/AstNode.js.map +1 -0
  59. package/dist/parser/Parser.d.ts +11 -0
  60. package/dist/parser/Parser.d.ts.map +1 -0
  61. package/dist/parser/Parser.js +265 -0
  62. package/dist/parser/Parser.js.map +1 -0
  63. package/dist/parser/nodeIsType.d.ts +13 -0
  64. package/dist/parser/nodeIsType.d.ts.map +1 -0
  65. package/dist/parser/nodeIsType.js +5 -0
  66. package/dist/parser/nodeIsType.js.map +1 -0
  67. package/package.json +68 -0
  68. package/src/generateHtml.ts +15 -0
  69. package/src/generator/Generator.ts +60 -0
  70. package/src/generator/transforms/Transform.ts +15 -0
  71. package/src/generator/transforms/htmlTransforms.ts +205 -0
  72. package/src/generator/utils/getTagImmediateAttrVal.ts +21 -0
  73. package/src/generator/utils/getTagImmediateText.ts +33 -0
  74. package/src/generator/utils/getWidthHeightAttr.ts +51 -0
  75. package/src/generator/utils/isDangerousUrl.ts +17 -0
  76. package/src/generator/utils/isOrderedList.ts +28 -0
  77. package/src/index.ts +18 -0
  78. package/src/lexer/Lexer.ts +89 -0
  79. package/src/lexer/Token.ts +64 -0
  80. package/src/lexer/TokenType.ts +65 -0
  81. package/src/parser/AstNode.ts +338 -0
  82. package/src/parser/Parser.ts +316 -0
  83. package/src/parser/nodeIsType.ts +15 -0
@@ -0,0 +1,263 @@
1
+ /**
2
+
3
+ Haven't formally verified this grammar but it should be LL(2)
4
+
5
+ The root's intermediate state has StartTag/EndTag because it's easier to first parse them as independant nodes
6
+ than to parse a StartTag and find the matching EndTag since we can only lookahead by 1 token
7
+
8
+ Trying to lookahead by 4 tokens after each advancement to determine the end of the sub-root will greatly affect performance
9
+ 1 "["
10
+ 2 "/"
11
+ 3 "LABEL"
12
+ 4 "]"
13
+
14
+ ---
15
+
16
+ Root <- (Text | Linebreak | Tag)*
17
+
18
+ Text <-
19
+ | {XSS Characters}.
20
+ | STR.
21
+
22
+ Linebreak <-
23
+ | LINEBREAK.
24
+
25
+ Tag <- StartTag Root EndTag
26
+ StartTag <- L_BRACKET Text Attr* R_BRACKET
27
+ EndTag <- L_BRACKET BACKSLASH Text R_BRACKET
28
+
29
+ Attr <-
30
+ | STR EQUALS STR
31
+ | EQUALS STR
32
+ | STR
33
+
34
+ */
35
+ import { nodeIsType } from './nodeIsType';
36
+ export function nodeTypeToString(nodeType) {
37
+ switch (nodeType) {
38
+ case 0 /* AstNodeType.RootNode */: return 'RootNode';
39
+ case 1 /* AstNodeType.TextNode */: return 'TextNode';
40
+ case 2 /* AstNodeType.LinebreakNode */: return 'LinebreakNode';
41
+ case 3 /* AstNodeType.TagNode */: return 'TagNode';
42
+ case 4 /* AstNodeType.StartTagNode */: return 'StartTagNode';
43
+ case 5 /* AstNodeType.EndTagNode */: return 'EndTagNode';
44
+ case 6 /* AstNodeType.AttrNode */: return 'AttrNode';
45
+ }
46
+ }
47
+ export class AstNode {
48
+ constructor(children = []) {
49
+ this.children = children;
50
+ }
51
+ addChild(node) {
52
+ this.children.push(node);
53
+ }
54
+ isValid() {
55
+ for (const child of this.children) {
56
+ if (!child.isValid()) {
57
+ return false;
58
+ }
59
+ }
60
+ return true;
61
+ }
62
+ toShortString() {
63
+ return nodeTypeToString(this.nodeType);
64
+ }
65
+ // For debugging purposes only
66
+ // Pretty-prints AST
67
+ toString(depth = 0) {
68
+ let s = ' '.repeat(depth * 2) + this.toShortString();
69
+ for (const child of this.children) {
70
+ s += '\n' + child.toString(depth + 1);
71
+ }
72
+ return s;
73
+ }
74
+ }
75
+ // ----------------------------------------------------------------------------
76
+ // Root
77
+ // ----------------------------------------------------------------------------
78
+ export class RootNode extends AstNode {
79
+ constructor() {
80
+ super(...arguments);
81
+ this.nodeType = 0 /* AstNodeType.RootNode */;
82
+ }
83
+ isValid() {
84
+ for (const child of this.children) {
85
+ if (child.nodeType !== 3 /* AstNodeType.TagNode */ &&
86
+ child.nodeType !== 1 /* AstNodeType.TextNode */ &&
87
+ child.nodeType !== 2 /* AstNodeType.LinebreakNode */) {
88
+ return false;
89
+ }
90
+ }
91
+ return super.isValid() && this.children.length > 0;
92
+ }
93
+ }
94
+ // ----------------------------------------------------------------------------
95
+ // Text
96
+ // ----------------------------------------------------------------------------
97
+ export class TextNode extends AstNode {
98
+ constructor(str) {
99
+ super();
100
+ this.nodeType = 1 /* AstNodeType.TextNode */;
101
+ this.str = str;
102
+ }
103
+ isValid() {
104
+ return super.isValid() && this.children.length === 0;
105
+ }
106
+ toShortString() {
107
+ return `${super.toShortString()} "${this.str}"`;
108
+ }
109
+ }
110
+ export class LinebreakNode extends AstNode {
111
+ constructor() {
112
+ super(...arguments);
113
+ this.nodeType = 2 /* AstNodeType.LinebreakNode */;
114
+ }
115
+ toShortString() {
116
+ return `${super.toShortString()} "\\n"`;
117
+ }
118
+ }
119
+ // ----------------------------------------------------------------------------
120
+ // Tag
121
+ // ----------------------------------------------------------------------------
122
+ export class StartTagNode extends AstNode {
123
+ constructor(tagName, ogTag, attrNodes = []) {
124
+ super(attrNodes);
125
+ this.nodeType = 4 /* AstNodeType.StartTagNode */;
126
+ this.tagName = tagName.toLowerCase();
127
+ this.ogTag = ogTag;
128
+ }
129
+ isValid() {
130
+ for (const child of this.children) {
131
+ if (child.nodeType !== 6 /* AstNodeType.AttrNode */) {
132
+ return false;
133
+ }
134
+ }
135
+ return super.isValid();
136
+ }
137
+ toShortString() {
138
+ return `${super.toShortString()} ${this.ogTag}`;
139
+ }
140
+ }
141
+ export class EndTagNode extends AstNode {
142
+ constructor(tagName, ogTag) {
143
+ super();
144
+ this.nodeType = 5 /* AstNodeType.EndTagNode */;
145
+ this.tagName = tagName;
146
+ this.ogTag = ogTag;
147
+ }
148
+ isValid() {
149
+ return super.isValid() && this.children.length === 0;
150
+ }
151
+ toShortString() {
152
+ return `${super.toShortString()} ${this.ogTag}`;
153
+ }
154
+ }
155
+ export class TagNode extends AstNode {
156
+ constructor(startTag, endTag) {
157
+ super();
158
+ this.nodeType = 3 /* AstNodeType.TagNode */;
159
+ this._startTag = startTag;
160
+ this._endTag = endTag;
161
+ }
162
+ get tagName() {
163
+ return this._startTag.tagName;
164
+ }
165
+ get attributes() {
166
+ return this._startTag.children;
167
+ }
168
+ get ogStartTag() {
169
+ return this._startTag.ogTag;
170
+ }
171
+ get ogEndTag() {
172
+ if (!this._endTag) {
173
+ return '';
174
+ }
175
+ if (nodeIsType(this._endTag, 2 /* AstNodeType.LinebreakNode */)) {
176
+ return '\n';
177
+ }
178
+ else {
179
+ return this._endTag.ogTag;
180
+ }
181
+ }
182
+ isValid() {
183
+ if (this._endTag && nodeIsType(this._endTag, 5 /* AstNodeType.EndTagNode */) && this._startTag.tagName !== this._endTag.tagName) {
184
+ return false;
185
+ }
186
+ if (this.children.length === 1 && this.children[0].nodeType !== 0 /* AstNodeType.RootNode */) {
187
+ return false;
188
+ }
189
+ if (this.children.length > 2) {
190
+ return false;
191
+ }
192
+ return super.isValid() && this._startTag.isValid() && (this._endTag?.isValid() ?? true);
193
+ }
194
+ toString(depth = 0) {
195
+ let s = ' '.repeat(depth * 2) + this.toShortString() + ` [${this.tagName}]`;
196
+ for (const attrNode of this._startTag.children) {
197
+ s += '\n' + attrNode.toString(depth + 1);
198
+ }
199
+ for (const child of this.children) {
200
+ s += '\n' + child.toString(depth + 1);
201
+ }
202
+ return s;
203
+ }
204
+ }
205
+ // ----------------------------------------------------------------------------
206
+ // Attr
207
+ // ----------------------------------------------------------------------------
208
+ export class AttrNode extends AstNode {
209
+ constructor() {
210
+ super(...arguments);
211
+ this.nodeType = 6 /* AstNodeType.AttrNode */;
212
+ }
213
+ get key() {
214
+ switch (this.children.length) {
215
+ case 1: {
216
+ return AttrNode.DEFAULT_KEY;
217
+ }
218
+ case 2: {
219
+ if (!nodeIsType(this.children[0], 1 /* AstNodeType.TextNode */)) {
220
+ throw new Error('Invalid TextNode');
221
+ }
222
+ return this.children[0].str.trim();
223
+ }
224
+ }
225
+ throw new Error('Invalid AttrNode');
226
+ }
227
+ get val() {
228
+ switch (this.children.length) {
229
+ case 1: {
230
+ if (!nodeIsType(this.children[0], 1 /* AstNodeType.TextNode */)) {
231
+ throw new Error('Invalid TextNode');
232
+ }
233
+ return this.children[0].str.trim();
234
+ }
235
+ case 2: {
236
+ if (!nodeIsType(this.children[1], 1 /* AstNodeType.TextNode */)) {
237
+ throw new Error('Invalid TextNode');
238
+ }
239
+ return this.children[1].str.trim();
240
+ }
241
+ }
242
+ throw new Error('Invalid AttrNode');
243
+ }
244
+ isValid() {
245
+ return super.isValid() && (this.children.length >= 1 && this.children.length <= 2);
246
+ }
247
+ toShortString() {
248
+ let s = super.toShortString();
249
+ switch (this.children.length) {
250
+ case 1: {
251
+ s += ` VAL="${this.val}"`;
252
+ break;
253
+ }
254
+ case 2: {
255
+ s += ` KEY="${this.key}" VAL="${this.val}"`;
256
+ break;
257
+ }
258
+ }
259
+ return s;
260
+ }
261
+ }
262
+ AttrNode.DEFAULT_KEY = 'default';
263
+ //# sourceMappingURL=AstNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AstNode.js","sourceRoot":"","sources":["../../src/parser/AstNode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Token } from '../lexer/Token';
2
+ import { RootNode } from './AstNode';
3
+ export declare class Parser {
4
+ #private;
5
+ readonly tags: Set<string>;
6
+ readonly linebreakTerminatedTags: Set<string>;
7
+ readonly standaloneTags: Set<string>;
8
+ constructor(transforms?: readonly import("..").Transform[]);
9
+ parse(ogText: string, tokens: Array<Token>): RootNode;
10
+ }
11
+ //# sourceMappingURL=Parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/parser/Parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEvD,OAAO,EAAE,QAAQ,EAA8F,MAAM,WAAW,CAAA;AAGhI,qBAAa,MAAM;;IACf,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,QAAQ,CAAC,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;gBAExB,UAAU,oCAAiB;IAMvC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ;CA0SxD"}
@@ -0,0 +1,265 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _Parser_instances, _Parser_matchTagNodes, _Parser_findMatchingEndTag;
7
+ import { htmlTransforms } from '../generator/transforms/htmlTransforms';
8
+ import { stringifyTokens } from '../lexer/Token';
9
+ import { isStringToken } from '../lexer/TokenType';
10
+ import { RootNode, AttrNode, TextNode, LinebreakNode, StartTagNode, EndTagNode, TagNode } from './AstNode';
11
+ import { nodeIsType } from './nodeIsType';
12
+ export class Parser {
13
+ constructor(transforms = htmlTransforms) {
14
+ _Parser_instances.add(this);
15
+ this.tags = new Set(transforms.map((transform) => transform.name));
16
+ this.linebreakTerminatedTags = new Set(transforms.filter((transform) => transform.isLinebreakTerminated).map((transform) => transform.name.toLowerCase()));
17
+ this.standaloneTags = new Set(transforms.filter((transform) => transform.isStandalone).map((transform) => transform.name.toLowerCase()));
18
+ }
19
+ parse(ogText, tokens) {
20
+ let idx = 0;
21
+ const parseRoot = () => {
22
+ const root = new RootNode();
23
+ while (idx < tokens.length) {
24
+ if (tokens[idx].type === 2 /* TokenType.L_BRACKET */) {
25
+ const startIdx = idx;
26
+ const tagNode = parseTag();
27
+ if (tagNode !== null) {
28
+ root.addChild(tagNode);
29
+ }
30
+ else {
31
+ const invalidTokens = tokens.slice(startIdx, idx);
32
+ const str = stringifyTokens(ogText, invalidTokens);
33
+ const textNode = new TextNode(str);
34
+ root.addChild(textNode);
35
+ }
36
+ }
37
+ else if (tokens[idx].type === 1 /* TokenType.LINEBREAK */) {
38
+ idx += 1; // Consume LINEBREAK
39
+ root.addChild(new LinebreakNode());
40
+ }
41
+ else {
42
+ const startIdx = idx;
43
+ // Advance until we see the start of another RootNode's child (TagNode or LinebreakNode)
44
+ while (idx < tokens.length && tokens[idx].type !== 2 /* TokenType.L_BRACKET */ && tokens[idx].type !== 1 /* TokenType.LINEBREAK */) {
45
+ idx += 1;
46
+ }
47
+ const slice = tokens.slice(startIdx, idx);
48
+ const str = stringifyTokens(ogText, slice);
49
+ root.addChild(new TextNode(str));
50
+ }
51
+ }
52
+ return root;
53
+ };
54
+ const parseTag = () => {
55
+ if (idx + 1 >= tokens.length) {
56
+ return null;
57
+ }
58
+ if (tokens[idx].type !== 2 /* TokenType.L_BRACKET */) {
59
+ return null;
60
+ }
61
+ // If L_BRACKET is followed by text, then it must be StartTag or is invalid
62
+ if (isStringToken(tokens[idx + 1].type)) {
63
+ const startIdx = idx;
64
+ idx += 1; // Consume L_BRACKET
65
+ const labelText = parseLabel();
66
+ if (!this.tags.has(labelText)) {
67
+ return null;
68
+ }
69
+ const attrNodes = new Array();
70
+ while (true) {
71
+ const attrNode = parseAttr();
72
+ if (attrNode === null) {
73
+ break;
74
+ }
75
+ attrNodes.push(attrNode);
76
+ }
77
+ if (tokens[idx].type !== 3 /* TokenType.R_BRACKET */) {
78
+ return null;
79
+ }
80
+ idx += 1; // Consume R_BRACKET
81
+ const slice = tokens.slice(startIdx, idx);
82
+ const ogTag = stringifyTokens(ogText, slice);
83
+ const startTagNode = new StartTagNode(labelText, ogTag, attrNodes);
84
+ return startTagNode;
85
+ }
86
+ // If L_BRACKET is followed by BACKSLASH, then it must be EndTag or is invalid
87
+ if (tokens[idx + 1].type === 4 /* TokenType.BACKSLASH */) {
88
+ const startIdx = idx;
89
+ idx += 1; // Consume L_BRACKET
90
+ idx += 1; // Consume BACKSLASH
91
+ const labelText = parseLabel();
92
+ if (!this.tags.has(labelText)) {
93
+ return null;
94
+ }
95
+ if (tokens[idx].type !== 3 /* TokenType.R_BRACKET */) {
96
+ return null;
97
+ }
98
+ idx += 1; // Consume R_BRACKET
99
+ const slice = tokens.slice(startIdx, idx);
100
+ const ogTag = stringifyTokens(ogText, slice);
101
+ const endTagNode = new EndTagNode(labelText, ogTag);
102
+ return endTagNode;
103
+ }
104
+ return null;
105
+ };
106
+ const parseLabel = () => {
107
+ const slice = tokens.slice(idx, idx + 1);
108
+ const label = stringifyTokens(ogText, slice);
109
+ idx += 1; // Consume LABEL
110
+ return label.toLowerCase();
111
+ };
112
+ const parseText = (endOnQuotes = false, endOnSpace = false) => {
113
+ const startIdx = idx;
114
+ while (idx < tokens.length) {
115
+ if (!isStringToken(tokens[idx].type)) {
116
+ break;
117
+ }
118
+ if (endOnQuotes && (tokens[idx].type === 10 /* TokenType.XSS_S_QUOTE */ || tokens[idx].type === 9 /* TokenType.XSS_D_QUOTE */)) {
119
+ break;
120
+ }
121
+ /**
122
+ * If this text must end on space, then it must not endOnQuote (implies that the space is part of the entire text)
123
+ * When we encounter a space, then we must split the current token into 2 tokens and only consume the first half
124
+ *
125
+ * <a b> -> <a>< b>
126
+ * | | |
127
+ * | | idx (new)
128
+ * | |
129
+ * idx (consumed)
130
+ */
131
+ if (endOnSpace && !endOnQuotes) {
132
+ const origStr = stringifyTokens(ogText, [tokens[idx]]);
133
+ const spaceIdx = origStr.indexOf(' ');
134
+ if (spaceIdx >= 0) {
135
+ const oldToken = {
136
+ type: 0 /* TokenType.STR */,
137
+ offset: tokens[idx].offset,
138
+ length: spaceIdx,
139
+ };
140
+ const newToken = {
141
+ type: 0 /* TokenType.STR */,
142
+ offset: tokens[idx].offset + spaceIdx,
143
+ length: tokens[idx].length - spaceIdx,
144
+ };
145
+ tokens.splice(idx + 0, 1, oldToken);
146
+ tokens.splice(idx + 1, 0, newToken);
147
+ idx += 1;
148
+ break;
149
+ }
150
+ }
151
+ idx += 1;
152
+ }
153
+ const slice = tokens.slice(startIdx, idx);
154
+ const str = stringifyTokens(ogText, slice);
155
+ return new TextNode(str);
156
+ };
157
+ const parseAttr = () => {
158
+ if (idx + 1 >= tokens.length) {
159
+ return null;
160
+ }
161
+ const attrNode = new AttrNode();
162
+ if (tokens[idx].type === 5 /* TokenType.EQUALS */ && isStringToken(tokens[idx + 1].type)) { // [Tag = VAL ...] or [Tag = "VAL"]
163
+ idx += 1; // Consume EQUALS
164
+ const openedWithQuotes = tokens[idx].type === 10 /* TokenType.XSS_S_QUOTE */ || tokens[idx].type === 9 /* TokenType.XSS_D_QUOTE */;
165
+ if (openedWithQuotes) {
166
+ idx += 1;
167
+ }
168
+ const valNode = parseText(openedWithQuotes, true);
169
+ attrNode.addChild(valNode);
170
+ if (openedWithQuotes) {
171
+ if (tokens[idx].type !== 10 /* TokenType.XSS_S_QUOTE */ && tokens[idx].type !== 9 /* TokenType.XSS_D_QUOTE */) {
172
+ return null;
173
+ }
174
+ idx += 1;
175
+ }
176
+ }
177
+ else if (isStringToken(tokens[idx].type) && tokens[idx + 1].type === 5 /* TokenType.EQUALS */ && (idx + 2 < tokens.length && isStringToken(tokens[idx + 2].type))) { // [Tag KEY = VAL ...] or [Tag KEY = "VAL" ...]
178
+ const keyNode = parseText();
179
+ attrNode.addChild(keyNode);
180
+ idx += 1; // Consume EQUALS
181
+ const openedWithQuotes = tokens[idx].type === 10 /* TokenType.XSS_S_QUOTE */ || tokens[idx].type === 9 /* TokenType.XSS_D_QUOTE */;
182
+ if (openedWithQuotes) {
183
+ idx += 1;
184
+ }
185
+ const valNode = parseText(openedWithQuotes, true);
186
+ if (openedWithQuotes) {
187
+ if (tokens[idx].type !== 10 /* TokenType.XSS_S_QUOTE */ && tokens[idx].type !== 9 /* TokenType.XSS_D_QUOTE */) {
188
+ return null;
189
+ }
190
+ idx += 1;
191
+ }
192
+ attrNode.addChild(valNode);
193
+ }
194
+ else if (isStringToken(tokens[idx].type) && tokens[idx + 1].type !== 5 /* TokenType.EQUALS */) { // [Tag VAL ...]
195
+ const valNode = parseText();
196
+ attrNode.addChild(valNode);
197
+ }
198
+ else {
199
+ return null;
200
+ }
201
+ return attrNode;
202
+ };
203
+ let root = parseRoot();
204
+ root = __classPrivateFieldGet(this, _Parser_instances, "m", _Parser_matchTagNodes).call(this, root);
205
+ return root;
206
+ }
207
+ }
208
+ _Parser_instances = new WeakSet(), _Parser_matchTagNodes = function _Parser_matchTagNodes(rootNode) {
209
+ const transformedRoot = new RootNode();
210
+ for (let i = 0; i < rootNode.children.length; i++) {
211
+ const child = rootNode.children[i];
212
+ if (nodeIsType(child, 4 /* AstNodeType.StartTagNode */)) {
213
+ const endTag = __classPrivateFieldGet(this, _Parser_instances, "m", _Parser_findMatchingEndTag).call(this, rootNode.children, i, child.tagName);
214
+ const isStandalone = this.standaloneTags.has(child.tagName);
215
+ if (endTag || isStandalone) {
216
+ const tagNode = new TagNode(child, endTag?.node);
217
+ transformedRoot.addChild(tagNode);
218
+ // If matching end tag exists, consume all nodes between start/end (exclusive) as a subtree
219
+ if (endTag) {
220
+ const subRoot = new RootNode(rootNode.children.slice(i + 1, endTag.idx));
221
+ i = endTag.idx;
222
+ const transformedSubRoot = __classPrivateFieldGet(this, _Parser_instances, "m", _Parser_matchTagNodes).call(this, subRoot);
223
+ tagNode.addChild(transformedSubRoot);
224
+ }
225
+ }
226
+ else {
227
+ // If no end tag exists, then treat tag as string literal
228
+ transformedRoot.addChild(new TextNode(child.ogTag));
229
+ }
230
+ }
231
+ else if (nodeIsType(child, 5 /* AstNodeType.EndTagNode */)) {
232
+ // Encountered end tag when we're not expecting an end tag so we treat it as a string literal
233
+ transformedRoot.addChild(new TextNode(child.ogTag));
234
+ }
235
+ else if (nodeIsType(child, 1 /* AstNodeType.TextNode */)) {
236
+ // Normal text nodes get copied
237
+ transformedRoot.addChild(child);
238
+ }
239
+ else if (nodeIsType(child, 2 /* AstNodeType.LinebreakNode */)) {
240
+ // Linebreak nodes get copied
241
+ transformedRoot.addChild(child);
242
+ }
243
+ else {
244
+ throw new Error('Unexpected child of RootNode');
245
+ }
246
+ }
247
+ return transformedRoot;
248
+ }, _Parser_findMatchingEndTag = function _Parser_findMatchingEndTag(siblings, startIdx, tagName) {
249
+ if (this.standaloneTags.has(tagName)) {
250
+ return null;
251
+ }
252
+ for (let i = startIdx; i < siblings.length; i++) {
253
+ const sibling = siblings[i];
254
+ const isEndTag = (nodeIsType(sibling, 2 /* AstNodeType.LinebreakNode */) && this.linebreakTerminatedTags.has(tagName)) ||
255
+ (nodeIsType(sibling, 5 /* AstNodeType.EndTagNode */) && sibling.tagName === tagName);
256
+ if (isEndTag) {
257
+ return {
258
+ idx: i,
259
+ node: sibling,
260
+ };
261
+ }
262
+ }
263
+ return null;
264
+ };
265
+ //# sourceMappingURL=Parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../src/parser/Parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { AstNodeType, AstNode, AttrNode, RootNode, TagNode, TextNode, LinebreakNode, EndTagNode, StartTagNode } from './AstNode';
2
+ interface AstMap {
3
+ [AstNodeType.RootNode]: RootNode;
4
+ [AstNodeType.LinebreakNode]: LinebreakNode;
5
+ [AstNodeType.TextNode]: TextNode;
6
+ [AstNodeType.TagNode]: TagNode;
7
+ [AstNodeType.StartTagNode]: StartTagNode;
8
+ [AstNodeType.EndTagNode]: EndTagNode;
9
+ [AstNodeType.AttrNode]: AttrNode;
10
+ }
11
+ export declare function nodeIsType<T extends keyof AstMap>(node: AstNode, nodeType: T): node is AstMap[T];
12
+ export {};
13
+ //# sourceMappingURL=nodeIsType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeIsType.d.ts","sourceRoot":"","sources":["../../src/parser/nodeIsType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAEhI,UAAU,MAAM;IACZ,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAChC,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,aAAa,CAAA;IAC1C,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAChC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC9B,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,YAAY,CAAA;IACxC,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;IACpC,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACnC;AAED,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAEhG"}
@@ -0,0 +1,5 @@
1
+ import './AstNode';
2
+ export function nodeIsType(node, nodeType) {
3
+ return node.nodeType === nodeType;
4
+ }
5
+ //# sourceMappingURL=nodeIsType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeIsType.js","sourceRoot":"","sources":["../../src/parser/nodeIsType.ts"],"names":[],"mappings":"AAAA,OAAqH,WAAW,CAAA;AAYhI,MAAM,UAAU,UAAU,CAAyB,IAAa,EAAE,QAAW;IACzE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAA;AACrC,CAAC"}