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
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"Transform.js","sourceRoot":"","sources":["../../../src/generator/transforms/Transform.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
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"}
|