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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Stephen Li
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,77 @@
1
+ # BBCode Compiler
2
+
3
+ This is a fast BBCode parser and HTML generator with TypeScript support.
4
+
5
+ **Note:** This package is only available in ESM format.
6
+
7
+ ## Usage
8
+
9
+ ```ts
10
+ import { generateHtml } from 'bbcode-compiler'
11
+
12
+ // <strong>Hello World</strong>
13
+ const html = generateHtml('[b]Hello World[/b]')
14
+ ```
15
+
16
+ ## Extending With Custom Tags
17
+
18
+ ```ts
19
+ import { generateHtml, getTagImmediateText, htmlTransforms, getWidthHeightAttr } from 'bbcode-compiler'
20
+
21
+ const customTransforms: typeof htmlTransforms = [
22
+ // Default tags included with this package
23
+ ...htmlTransforms,
24
+
25
+ // You can override a default tag by including it after the original in the transforms array
26
+ {
27
+ name: 'b',
28
+ start: () => '<b>',
29
+ end: () => '</b>',
30
+ },
31
+
32
+ // Create new tag
33
+ // You should read the TypeScript interface for TagNode in src/parser/AstNode.ts
34
+ // You can also use the included helper functions like getTagImmediateText and getWidthHeightAttr
35
+ {
36
+ name: 'youtube',
37
+ skipChildren: true, // Do not actually render the "https://www.youtube.com/watch?v=dQw4w9WgXcQ" text
38
+ start: (tagNode) => {
39
+ const src = getTagImmediateText(tagNode)
40
+ if (!src) {
41
+ return false
42
+ }
43
+
44
+ const matches = /youtube.com\/watch\?v=(\w+)/.exec(src)
45
+ if (!matches) {
46
+ return false
47
+ }
48
+
49
+ const videoId = matches[1]
50
+ const { width, height } = getWidthHeightAttr(tagNode)
51
+
52
+ return `
53
+ <iframe
54
+ width="${width ?? 560}"
55
+ height="${height ?? 315}"
56
+ src="https://www.youtube.com/embed/${videoId}"
57
+ title="YouTube Video Player"
58
+ frameborder="0"
59
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
60
+ allowfullscreen
61
+ ></iframe>
62
+ `
63
+ },
64
+ },
65
+ ]
66
+
67
+ // <iframe
68
+ // width="560"
69
+ // height="315"
70
+ // src="https://www.youtube.com/embed/dQw4w9WgXcQ"
71
+ // title="YouTube Video Player"
72
+ // frameborder="0"
73
+ // allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
74
+ // allowfullscreen
75
+ // ></iframe>
76
+ const html = generateHtml('[youtube]https://www.youtube.com/watch?v=dQw4w9WgXcQ[/youtube]', customTransforms)
77
+ ```
@@ -0,0 +1,2 @@
1
+ export declare function generateHtml(input: string, transforms?: readonly import(".").Transform[]): string;
2
+ //# sourceMappingURL=generateHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateHtml.d.ts","sourceRoot":"","sources":["../src/generateHtml.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,mCAAiB,GAAG,MAAM,CAS/E"}
@@ -0,0 +1,13 @@
1
+ import { Generator } from './generator/Generator';
2
+ import { htmlTransforms } from './generator/transforms/htmlTransforms';
3
+ import { Lexer } from './lexer/Lexer';
4
+ import { Parser } from './parser/Parser';
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateHtml.js","sourceRoot":"","sources":["../src/generateHtml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,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"}
@@ -0,0 +1,8 @@
1
+ import { RootNode } from '../parser/AstNode';
2
+ import type { Transform } from './transforms/Transform';
3
+ export declare class Generator {
4
+ transforms: ReadonlyMap<string, Transform>;
5
+ constructor(transforms?: readonly Transform[]);
6
+ generate(root: RootNode): string;
7
+ }
8
+ //# sourceMappingURL=Generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generator.d.ts","sourceRoot":"","sources":["../../src/generator/Generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAEvD,qBAAa,SAAS;IAClB,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;gBAE9B,UAAU,uBAAiB;IAIvC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;CA+CnC"}
@@ -0,0 +1,54 @@
1
+ import '../parser/AstNode';
2
+ import { nodeIsType } from '../parser/nodeIsType';
3
+ import { htmlTransforms } from './transforms/htmlTransforms';
4
+ export class Generator {
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generator.js","sourceRoot":"","sources":["../../src/generator/Generator.ts"],"names":[],"mappings":"AAAA,OAA+C,mBAAmB,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAG5D,MAAM,OAAO,SAAS;IAGlB,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"}
@@ -0,0 +1,10 @@
1
+ import type { TagNode } from '../../parser/AstNode';
2
+ export interface Transform {
3
+ name: string;
4
+ skipChildren?: boolean;
5
+ isStandalone?: boolean;
6
+ isLinebreakTerminated?: boolean;
7
+ start: (tagNode: TagNode) => string | false;
8
+ end?: (tagNode: TagNode) => string;
9
+ }
10
+ //# sourceMappingURL=Transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transform.d.ts","sourceRoot":"","sources":["../../../src/generator/transforms/Transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEnD,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAA;IAEZ,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAG/B,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,KAAK,CAAA;IAG3C,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAA;CACrC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transform.js","sourceRoot":"","sources":["../../../src/generator/transforms/Transform.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { Transform } from './Transform';
2
+ export declare const htmlTransforms: ReadonlyArray<Transform>;
3
+ //# sourceMappingURL=htmlTransforms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htmlTransforms.d.ts","sourceRoot":"","sources":["../../../src/generator/transforms/htmlTransforms.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,SAAS,CAqMnD,CAAA"}
@@ -0,0 +1,198 @@
1
+ import { getTagImmediateAttrVal } from '../utils/getTagImmediateAttrVal';
2
+ import { getTagImmediateText } from '../utils/getTagImmediateText';
3
+ import { getWidthHeightAttr } from '../utils/getWidthHeightAttr';
4
+ import { isDangerousUrl } from '../utils/isDangerousUrl';
5
+ import { isOrderedList } from '../utils/isOrderedList';
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htmlTransforms.js","sourceRoot":"","sources":["../../../src/generator/transforms/htmlTransforms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { TagNode } from '../../parser/AstNode';
2
+ /**
3
+ * Gets the text of the immediate attribute of the current TagNode
4
+ *
5
+ * [url=https://en.wikipedia.org]English Wikipedia[/url]
6
+ *
7
+ * TagNode [url]
8
+ * AttrNode VAL="https://en.wikipedia.org" (returns this string)
9
+ * TextNode "https://en.wikipedia.org"
10
+ * RootNode
11
+ * TextNode "English Wikipedia"
12
+ */
13
+ export declare function getTagImmediateAttrVal(tagNode: TagNode): string | undefined;
14
+ //# sourceMappingURL=getTagImmediateAttrVal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTagImmediateAttrVal.d.ts","sourceRoot":"","sources":["../../../src/generator/utils/getTagImmediateAttrVal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEnD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAO3E"}
@@ -0,0 +1,19 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,12 @@
1
+ import { TagNode } from '../../parser/AstNode';
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 declare function getTagImmediateText(tagNode: TagNode): string | undefined;
12
+ //# sourceMappingURL=getTagImmediateText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTagImmediateText.d.ts","sourceRoot":"","sources":["../../../src/generator/utils/getTagImmediateText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAG3D;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAoBxE"}
@@ -0,0 +1,29 @@
1
+ import '../../parser/AstNode';
2
+ import { nodeIsType } from '../../parser/nodeIsType';
3
+ /**
4
+ * Gets the text of the immediate descendant of the current TagNode
5
+ *
6
+ * [url]https://en.wikipedia.org[/url]
7
+ *
8
+ * TagNode [url]
9
+ * RootNode
10
+ * TextNode "https://en.wikipedia.org" (returns this string)
11
+ */
12
+ export function getTagImmediateText(tagNode) {
13
+ if (tagNode.children.length !== 1) {
14
+ return undefined;
15
+ }
16
+ const child = tagNode.children[0];
17
+ if (!nodeIsType(child, 0 /* AstNodeType.RootNode */)) {
18
+ return undefined;
19
+ }
20
+ if (child.children.length !== 1) {
21
+ return undefined;
22
+ }
23
+ const textNode = child.children[0];
24
+ if (!nodeIsType(textNode, 1 /* AstNodeType.TextNode */)) {
25
+ return undefined;
26
+ }
27
+ return textNode.str;
28
+ }
29
+ //# sourceMappingURL=getTagImmediateText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTagImmediateText.js","sourceRoot":"","sources":["../../../src/generator/utils/getTagImmediateText.ts"],"names":[],"mappings":"AAAA,OAAqC,sBAAsB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD;;;;;;;;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"}
@@ -0,0 +1,31 @@
1
+ import type { TagNode } from '../../parser/AstNode';
2
+ /**
3
+ * Gets the width/height attributes of the TagNode if they exist
4
+ *
5
+ * [img 500x300]https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png[/img]
6
+ *
7
+ * RootNode
8
+ * TagNode [img] (returns width:500, height:300)
9
+ * AttrNode VAL="500x300"
10
+ * TextNode " 500x300"
11
+ * RootNode
12
+ * TextNode "https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png"
13
+ *
14
+ * [img width=500 height=300]https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png[/img]
15
+ *
16
+ * RootNode
17
+ * TagNode [img] (returns width:500, height:300)
18
+ * AttrNode KEY="width" VAL="500"
19
+ * TextNode " width"
20
+ * TextNode "500"
21
+ * AttrNode KEY="height" VAL="300"
22
+ * TextNode " height"
23
+ * TextNode "300"
24
+ * RootNode
25
+ * TextNode "https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png
26
+ */
27
+ export declare function getWidthHeightAttr(tagNode: TagNode): {
28
+ width?: string;
29
+ height?: string;
30
+ };
31
+ //# sourceMappingURL=getWidthHeightAttr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getWidthHeightAttr.d.ts","sourceRoot":"","sources":["../../../src/generator/utils/getWidthHeightAttr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAuBxF"}
@@ -0,0 +1,47 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export declare function isDangerousUrl(url: string): boolean;
2
+ //# sourceMappingURL=isDangerousUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isDangerousUrl.d.ts","sourceRoot":"","sources":["../../../src/generator/utils/isDangerousUrl.ts"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAanD"}
@@ -0,0 +1,14 @@
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
@@ -0,0 +1 @@
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"}