bbcode-compiler 0.1.4 → 0.1.6

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 (52) hide show
  1. package/dist/generateHtml.d.ts +1 -1
  2. package/dist/generator/Generator.d.ts +2 -1
  3. package/dist/generator/transforms/Transform.d.ts +2 -1
  4. package/dist/generator/transforms/htmlTransforms.d.ts +2 -1
  5. package/dist/generator/utils/getTagImmediateAttrVal.d.ts +2 -1
  6. package/dist/generator/utils/getTagImmediateText.d.ts +1 -0
  7. package/dist/generator/utils/getWidthHeightAttr.d.ts +2 -1
  8. package/dist/generator/utils/isOrderedList.d.ts +2 -1
  9. package/dist/index.js +1014 -16
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.umd.cjs +1018 -0
  12. package/dist/index.umd.cjs.map +1 -0
  13. package/dist/lexer/Lexer.d.ts +2 -1
  14. package/dist/lexer/Token.d.ts +1 -0
  15. package/dist/parser/AstNode.d.ts +8 -8
  16. package/dist/parser/AstNode.d.ts.map +1 -1
  17. package/dist/parser/Parser.d.ts +2 -1
  18. package/dist/parser/Parser.d.ts.map +1 -1
  19. package/dist/parser/nodeIsType.d.ts +1 -0
  20. package/package.json +23 -22
  21. package/src/parser/AstNode.ts +73 -73
  22. package/src/parser/Parser.ts +113 -110
  23. package/dist/generateHtml.js +0 -13
  24. package/dist/generateHtml.js.map +0 -1
  25. package/dist/generator/Generator.js +0 -54
  26. package/dist/generator/Generator.js.map +0 -1
  27. package/dist/generator/transforms/Transform.js +0 -2
  28. package/dist/generator/transforms/Transform.js.map +0 -1
  29. package/dist/generator/transforms/htmlTransforms.js +0 -198
  30. package/dist/generator/transforms/htmlTransforms.js.map +0 -1
  31. package/dist/generator/utils/getTagImmediateAttrVal.js +0 -19
  32. package/dist/generator/utils/getTagImmediateAttrVal.js.map +0 -1
  33. package/dist/generator/utils/getTagImmediateText.js +0 -28
  34. package/dist/generator/utils/getTagImmediateText.js.map +0 -1
  35. package/dist/generator/utils/getWidthHeightAttr.js +0 -47
  36. package/dist/generator/utils/getWidthHeightAttr.js.map +0 -1
  37. package/dist/generator/utils/isDangerousUrl.js +0 -14
  38. package/dist/generator/utils/isDangerousUrl.js.map +0 -1
  39. package/dist/generator/utils/isOrderedList.js +0 -26
  40. package/dist/generator/utils/isOrderedList.js.map +0 -1
  41. package/dist/lexer/Lexer.js +0 -81
  42. package/dist/lexer/Lexer.js.map +0 -1
  43. package/dist/lexer/Token.js +0 -53
  44. package/dist/lexer/Token.js.map +0 -1
  45. package/dist/lexer/TokenType.js +0 -41
  46. package/dist/lexer/TokenType.js.map +0 -1
  47. package/dist/parser/AstNode.js +0 -263
  48. package/dist/parser/AstNode.js.map +0 -1
  49. package/dist/parser/Parser.js +0 -265
  50. package/dist/parser/Parser.js.map +0 -1
  51. package/dist/parser/nodeIsType.js +0 -4
  52. package/dist/parser/nodeIsType.js.map +0 -1
@@ -18,109 +18,6 @@ export class Parser {
18
18
  parse(ogText: string, tokens: Array<Token>): RootNode {
19
19
  let idx = 0
20
20
 
21
- const parseRoot = (): RootNode => {
22
- const root = new RootNode()
23
-
24
- while (idx < tokens.length) {
25
- if (tokens[idx].type === TokenType.L_BRACKET) {
26
- const startIdx = idx
27
- const tagNode = parseTag()
28
-
29
- if (tagNode !== null) {
30
- root.addChild(tagNode)
31
- } else {
32
- const invalidTokens = tokens.slice(startIdx, idx)
33
- const str = stringifyTokens(ogText, invalidTokens)
34
- const textNode = new TextNode(str)
35
- root.addChild(textNode)
36
- }
37
- } else if (tokens[idx].type === TokenType.LINEBREAK) {
38
- idx += 1 // Consume LINEBREAK
39
- root.addChild(new LinebreakNode())
40
- } else {
41
- const startIdx = idx
42
-
43
- // Advance until we see the start of another RootNode's child (TagNode or LinebreakNode)
44
- while (idx < tokens.length && tokens[idx].type !== TokenType.L_BRACKET && tokens[idx].type !== TokenType.LINEBREAK) {
45
- idx += 1
46
- }
47
-
48
- const slice = tokens.slice(startIdx, idx)
49
- const str = stringifyTokens(ogText, slice)
50
- root.addChild(new TextNode(str))
51
- }
52
- }
53
-
54
- return root
55
- }
56
-
57
- const parseTag = (): StartTagNode | EndTagNode | null => {
58
- if (idx + 1 >= tokens.length) {
59
- return null
60
- }
61
-
62
- if (tokens[idx].type !== TokenType.L_BRACKET) {
63
- return null
64
- }
65
-
66
- // If L_BRACKET is followed by text, then it must be StartTag or is invalid
67
- if (isStringToken(tokens[idx + 1].type)) {
68
- const startIdx = idx
69
- idx += 1 // Consume L_BRACKET
70
-
71
- const labelText = parseLabel()
72
- if (!this.tags.has(labelText)) {
73
- return null
74
- }
75
-
76
- const attrNodes = new Array<AttrNode>()
77
- while (true) {
78
- const attrNode = parseAttr()
79
- if (attrNode === null) {
80
- break
81
- }
82
-
83
- attrNodes.push(attrNode)
84
- }
85
-
86
- if (tokens[idx].type !== TokenType.R_BRACKET) {
87
- return null
88
- }
89
-
90
- idx += 1 // Consume R_BRACKET
91
-
92
- const slice = tokens.slice(startIdx, idx)
93
- const ogTag = stringifyTokens(ogText, slice)
94
- const startTagNode = new StartTagNode(labelText, ogTag, attrNodes)
95
- return startTagNode
96
- }
97
-
98
- // If L_BRACKET is followed by BACKSLASH, then it must be EndTag or is invalid
99
- if (tokens[idx + 1].type === TokenType.BACKSLASH) {
100
- const startIdx = idx
101
- idx += 1 // Consume L_BRACKET
102
- idx += 1 // Consume BACKSLASH
103
-
104
- const labelText = parseLabel()
105
- if (!this.tags.has(labelText)) {
106
- return null
107
- }
108
-
109
- if (tokens[idx].type !== TokenType.R_BRACKET) {
110
- return null
111
- }
112
-
113
- idx += 1 // Consume R_BRACKET
114
-
115
- const slice = tokens.slice(startIdx, idx)
116
- const ogTag = stringifyTokens(ogText, slice)
117
- const endTagNode = new EndTagNode(labelText, ogTag)
118
- return endTagNode
119
- }
120
-
121
- return null
122
- }
123
-
124
21
  const parseLabel = (): string => {
125
22
  const slice = tokens.slice(idx, idx + 1)
126
23
  const label = stringifyTokens(ogText, slice)
@@ -141,14 +38,17 @@ export class Parser {
141
38
  }
142
39
 
143
40
  /**
144
- * If this text must end on space, then it must not endOnQuote (implies that the space is part of the entire text)
145
- * When we encounter a space, then we must split the current token into 2 tokens and only consume the first half
41
+ * SPECIAL CASE:
42
+ * If we encounter a space, then we must split the current token into 2 tokens and only consume the first part
43
+ *
44
+ * a b -> a b
45
+ * | | |
46
+ * | | idx (new)
47
+ * | |
48
+ * idx consumed
146
49
  *
147
- * <a b> -> <a>< b>
148
- * | | |
149
- * | | idx (new)
150
- * | |
151
- * idx (consumed)
50
+ * Note: We only handle endOnSpace special case when we don't expect the current text to endOnQuotes
51
+ * If it endOnQuotes, then it implies that it opened with quotes (and thus we need an enclosing/matching quote)
152
52
  */
153
53
  if (endOnSpace && !endOnQuotes) {
154
54
  const origStr = stringifyTokens(ogText, [tokens[idx]])
@@ -240,6 +140,109 @@ export class Parser {
240
140
  return attrNode
241
141
  }
242
142
 
143
+ const parseTag = (): StartTagNode | EndTagNode | null => {
144
+ if (idx + 1 >= tokens.length) {
145
+ return null
146
+ }
147
+
148
+ if (tokens[idx].type !== TokenType.L_BRACKET) {
149
+ return null
150
+ }
151
+
152
+ // If L_BRACKET is followed by text, then it must be StartTag or is invalid
153
+ if (isStringToken(tokens[idx + 1].type)) {
154
+ const startIdx = idx
155
+ idx += 1 // Consume L_BRACKET
156
+
157
+ const labelText = parseLabel()
158
+ if (!this.tags.has(labelText)) {
159
+ return null
160
+ }
161
+
162
+ const attrNodes = new Array<AttrNode>()
163
+ while (true) {
164
+ const attrNode = parseAttr()
165
+ if (attrNode === null) {
166
+ break
167
+ }
168
+
169
+ attrNodes.push(attrNode)
170
+ }
171
+
172
+ if (tokens[idx].type !== TokenType.R_BRACKET) {
173
+ return null
174
+ }
175
+
176
+ idx += 1 // Consume R_BRACKET
177
+
178
+ const slice = tokens.slice(startIdx, idx)
179
+ const ogTag = stringifyTokens(ogText, slice)
180
+ const startTagNode = new StartTagNode(labelText, ogTag, attrNodes)
181
+ return startTagNode
182
+ }
183
+
184
+ // If L_BRACKET is followed by BACKSLASH, then it must be EndTag or is invalid
185
+ if (tokens[idx + 1].type === TokenType.BACKSLASH) {
186
+ const startIdx = idx
187
+ idx += 1 // Consume L_BRACKET
188
+ idx += 1 // Consume BACKSLASH
189
+
190
+ const labelText = parseLabel()
191
+ if (!this.tags.has(labelText)) {
192
+ return null
193
+ }
194
+
195
+ if (tokens[idx].type !== TokenType.R_BRACKET) {
196
+ return null
197
+ }
198
+
199
+ idx += 1 // Consume R_BRACKET
200
+
201
+ const slice = tokens.slice(startIdx, idx)
202
+ const ogTag = stringifyTokens(ogText, slice)
203
+ const endTagNode = new EndTagNode(labelText, ogTag)
204
+ return endTagNode
205
+ }
206
+
207
+ return null
208
+ }
209
+
210
+ const parseRoot = (): RootNode => {
211
+ const root = new RootNode()
212
+
213
+ while (idx < tokens.length) {
214
+ if (tokens[idx].type === TokenType.L_BRACKET) {
215
+ const startIdx = idx
216
+ const tagNode = parseTag()
217
+
218
+ if (tagNode !== null) {
219
+ root.addChild(tagNode)
220
+ } else {
221
+ const invalidTokens = tokens.slice(startIdx, idx)
222
+ const str = stringifyTokens(ogText, invalidTokens)
223
+ const textNode = new TextNode(str)
224
+ root.addChild(textNode)
225
+ }
226
+ } else if (tokens[idx].type === TokenType.LINEBREAK) {
227
+ idx += 1 // Consume LINEBREAK
228
+ root.addChild(new LinebreakNode())
229
+ } else {
230
+ const startIdx = idx
231
+
232
+ // Advance until we see the start of another RootNode's child (TagNode or LinebreakNode)
233
+ while (idx < tokens.length && tokens[idx].type !== TokenType.L_BRACKET && tokens[idx].type !== TokenType.LINEBREAK) {
234
+ idx += 1
235
+ }
236
+
237
+ const slice = tokens.slice(startIdx, idx)
238
+ const str = stringifyTokens(ogText, slice)
239
+ root.addChild(new TextNode(str))
240
+ }
241
+ }
242
+
243
+ return root
244
+ }
245
+
243
246
  let root = parseRoot()
244
247
  root = this.matchTagNodes(root)
245
248
  return root
@@ -1,13 +0,0 @@
1
- import { Generator } from './generator/Generator.js';
2
- import { htmlTransforms } from './generator/transforms/htmlTransforms.js';
3
- import { Lexer } from './lexer/Lexer.js';
4
- import { Parser } from './parser/Parser.js';
5
- export function generateHtml(input, transforms = htmlTransforms) {
6
- const lexer = new Lexer();
7
- const tokens = lexer.tokenize(input);
8
- const parser = new Parser(transforms);
9
- const root = parser.parse(input, tokens);
10
- const generator = new Generator(transforms);
11
- return generator.generate(root);
12
- }
13
- //# sourceMappingURL=generateHtml.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generateHtml.js","sourceRoot":"","sources":["../src/generateHtml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAA;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,UAAU,GAAG,cAAc;IACnE,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAA;IACzB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEpC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAExC,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAA;IAC3C,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AACnC,CAAC"}
@@ -1,54 +0,0 @@
1
- import { nodeIsType } from '../parser/nodeIsType.js';
2
- import { htmlTransforms } from './transforms/htmlTransforms.js';
3
- export class Generator {
4
- transforms;
5
- constructor(transforms = htmlTransforms) {
6
- this.transforms = new Map(transforms.map((transform) => [transform.name, transform]));
7
- }
8
- generate(root) {
9
- const stringify = (node) => {
10
- let output = '';
11
- if (nodeIsType(node, 3 /* AstNodeType.TagNode */)) {
12
- const tagName = node.tagName;
13
- const transform = this.transforms.get(tagName);
14
- if (!transform) {
15
- throw new Error(`Unrecognized bbcode ${node.tagName}`);
16
- }
17
- const renderedStartTag = transform.start(node);
18
- const renderedEndTag = transform.end?.(node) ?? '';
19
- const isInvalidTag = renderedStartTag === false;
20
- if (isInvalidTag) {
21
- output += node.ogStartTag;
22
- }
23
- else {
24
- output += renderedStartTag;
25
- }
26
- if (!transform.skipChildren || isInvalidTag) {
27
- for (const child of node.children) {
28
- output += stringify(child);
29
- }
30
- }
31
- if (isInvalidTag) {
32
- output += node.ogEndTag;
33
- }
34
- else {
35
- output += renderedEndTag;
36
- }
37
- }
38
- else if (nodeIsType(node, 1 /* AstNodeType.TextNode */)) {
39
- output += node.str;
40
- }
41
- else if (nodeIsType(node, 2 /* AstNodeType.LinebreakNode */)) {
42
- output += '\n';
43
- }
44
- else {
45
- for (const child of node.children) {
46
- output += stringify(child);
47
- }
48
- }
49
- return output;
50
- };
51
- return stringify(root);
52
- }
53
- }
54
- //# sourceMappingURL=Generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Generator.js","sourceRoot":"","sources":["../../src/generator/Generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAG/D,MAAM,OAAO,SAAS;IAClB,UAAU,CAAgC;IAE1C,YAAY,UAAU,GAAG,cAAc;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IACzF,CAAC;IAED,QAAQ,CAAC,IAAc;QACnB,MAAM,SAAS,GAAG,CAAC,IAAa,EAAU,EAAE;YACxC,IAAI,MAAM,GAAG,EAAE,CAAA;YAEf,IAAI,UAAU,CAAC,IAAI,8BAAsB,EAAE;gBACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;gBAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC9C,IAAI,CAAC,SAAS,EAAE;oBACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;iBACzD;gBAED,MAAM,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC9C,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;gBAClD,MAAM,YAAY,GAAG,gBAAgB,KAAK,KAAK,CAAA;gBAE/C,IAAI,YAAY,EAAE;oBACd,MAAM,IAAI,IAAI,CAAC,UAAU,CAAA;iBAC5B;qBAAM;oBACH,MAAM,IAAI,gBAAgB,CAAA;iBAC7B;gBAED,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI,YAAY,EAAE;oBACzC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;wBAC/B,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,CAAA;qBAC7B;iBACJ;gBAED,IAAI,YAAY,EAAE;oBACd,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAA;iBAC1B;qBAAM;oBACH,MAAM,IAAI,cAAc,CAAA;iBAC3B;aACJ;iBAAM,IAAI,UAAU,CAAC,IAAI,+BAAuB,EAAE;gBAC/C,MAAM,IAAI,IAAI,CAAC,GAAG,CAAA;aACrB;iBAAM,IAAI,UAAU,CAAC,IAAI,oCAA4B,EAAE;gBACpD,MAAM,IAAI,IAAI,CAAA;aACjB;iBAAM;gBACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;oBAC/B,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,CAAA;iBAC7B;aACJ;YAED,OAAO,MAAM,CAAA;QACjB,CAAC,CAAA;QAED,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;CACJ"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Transform.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Transform.js","sourceRoot":"","sources":["../../../src/generator/transforms/Transform.ts"],"names":[],"mappings":""}
@@ -1,198 +0,0 @@
1
- import { getTagImmediateAttrVal } from '../utils/getTagImmediateAttrVal.js';
2
- import { getTagImmediateText } from '../utils/getTagImmediateText.js';
3
- import { getWidthHeightAttr } from '../utils/getWidthHeightAttr.js';
4
- import { isDangerousUrl } from '../utils/isDangerousUrl.js';
5
- import { isOrderedList } from '../utils/isOrderedList.js';
6
- export const htmlTransforms = [
7
- {
8
- name: 'b',
9
- start: () => {
10
- return '<strong>';
11
- },
12
- end: () => {
13
- return '</strong>';
14
- },
15
- },
16
- {
17
- name: 'i',
18
- start: () => {
19
- return '<em>';
20
- },
21
- end: () => {
22
- return '</em>';
23
- },
24
- },
25
- {
26
- name: 'u',
27
- start: () => {
28
- return '<ins>';
29
- },
30
- end: () => {
31
- return '</ins>';
32
- },
33
- },
34
- {
35
- name: 's',
36
- start: () => {
37
- return '<del>';
38
- },
39
- end: () => {
40
- return '</del>';
41
- },
42
- },
43
- {
44
- name: 'style',
45
- start: (tagNode) => {
46
- let style = '';
47
- for (const child of tagNode.attributes) {
48
- switch (child.key) {
49
- case 'color': {
50
- style += `color:${child.val};`;
51
- continue;
52
- }
53
- case 'size': {
54
- if (/^\d+$/.test(child.val)) {
55
- style += `font-size:${child.val}%;`; // When no units provided (i.e. just a number), then assume %
56
- }
57
- else {
58
- style += `font-size:${child.val};`;
59
- }
60
- continue;
61
- }
62
- }
63
- }
64
- return `<span style="${style}">`;
65
- },
66
- end: () => {
67
- return '</span>';
68
- },
69
- },
70
- {
71
- name: 'color',
72
- start: (tagNode) => {
73
- const color = getTagImmediateAttrVal(tagNode);
74
- return `<span style="color:${color};">`;
75
- },
76
- end: () => {
77
- return '</span>';
78
- },
79
- },
80
- {
81
- name: 'hr',
82
- isStandalone: true,
83
- start: () => {
84
- return '<hr />';
85
- },
86
- },
87
- {
88
- name: 'list',
89
- start: (tagNode) => {
90
- return isOrderedList(tagNode)
91
- ? '<ol>'
92
- : '<ul>';
93
- },
94
- end: (tagNode) => {
95
- return isOrderedList(tagNode)
96
- ? '</ol>'
97
- : '</ul>';
98
- },
99
- },
100
- {
101
- name: '*',
102
- isLinebreakTerminated: true,
103
- start: () => {
104
- return '<li>';
105
- },
106
- end: () => {
107
- return '</li>';
108
- },
109
- },
110
- {
111
- name: 'img',
112
- skipChildren: true,
113
- start: (tagNode) => {
114
- const src = getTagImmediateText(tagNode);
115
- if (!src) {
116
- return false;
117
- }
118
- if (isDangerousUrl(src)) {
119
- return false;
120
- }
121
- const { width, height } = getWidthHeightAttr(tagNode);
122
- let str = `<img src="${src}"`;
123
- if (width) {
124
- str += ` width="${width}"`;
125
- }
126
- if (height) {
127
- str += ` height="${height}"`;
128
- }
129
- str += '>';
130
- return str;
131
- },
132
- },
133
- {
134
- name: 'url',
135
- start: (tagNode) => {
136
- const href = getTagImmediateAttrVal(tagNode) ?? getTagImmediateText(tagNode);
137
- if (!href) {
138
- return false;
139
- }
140
- if (isDangerousUrl(href)) {
141
- return false;
142
- }
143
- return `<a href="${href}">`;
144
- },
145
- end: () => {
146
- return '</a>';
147
- },
148
- },
149
- {
150
- name: 'quote',
151
- start: (tagNode) => {
152
- const author = getTagImmediateAttrVal(tagNode);
153
- return author
154
- ? `<blockquote><strong>${author}</strong>`
155
- : '<blockquote>';
156
- },
157
- end: () => {
158
- return '</blockquote>';
159
- },
160
- },
161
- {
162
- name: 'table',
163
- start: () => {
164
- return '<table>';
165
- },
166
- end: () => {
167
- return '</table>';
168
- },
169
- },
170
- {
171
- name: 'tr',
172
- start: () => {
173
- return '<tr>';
174
- },
175
- end: () => {
176
- return '</tr>';
177
- },
178
- },
179
- {
180
- name: 'td',
181
- start: () => {
182
- return '<td>';
183
- },
184
- end: () => {
185
- return '</td>';
186
- },
187
- },
188
- {
189
- name: 'code',
190
- start: () => {
191
- return '<code>';
192
- },
193
- end: () => {
194
- return '</code>';
195
- },
196
- },
197
- ];
198
- //# sourceMappingURL=htmlTransforms.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"htmlTransforms.js","sourceRoot":"","sources":["../../../src/generator/transforms/htmlTransforms.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Gets the text of the immediate attribute of the current TagNode
3
- *
4
- * [url=https://en.wikipedia.org]English Wikipedia[/url]
5
- *
6
- * TagNode [url]
7
- * AttrNode VAL="https://en.wikipedia.org" (returns this string)
8
- * TextNode "https://en.wikipedia.org"
9
- * RootNode
10
- * TextNode "English Wikipedia"
11
- */
12
- export function getTagImmediateAttrVal(tagNode) {
13
- if (tagNode.attributes.length !== 1) {
14
- return undefined;
15
- }
16
- const attrNode = tagNode.attributes[0];
17
- return attrNode.val;
18
- }
19
- //# sourceMappingURL=getTagImmediateAttrVal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getTagImmediateAttrVal.js","sourceRoot":"","sources":["../../../src/generator/utils/getTagImmediateAttrVal.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACnD,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;QACjC,OAAO,SAAS,CAAA;KACnB;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IACtC,OAAO,QAAQ,CAAC,GAAG,CAAA;AACvB,CAAC"}
@@ -1,28 +0,0 @@
1
- import { nodeIsType } from '../../parser/nodeIsType.js';
2
- /**
3
- * Gets the text of the immediate descendant of the current TagNode
4
- *
5
- * [url]https://en.wikipedia.org[/url]
6
- *
7
- * TagNode [url]
8
- * RootNode
9
- * TextNode "https://en.wikipedia.org" (returns this string)
10
- */
11
- export function getTagImmediateText(tagNode) {
12
- if (tagNode.children.length !== 1) {
13
- return undefined;
14
- }
15
- const child = tagNode.children[0];
16
- if (!nodeIsType(child, 0 /* AstNodeType.RootNode */)) {
17
- return undefined;
18
- }
19
- if (child.children.length !== 1) {
20
- return undefined;
21
- }
22
- const textNode = child.children[0];
23
- if (!nodeIsType(textNode, 1 /* AstNodeType.TextNode */)) {
24
- return undefined;
25
- }
26
- return textNode.str;
27
- }
28
- //# sourceMappingURL=getTagImmediateText.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getTagImmediateText.js","sourceRoot":"","sources":["../../../src/generator/utils/getTagImmediateText.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAEvD;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QAC/B,OAAO,SAAS,CAAA;KACnB;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IACjC,IAAI,CAAC,UAAU,CAAC,KAAK,+BAAuB,EAAE;QAC1C,OAAO,SAAS,CAAA;KACnB;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QAC7B,OAAO,SAAS,CAAA;KACnB;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClC,IAAI,CAAC,UAAU,CAAC,QAAQ,+BAAuB,EAAE;QAC7C,OAAO,SAAS,CAAA;KACnB;IAED,OAAO,QAAQ,CAAC,GAAG,CAAA;AACvB,CAAC"}
@@ -1,47 +0,0 @@
1
- /**
2
- * Gets the width/height attributes of the TagNode if they exist
3
- *
4
- * [img 500x300]https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png[/img]
5
- *
6
- * RootNode
7
- * TagNode [img] (returns width:500, height:300)
8
- * AttrNode VAL="500x300"
9
- * TextNode " 500x300"
10
- * RootNode
11
- * TextNode "https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png"
12
- *
13
- * [img width=500 height=300]https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png[/img]
14
- *
15
- * RootNode
16
- * TagNode [img] (returns width:500, height:300)
17
- * AttrNode KEY="width" VAL="500"
18
- * TextNode " width"
19
- * TextNode "500"
20
- * AttrNode KEY="height" VAL="300"
21
- * TextNode " height"
22
- * TextNode "300"
23
- * RootNode
24
- * TextNode "https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png
25
- */
26
- export function getWidthHeightAttr(tagNode) {
27
- let width;
28
- let height;
29
- for (const child of tagNode.attributes) {
30
- if (child.key === 'width') {
31
- width = child.val;
32
- }
33
- if (child.key === 'height') {
34
- height = child.val;
35
- }
36
- const matches = /(\d+)x(\d+)/.exec(child.val);
37
- if (matches) {
38
- width = matches[1];
39
- height = matches[2];
40
- }
41
- }
42
- return {
43
- width,
44
- height,
45
- };
46
- }
47
- //# sourceMappingURL=getWidthHeightAttr.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getWidthHeightAttr.js","sourceRoot":"","sources":["../../../src/generator/utils/getWidthHeightAttr.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IAC/C,IAAI,KAAyB,CAAA;IAC7B,IAAI,MAA0B,CAAA;IAE9B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE;QACpC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACvB,KAAK,GAAG,KAAK,CAAC,GAAG,CAAA;SACpB;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YACxB,MAAM,GAAG,KAAK,CAAC,GAAG,CAAA;SACrB;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAI,OAAO,EAAE;YACT,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YAClB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;SACtB;KACJ;IAED,OAAO;QACH,KAAK;QACL,MAAM;KACT,CAAA;AACL,CAAC"}
@@ -1,14 +0,0 @@
1
- const dangerousUriRe = /^(vbscript|javascript|file|data):/;
2
- const safeDataUriRe = /^data:image\/(gif|png|jpeg|webp);/;
3
- export function isDangerousUrl(url) {
4
- const normalizedUrl = url.trim().toLowerCase();
5
- if (!dangerousUriRe.test(normalizedUrl)) {
6
- return false;
7
- }
8
- // Only a subset of data uris are considered safe
9
- if (safeDataUriRe.test(normalizedUrl)) {
10
- return false;
11
- }
12
- return true;
13
- }
14
- //# sourceMappingURL=isDangerousUrl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"isDangerousUrl.js","sourceRoot":"","sources":["../../../src/generator/utils/isDangerousUrl.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,mCAAmC,CAAA;AAC1D,MAAM,aAAa,GAAG,mCAAmC,CAAA;AAEzD,MAAM,UAAU,cAAc,CAAC,GAAW;IACtC,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAE9C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;QACrC,OAAO,KAAK,CAAA;KACf;IAED,iDAAiD;IACjD,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;QACnC,OAAO,KAAK,CAAA;KACf;IAED,OAAO,IAAI,CAAA;AACf,CAAC"}