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.
- package/LICENSE +21 -0
- package/README.md +77 -0
- package/dist/generateHtml.d.ts +2 -0
- package/dist/generateHtml.d.ts.map +1 -0
- package/dist/generateHtml.js +13 -0
- package/dist/generateHtml.js.map +1 -0
- package/dist/generator/Generator.d.ts +8 -0
- package/dist/generator/Generator.d.ts.map +1 -0
- package/dist/generator/Generator.js +54 -0
- package/dist/generator/Generator.js.map +1 -0
- package/dist/generator/transforms/Transform.d.ts +10 -0
- package/dist/generator/transforms/Transform.d.ts.map +1 -0
- package/dist/generator/transforms/Transform.js +2 -0
- package/dist/generator/transforms/Transform.js.map +1 -0
- package/dist/generator/transforms/htmlTransforms.d.ts +3 -0
- package/dist/generator/transforms/htmlTransforms.d.ts.map +1 -0
- package/dist/generator/transforms/htmlTransforms.js +198 -0
- package/dist/generator/transforms/htmlTransforms.js.map +1 -0
- package/dist/generator/utils/getTagImmediateAttrVal.d.ts +14 -0
- package/dist/generator/utils/getTagImmediateAttrVal.d.ts.map +1 -0
- package/dist/generator/utils/getTagImmediateAttrVal.js +19 -0
- package/dist/generator/utils/getTagImmediateAttrVal.js.map +1 -0
- package/dist/generator/utils/getTagImmediateText.d.ts +12 -0
- package/dist/generator/utils/getTagImmediateText.d.ts.map +1 -0
- package/dist/generator/utils/getTagImmediateText.js +29 -0
- package/dist/generator/utils/getTagImmediateText.js.map +1 -0
- package/dist/generator/utils/getWidthHeightAttr.d.ts +31 -0
- package/dist/generator/utils/getWidthHeightAttr.d.ts.map +1 -0
- package/dist/generator/utils/getWidthHeightAttr.js +47 -0
- package/dist/generator/utils/getWidthHeightAttr.js.map +1 -0
- package/dist/generator/utils/isDangerousUrl.d.ts +2 -0
- package/dist/generator/utils/isDangerousUrl.d.ts.map +1 -0
- package/dist/generator/utils/isDangerousUrl.js +14 -0
- package/dist/generator/utils/isDangerousUrl.js.map +1 -0
- package/dist/generator/utils/isOrderedList.d.ts +19 -0
- package/dist/generator/utils/isOrderedList.d.ts.map +1 -0
- package/dist/generator/utils/isOrderedList.js +26 -0
- package/dist/generator/utils/isOrderedList.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer/Lexer.d.ts +5 -0
- package/dist/lexer/Lexer.d.ts.map +1 -0
- package/dist/lexer/Lexer.js +81 -0
- package/dist/lexer/Lexer.js.map +1 -0
- package/dist/lexer/Token.d.ts +8 -0
- package/dist/lexer/Token.d.ts.map +1 -0
- package/dist/lexer/Token.js +54 -0
- package/dist/lexer/Token.js.map +1 -0
- package/dist/lexer/TokenType.d.ts +17 -0
- package/dist/lexer/TokenType.d.ts.map +1 -0
- package/dist/lexer/TokenType.js +41 -0
- package/dist/lexer/TokenType.js.map +1 -0
- package/dist/parser/AstNode.d.ts +105 -0
- package/dist/parser/AstNode.d.ts.map +1 -0
- package/dist/parser/AstNode.js +263 -0
- package/dist/parser/AstNode.js.map +1 -0
- package/dist/parser/Parser.d.ts +11 -0
- package/dist/parser/Parser.d.ts.map +1 -0
- package/dist/parser/Parser.js +265 -0
- package/dist/parser/Parser.js.map +1 -0
- package/dist/parser/nodeIsType.d.ts +13 -0
- package/dist/parser/nodeIsType.d.ts.map +1 -0
- package/dist/parser/nodeIsType.js +5 -0
- package/dist/parser/nodeIsType.js.map +1 -0
- package/package.json +68 -0
- package/src/generateHtml.ts +15 -0
- package/src/generator/Generator.ts +60 -0
- package/src/generator/transforms/Transform.ts +15 -0
- package/src/generator/transforms/htmlTransforms.ts +205 -0
- package/src/generator/utils/getTagImmediateAttrVal.ts +21 -0
- package/src/generator/utils/getTagImmediateText.ts +33 -0
- package/src/generator/utils/getWidthHeightAttr.ts +51 -0
- package/src/generator/utils/isDangerousUrl.ts +17 -0
- package/src/generator/utils/isOrderedList.ts +28 -0
- package/src/index.ts +18 -0
- package/src/lexer/Lexer.ts +89 -0
- package/src/lexer/Token.ts +64 -0
- package/src/lexer/TokenType.ts +65 -0
- package/src/parser/AstNode.ts +338 -0
- package/src/parser/Parser.ts +316 -0
- package/src/parser/nodeIsType.ts +15 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { TagNode } from '../../parser/AstNode';
|
|
2
|
+
/**
|
|
3
|
+
* Determines if the StartTag has an attribute of "1" to indicate that it's an ordered list
|
|
4
|
+
*
|
|
5
|
+
* [list=1]
|
|
6
|
+
*
|
|
7
|
+
* TagNode [list]
|
|
8
|
+
* AttrNode VAL="1"
|
|
9
|
+
* TextNode "1"
|
|
10
|
+
* RootNode
|
|
11
|
+
* TagNode [*]
|
|
12
|
+
* RootNode
|
|
13
|
+
* TextNode "Entry 1"
|
|
14
|
+
* TagNode [*]
|
|
15
|
+
* RootNode
|
|
16
|
+
* TextNode "Entry 2"
|
|
17
|
+
*/
|
|
18
|
+
export declare function isOrderedList(node: TagNode): boolean;
|
|
19
|
+
//# sourceMappingURL=isOrderedList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isOrderedList.d.ts","sourceRoot":"","sources":["../../../src/generator/utils/isOrderedList.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEnD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CASpD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Determines if the StartTag has an attribute of "1" to indicate that it's an ordered list
|
|
3
|
+
*
|
|
4
|
+
* [list=1]
|
|
5
|
+
*
|
|
6
|
+
* TagNode [list]
|
|
7
|
+
* AttrNode VAL="1"
|
|
8
|
+
* TextNode "1"
|
|
9
|
+
* RootNode
|
|
10
|
+
* TagNode [*]
|
|
11
|
+
* RootNode
|
|
12
|
+
* TextNode "Entry 1"
|
|
13
|
+
* TagNode [*]
|
|
14
|
+
* RootNode
|
|
15
|
+
* TextNode "Entry 2"
|
|
16
|
+
*/
|
|
17
|
+
export function isOrderedList(node) {
|
|
18
|
+
for (const child of node.attributes) {
|
|
19
|
+
const val = child.val;
|
|
20
|
+
if (val === '1') {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=isOrderedList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isOrderedList.js","sourceRoot":"","sources":["../../../src/generator/utils/isOrderedList.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAAC,IAAa;IACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAA;QACrB,IAAI,GAAG,KAAK,GAAG,EAAE;YACb,OAAO,IAAI,CAAA;SACd;KACJ;IAED,OAAO,KAAK,CAAA;AAChB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from './generateHtml';
|
|
2
|
+
export * from './lexer/Lexer';
|
|
3
|
+
export * from './lexer/Token';
|
|
4
|
+
export * from './lexer/TokenType';
|
|
5
|
+
export * from './parser/Parser';
|
|
6
|
+
export * from './parser/AstNode';
|
|
7
|
+
export * from './parser/nodeIsType';
|
|
8
|
+
export * from './generator/Generator';
|
|
9
|
+
export * from './generator/transforms/Transform';
|
|
10
|
+
export * from './generator/transforms/htmlTransforms';
|
|
11
|
+
export * from './generator/utils/getWidthHeightAttr';
|
|
12
|
+
export * from './generator/utils/getTagImmediateAttrVal';
|
|
13
|
+
export * from './generator/utils/getTagImmediateText';
|
|
14
|
+
export * from './generator/utils/isDangerousUrl';
|
|
15
|
+
export * from './generator/utils/isOrderedList';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAE9B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AAEjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kCAAkC,CAAA;AAChD,cAAc,uCAAuC,CAAA;AACrD,cAAc,sCAAsC,CAAA;AACpD,cAAc,0CAA0C,CAAA;AACxD,cAAc,uCAAuC,CAAA;AACrD,cAAc,kCAAkC,CAAA;AAChD,cAAc,iCAAiC,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from './generateHtml';
|
|
2
|
+
export * from './lexer/Lexer';
|
|
3
|
+
export * from './lexer/Token';
|
|
4
|
+
export * from './lexer/TokenType';
|
|
5
|
+
export * from './parser/Parser';
|
|
6
|
+
export * from './parser/AstNode';
|
|
7
|
+
export * from './parser/nodeIsType';
|
|
8
|
+
export * from './generator/Generator';
|
|
9
|
+
export * from './generator/transforms/Transform';
|
|
10
|
+
export * from './generator/transforms/htmlTransforms';
|
|
11
|
+
export * from './generator/utils/getWidthHeightAttr';
|
|
12
|
+
export * from './generator/utils/getTagImmediateAttrVal';
|
|
13
|
+
export * from './generator/utils/getTagImmediateText';
|
|
14
|
+
export * from './generator/utils/isDangerousUrl';
|
|
15
|
+
export * from './generator/utils/isOrderedList';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAE9B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AAEjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kCAAkC,CAAA;AAChD,cAAc,uCAAuC,CAAA;AACrD,cAAc,sCAAsC,CAAA;AACpD,cAAc,0CAA0C,CAAA;AACxD,cAAc,uCAAuC,CAAA;AACrD,cAAc,kCAAkC,CAAA;AAChD,cAAc,iCAAiC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Lexer.d.ts","sourceRoot":"","sources":["../../src/lexer/Lexer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,qBAAa,KAAK;IACd,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;CAoFlD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { symbolTable } from './TokenType';
|
|
2
|
+
export class Lexer {
|
|
3
|
+
tokenize(input) {
|
|
4
|
+
const tokens = new Array();
|
|
5
|
+
const re = /\n|\[\/|\[(\w+|\*)|\]|=|&|<|>|'|"/g;
|
|
6
|
+
let offset = 0;
|
|
7
|
+
while (true) {
|
|
8
|
+
// Match until next symbol
|
|
9
|
+
const match = re.exec(input);
|
|
10
|
+
if (!match) {
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
// Everything between previous symbol and current symbol is treated as plaintext
|
|
14
|
+
//
|
|
15
|
+
// [...]plaintext[/...]
|
|
16
|
+
// | |
|
|
17
|
+
// offset match.index
|
|
18
|
+
// (new) offset
|
|
19
|
+
//
|
|
20
|
+
const length = match.index - offset;
|
|
21
|
+
if (length > 0) {
|
|
22
|
+
tokens.push({
|
|
23
|
+
type: 0 /* TokenType.STR */,
|
|
24
|
+
offset,
|
|
25
|
+
length,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
offset = match.index;
|
|
29
|
+
// Only add BACKSLASH token if it's preceded by L_BRACKET
|
|
30
|
+
// In the regex '[/' takes precedence over '['
|
|
31
|
+
if (match[0] === '[/') {
|
|
32
|
+
tokens.push({
|
|
33
|
+
type: 2 /* TokenType.L_BRACKET */,
|
|
34
|
+
offset,
|
|
35
|
+
length: 1,
|
|
36
|
+
});
|
|
37
|
+
offset += 1;
|
|
38
|
+
tokens.push({
|
|
39
|
+
type: 4 /* TokenType.BACKSLASH */,
|
|
40
|
+
offset,
|
|
41
|
+
length: 1,
|
|
42
|
+
});
|
|
43
|
+
offset += 1;
|
|
44
|
+
}
|
|
45
|
+
else if (match[0].startsWith('[')) {
|
|
46
|
+
tokens.push({
|
|
47
|
+
type: 2 /* TokenType.L_BRACKET */,
|
|
48
|
+
offset,
|
|
49
|
+
length: 1,
|
|
50
|
+
});
|
|
51
|
+
offset += 1;
|
|
52
|
+
const length = match[0].length - 1;
|
|
53
|
+
tokens.push({
|
|
54
|
+
type: 0 /* TokenType.STR */,
|
|
55
|
+
offset,
|
|
56
|
+
length,
|
|
57
|
+
});
|
|
58
|
+
offset += length;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
tokens.push({
|
|
62
|
+
type: symbolTable[match[0]] ?? 0 /* TokenType.STR */,
|
|
63
|
+
offset,
|
|
64
|
+
length: 1,
|
|
65
|
+
});
|
|
66
|
+
offset += 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Add any leftover non-symbol text
|
|
70
|
+
const length = input.length - offset;
|
|
71
|
+
if (length > 0) {
|
|
72
|
+
tokens.push({
|
|
73
|
+
type: 0 /* TokenType.STR */,
|
|
74
|
+
offset,
|
|
75
|
+
length,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return tokens;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=Lexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Lexer.js","sourceRoot":"","sources":["../../src/lexer/Lexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAa,MAAM,aAAa,CAAA;AAGpD,MAAM,OAAO,KAAK;IACd,QAAQ,CAAC,KAAuB;QAC5B,MAAM,MAAM,GAAG,IAAI,KAAK,EAAS,CAAA;QAEjC,MAAM,EAAE,GAAG,oCAAoC,CAAA;QAC/C,IAAI,MAAM,GAAG,CAAC,CAAA;QAEd,OAAO,IAAI,EAAE;YACT,0BAA0B;YAC1B,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC5B,IAAI,CAAC,KAAK,EAAE;gBACR,MAAK;aACR;YAED,gFAAgF;YAChF,EAAE;YACF,wBAAwB;YACxB,mBAAmB;YACnB,6BAA6B;YAC7B,8BAA8B;YAC9B,EAAE;YACF,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM,CAAA;YACnC,IAAI,MAAM,GAAG,CAAC,EAAE;gBACZ,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,uBAAe;oBACnB,MAAM;oBACN,MAAM;iBACT,CAAC,CAAA;aACL;YAED,MAAM,GAAG,KAAK,CAAC,KAAK,CAAA;YAEpB,yDAAyD;YACzD,8CAA8C;YAC9C,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,6BAAqB;oBACzB,MAAM;oBACN,MAAM,EAAE,CAAC;iBACZ,CAAC,CAAA;gBACF,MAAM,IAAI,CAAC,CAAA;gBAEX,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,6BAAqB;oBACzB,MAAM;oBACN,MAAM,EAAE,CAAC;iBACZ,CAAC,CAAA;gBACF,MAAM,IAAI,CAAC,CAAA;aACd;iBAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBACjC,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,6BAAqB;oBACzB,MAAM;oBACN,MAAM,EAAE,CAAC;iBACZ,CAAC,CAAA;gBACF,MAAM,IAAI,CAAC,CAAA;gBAEX,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;gBAClC,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,uBAAe;oBACnB,MAAM;oBACN,MAAM;iBACT,CAAC,CAAA;gBACF,MAAM,IAAI,MAAM,CAAA;aACnB;iBAAM;gBACH,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAiB;oBAC5C,MAAM;oBACN,MAAM,EAAE,CAAC;iBACZ,CAAC,CAAA;gBACF,MAAM,IAAI,CAAC,CAAA;aACd;SACJ;QAED,mCAAmC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;QACpC,IAAI,MAAM,GAAG,CAAC,EAAE;YACZ,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,uBAAe;gBACnB,MAAM;gBACN,MAAM;aACT,CAAC,CAAA;SACL;QAED,OAAO,MAAM,CAAA;IACjB,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Token.d.ts","sourceRoot":"","sources":["../../src/lexer/Token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,MAAM,WAAW,KAAK;IAClB,IAAI,EAAE,SAAS,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,MAAM,CAuDpF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import './TokenType';
|
|
2
|
+
export function stringifyTokens(ogText, tokens) {
|
|
3
|
+
let s = '';
|
|
4
|
+
for (const token of tokens) {
|
|
5
|
+
switch (token.type) {
|
|
6
|
+
case 0 /* TokenType.STR */: {
|
|
7
|
+
s += ogText.substring(token.offset, token.offset + token.length);
|
|
8
|
+
break;
|
|
9
|
+
}
|
|
10
|
+
case 1 /* TokenType.LINEBREAK */: {
|
|
11
|
+
s += '\n';
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
case 2 /* TokenType.L_BRACKET */: {
|
|
15
|
+
s += '[';
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
case 3 /* TokenType.R_BRACKET */: {
|
|
19
|
+
s += ']';
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
case 4 /* TokenType.BACKSLASH */: {
|
|
23
|
+
s += '/';
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
case 5 /* TokenType.EQUALS */: {
|
|
27
|
+
s += '=';
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
case 6 /* TokenType.XSS_AMP */: {
|
|
31
|
+
s += '&';
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
case 7 /* TokenType.XSS_LT */: {
|
|
35
|
+
s += '<';
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case 8 /* TokenType.XSS_GT */: {
|
|
39
|
+
s += '>';
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
case 9 /* TokenType.XSS_D_QUOTE */: {
|
|
43
|
+
s += '"';
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case 10 /* TokenType.XSS_S_QUOTE */: {
|
|
47
|
+
s += ''';
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return s;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=Token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Token.js","sourceRoot":"","sources":["../../src/lexer/Token.ts"],"names":[],"mappings":"AAAA,OAA0B,aAAa,CAAA;AAQvC,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,MAA4B;IACxE,IAAI,CAAC,GAAG,EAAE,CAAA;IAEV,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QACxB,QAAQ,KAAK,CAAC,IAAI,EAAE;YAChB,0BAAkB,CAAC,CAAC;gBAChB,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;gBAChE,MAAK;aACR;YACD,gCAAwB,CAAC,CAAC;gBACtB,CAAC,IAAI,IAAI,CAAA;gBACT,MAAK;aACR;YAED,gCAAwB,CAAC,CAAC;gBACtB,CAAC,IAAI,GAAG,CAAA;gBACR,MAAK;aACR;YACD,gCAAwB,CAAC,CAAC;gBACtB,CAAC,IAAI,GAAG,CAAA;gBACR,MAAK;aACR;YACD,gCAAwB,CAAC,CAAC;gBACtB,CAAC,IAAI,GAAG,CAAA;gBACR,MAAK;aACR;YACD,6BAAqB,CAAC,CAAC;gBACnB,CAAC,IAAI,GAAG,CAAA;gBACR,MAAK;aACR;YAED,8BAAsB,CAAC,CAAC;gBACpB,CAAC,IAAI,OAAO,CAAA;gBACZ,MAAK;aACR;YACD,6BAAqB,CAAC,CAAC;gBACnB,CAAC,IAAI,MAAM,CAAA;gBACX,MAAK;aACR;YACD,6BAAqB,CAAC,CAAC;gBACnB,CAAC,IAAI,MAAM,CAAA;gBACX,MAAK;aACR;YACD,kCAA0B,CAAC,CAAC;gBACxB,CAAC,IAAI,QAAQ,CAAA;gBACb,MAAK;aACR;YACD,mCAA0B,CAAC,CAAC;gBACxB,CAAC,IAAI,QAAQ,CAAA;gBACb,MAAK;aACR;SACJ;KACJ;IAED,OAAO,CAAC,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const enum TokenType {
|
|
2
|
+
STR = 0,
|
|
3
|
+
LINEBREAK = 1,
|
|
4
|
+
L_BRACKET = 2,
|
|
5
|
+
R_BRACKET = 3,
|
|
6
|
+
BACKSLASH = 4,
|
|
7
|
+
EQUALS = 5,
|
|
8
|
+
XSS_AMP = 6,
|
|
9
|
+
XSS_LT = 7,
|
|
10
|
+
XSS_GT = 8,
|
|
11
|
+
XSS_D_QUOTE = 9,
|
|
12
|
+
XSS_S_QUOTE = 10
|
|
13
|
+
}
|
|
14
|
+
export declare function tokenTypeToString(tokenType: TokenType): string;
|
|
15
|
+
export declare function isStringToken(tokenType: TokenType): boolean;
|
|
16
|
+
export declare const symbolTable: Record<string, TokenType | undefined>;
|
|
17
|
+
//# sourceMappingURL=TokenType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenType.d.ts","sourceRoot":"","sources":["../../src/lexer/TokenType.ts"],"names":[],"mappings":"AAAA,0BAAkB,SAAS;IACvB,GAAG,IAAA;IACH,SAAS,IAAA;IAGT,SAAS,IAAA;IACT,SAAS,IAAA;IACT,SAAS,IAAA;IACT,MAAM,IAAA;IAGN,OAAO,IAAA;IACP,MAAM,IAAA;IACN,MAAM,IAAA;IACN,WAAW,IAAA;IACX,WAAW,KAAA;CACd;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAgB9D;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAa3D;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAa7D,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function tokenTypeToString(tokenType) {
|
|
2
|
+
switch (tokenType) {
|
|
3
|
+
case 0 /* TokenType.STR */: return 'STR';
|
|
4
|
+
case 1 /* TokenType.LINEBREAK */: return 'LINEBREAK';
|
|
5
|
+
case 2 /* TokenType.L_BRACKET */: return 'L_BRACKET';
|
|
6
|
+
case 3 /* TokenType.R_BRACKET */: return 'R_BRACKET';
|
|
7
|
+
case 4 /* TokenType.BACKSLASH */: return 'BACKSLASH';
|
|
8
|
+
case 5 /* TokenType.EQUALS */: return 'EQUALS';
|
|
9
|
+
case 6 /* TokenType.XSS_AMP */: return 'XSS_AMP';
|
|
10
|
+
case 7 /* TokenType.XSS_LT */: return 'XSS_LT';
|
|
11
|
+
case 8 /* TokenType.XSS_GT */: return 'XSS_GT';
|
|
12
|
+
case 9 /* TokenType.XSS_D_QUOTE */: return 'XSS_D_QUOTE';
|
|
13
|
+
case 10 /* TokenType.XSS_S_QUOTE */: return 'XSS_S_QUOTE';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function isStringToken(tokenType) {
|
|
17
|
+
switch (tokenType) {
|
|
18
|
+
case 6 /* TokenType.XSS_AMP */:
|
|
19
|
+
case 7 /* TokenType.XSS_LT */:
|
|
20
|
+
case 8 /* TokenType.XSS_GT */:
|
|
21
|
+
case 9 /* TokenType.XSS_D_QUOTE */:
|
|
22
|
+
case 10 /* TokenType.XSS_S_QUOTE */:
|
|
23
|
+
case 0 /* TokenType.STR */: {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
export const symbolTable = {
|
|
30
|
+
'\n': 1 /* TokenType.LINEBREAK */,
|
|
31
|
+
'[': 2 /* TokenType.L_BRACKET */,
|
|
32
|
+
']': 3 /* TokenType.R_BRACKET */,
|
|
33
|
+
'/': 4 /* TokenType.BACKSLASH */,
|
|
34
|
+
'=': 5 /* TokenType.EQUALS */,
|
|
35
|
+
'&': 6 /* TokenType.XSS_AMP */,
|
|
36
|
+
'<': 7 /* TokenType.XSS_LT */,
|
|
37
|
+
'>': 8 /* TokenType.XSS_GT */,
|
|
38
|
+
'"': 9 /* TokenType.XSS_D_QUOTE */,
|
|
39
|
+
"'": 10 /* TokenType.XSS_S_QUOTE */,
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=TokenType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenType.js","sourceRoot":"","sources":["../../src/lexer/TokenType.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IAClD,QAAQ,SAAS,EAAE;QACf,0BAAkB,CAAC,CAAC,OAAO,KAAK,CAAA;QAChC,gCAAwB,CAAC,CAAC,OAAO,WAAW,CAAA;QAE5C,gCAAwB,CAAC,CAAC,OAAO,WAAW,CAAA;QAC5C,gCAAwB,CAAC,CAAC,OAAO,WAAW,CAAA;QAC5C,gCAAwB,CAAC,CAAC,OAAO,WAAW,CAAA;QAC5C,6BAAqB,CAAC,CAAC,OAAO,QAAQ,CAAA;QAEtC,8BAAsB,CAAC,CAAC,OAAO,SAAS,CAAA;QACxC,6BAAqB,CAAC,CAAC,OAAO,QAAQ,CAAA;QACtC,6BAAqB,CAAC,CAAC,OAAO,QAAQ,CAAA;QACtC,kCAA0B,CAAC,CAAC,OAAO,aAAa,CAAA;QAChD,mCAA0B,CAAC,CAAC,OAAO,aAAa,CAAA;KACnD;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAoB;IAC9C,QAAQ,SAAS,EAAE;QACf,+BAAuB;QACvB,8BAAsB;QACtB,8BAAsB;QACtB,mCAA2B;QAC3B,oCAA2B;QAC3B,0BAAkB,CAAC,CAAC;YAChB,OAAO,IAAI,CAAA;SACd;KACJ;IAED,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAA0C;IAC9D,IAAI,6BAAqB;IAEzB,GAAG,6BAAqB;IACxB,GAAG,6BAAqB;IACxB,GAAG,6BAAqB;IACxB,GAAG,0BAAkB;IAErB,GAAG,2BAAmB;IACtB,GAAG,0BAAkB;IACrB,GAAG,0BAAkB;IACrB,GAAG,+BAAuB;IAC1B,GAAG,gCAAuB;CAC7B,CAAA"}
|
|
@@ -0,0 +1,105 @@
|
|
|
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
|
+
export declare const enum AstNodeType {
|
|
36
|
+
RootNode = 0,
|
|
37
|
+
TextNode = 1,
|
|
38
|
+
LinebreakNode = 2,
|
|
39
|
+
TagNode = 3,
|
|
40
|
+
StartTagNode = 4,
|
|
41
|
+
EndTagNode = 5,
|
|
42
|
+
AttrNode = 6
|
|
43
|
+
}
|
|
44
|
+
export declare function nodeTypeToString(nodeType: AstNodeType): string;
|
|
45
|
+
export declare abstract class AstNode {
|
|
46
|
+
readonly abstract nodeType: AstNodeType;
|
|
47
|
+
readonly children: Array<AstNode>;
|
|
48
|
+
constructor(children?: Array<AstNode>);
|
|
49
|
+
addChild(node: AstNode): void;
|
|
50
|
+
isValid(): boolean;
|
|
51
|
+
toShortString(): string;
|
|
52
|
+
toString(depth?: number): string;
|
|
53
|
+
}
|
|
54
|
+
export declare class RootNode extends AstNode {
|
|
55
|
+
readonly nodeType = AstNodeType.RootNode;
|
|
56
|
+
isValid(): boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare class TextNode extends AstNode {
|
|
59
|
+
readonly nodeType = AstNodeType.TextNode;
|
|
60
|
+
readonly str: string;
|
|
61
|
+
constructor(str: string);
|
|
62
|
+
isValid(): boolean;
|
|
63
|
+
toShortString(): string;
|
|
64
|
+
}
|
|
65
|
+
export declare class LinebreakNode extends AstNode {
|
|
66
|
+
readonly nodeType = AstNodeType.LinebreakNode;
|
|
67
|
+
toShortString(): string;
|
|
68
|
+
}
|
|
69
|
+
export declare class StartTagNode extends AstNode {
|
|
70
|
+
readonly nodeType = AstNodeType.StartTagNode;
|
|
71
|
+
readonly tagName: string;
|
|
72
|
+
readonly ogTag: string;
|
|
73
|
+
constructor(tagName: string, ogTag: string, attrNodes?: Array<AttrNode>);
|
|
74
|
+
isValid(): boolean;
|
|
75
|
+
toShortString(): string;
|
|
76
|
+
}
|
|
77
|
+
export declare class EndTagNode extends AstNode {
|
|
78
|
+
readonly nodeType = AstNodeType.EndTagNode;
|
|
79
|
+
readonly tagName: string;
|
|
80
|
+
readonly ogTag: string;
|
|
81
|
+
constructor(tagName: string, ogTag: string);
|
|
82
|
+
isValid(): boolean;
|
|
83
|
+
toShortString(): string;
|
|
84
|
+
}
|
|
85
|
+
export declare class TagNode extends AstNode {
|
|
86
|
+
readonly nodeType = AstNodeType.TagNode;
|
|
87
|
+
private readonly _startTag;
|
|
88
|
+
private readonly _endTag?;
|
|
89
|
+
constructor(startTag: StartTagNode, endTag?: EndTagNode | LinebreakNode);
|
|
90
|
+
get tagName(): string;
|
|
91
|
+
get attributes(): Array<AttrNode>;
|
|
92
|
+
get ogStartTag(): string;
|
|
93
|
+
get ogEndTag(): string;
|
|
94
|
+
isValid(): boolean;
|
|
95
|
+
toString(depth?: number): string;
|
|
96
|
+
}
|
|
97
|
+
export declare class AttrNode extends AstNode {
|
|
98
|
+
readonly nodeType = AstNodeType.AttrNode;
|
|
99
|
+
static readonly DEFAULT_KEY = "default";
|
|
100
|
+
get key(): string;
|
|
101
|
+
get val(): string;
|
|
102
|
+
isValid(): boolean;
|
|
103
|
+
toShortString(): string;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=AstNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AstNode.d.ts","sourceRoot":"","sources":["../../src/parser/AstNode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCE;AAQF,0BAAkB,WAAW;IACzB,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,aAAa,IAAA;IACb,OAAO,IAAA;IACP,YAAY,IAAA;IACZ,UAAU,IAAA;IACV,QAAQ,IAAA;CACX;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAU9D;AAED,8BAAsB,OAAO;IACzB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;IAGvC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBAErB,QAAQ,GAAE,KAAK,CAAC,OAAO,CAAM;IAIzC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAI7B,OAAO,IAAI,OAAO;IAUlB,aAAa,IAAI,MAAM;IAMvB,QAAQ,CAAC,KAAK,SAAI,GAAG,MAAM;CAS9B;AAMD,qBAAa,QAAS,SAAQ,OAAO;IACjC,QAAQ,CAAC,QAAQ,wBAAuB;IAE/B,OAAO,IAAI,OAAO;CAW9B;AAMD,qBAAa,QAAS,SAAQ,OAAO;IACjC,QAAQ,CAAC,QAAQ,wBAAuB;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;gBAER,GAAG,EAAE,MAAM;IAKd,OAAO,IAAI,OAAO;IAIlB,aAAa,IAAI,MAAM;CAGnC;AAED,qBAAa,aAAc,SAAQ,OAAO;IACtC,QAAQ,CAAC,QAAQ,6BAA4B;IAEpC,aAAa,IAAI,MAAM;CAGnC;AAMD,qBAAa,YAAa,SAAQ,OAAO;IACrC,QAAQ,CAAC,QAAQ,4BAA2B;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;gBAEV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,KAAK,CAAC,QAAQ,CAAM;IAMlE,OAAO,IAAI,OAAO;IAUlB,aAAa,IAAI,MAAM;CAGnC;AAED,qBAAa,UAAW,SAAQ,OAAO;IACnC,QAAQ,CAAC,QAAQ,0BAAyB;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;gBAEV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAMjC,OAAO,IAAI,OAAO;IAIlB,aAAa,IAAI,MAAM;CAGnC;AAED,qBAAa,OAAQ,SAAQ,OAAO;IAChC,QAAQ,CAAC,QAAQ,uBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA4B;gBAEzC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,aAAa;IAMvE,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC,CAEhC;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,QAAQ,IAAI,MAAM,CAUrB;IAEQ,OAAO,IAAI,OAAO;IAgBlB,QAAQ,CAAC,KAAK,SAAI,GAAG,MAAM;CAavC;AAMD,qBAAa,QAAS,SAAQ,OAAO;IACjC,QAAQ,CAAC,QAAQ,wBAAuB;IAExC,MAAM,CAAC,QAAQ,CAAC,WAAW,aAAY;IAEvC,IAAI,GAAG,IAAI,MAAM,CAehB;IAED,IAAI,GAAG,IAAI,MAAM,CAmBhB;IAEQ,OAAO,IAAI,OAAO;IAIlB,aAAa,IAAI,MAAM;CAgBnC"}
|