react-native-marked 1.6.12 → 1.6.14
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/dist/commonjs/components/MDImage.js.map +1 -1
- package/dist/commonjs/lib/Markdown.js +6 -7
- package/dist/commonjs/lib/Markdown.js.map +1 -1
- package/dist/commonjs/lib/Parser.js +159 -172
- package/dist/commonjs/lib/Parser.js.map +1 -1
- package/dist/commonjs/lib/Renderer.js +26 -32
- package/dist/commonjs/lib/Renderer.js.map +1 -1
- package/dist/commonjs/lib/types.js.map +1 -1
- package/dist/commonjs/theme/colors.js.map +1 -1
- package/dist/commonjs/theme/spacing.js.map +1 -1
- package/dist/commonjs/theme/styles.js.map +1 -1
- package/dist/commonjs/theme/types.js.map +1 -1
- package/dist/commonjs/utils/handlers.js.map +1 -1
- package/dist/commonjs/utils/string.js.map +1 -1
- package/dist/commonjs/utils/url.js.map +1 -1
- package/dist/module/components/MDImage.js.map +1 -1
- package/dist/module/lib/Markdown.js +6 -6
- package/dist/module/lib/Markdown.js.map +1 -1
- package/dist/module/lib/Parser.js +159 -172
- package/dist/module/lib/Parser.js.map +1 -1
- package/dist/module/lib/Renderer.js +26 -32
- package/dist/module/lib/Renderer.js.map +1 -1
- package/dist/module/lib/types.js.map +1 -1
- package/dist/module/theme/colors.js.map +1 -1
- package/dist/module/theme/spacing.js.map +1 -1
- package/dist/module/theme/styles.js.map +1 -1
- package/dist/module/theme/types.js.map +1 -1
- package/dist/module/utils/handlers.js.map +1 -1
- package/dist/module/utils/string.js.map +1 -1
- package/dist/module/utils/url.js.map +1 -1
- package/dist/typescript/src/components/MDImage.d.ts +1 -1
- package/dist/typescript/src/components/MDImage.d.ts.map +1 -1
- package/dist/typescript/src/lib/Markdown.d.ts.map +1 -1
- package/dist/typescript/src/lib/Parser.d.ts +2 -2
- package/dist/typescript/src/lib/Parser.d.ts.map +1 -1
- package/dist/typescript/src/lib/Renderer.d.ts +2 -2
- package/dist/typescript/src/lib/Renderer.d.ts.map +1 -1
- package/dist/typescript/src/theme/styles.d.ts +1 -1
- package/dist/typescript/src/theme/styles.d.ts.map +1 -1
- package/package.json +22 -22
- package/src/components/MDImage.tsx +1 -1
- package/src/lib/Markdown.tsx +14 -4
- package/src/lib/Parser.tsx +158 -157
- package/src/lib/Renderer.tsx +5 -5
- package/src/theme/styles.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["generateRandomString","Math","random","toString","substring"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["generateRandomString","Math","random","toString","substring"],"sourceRoot":"../../../src","sources":["utils/string.ts"],"mappings":"AAAA;AACA;AACA;AACA;AACA,OAAO,MAAMA,oBAAoB,GAAG,MAAM;EACzC,OAAOC,IAAI,CAACC,MAAL,GAAcC,QAAd,CAAuB,EAAvB,EAA2BC,SAA3B,CAAqC,CAArC,CAAP;AACA,CAFM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getValidURL","prefix","path","endsWith","slice","startsWith"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["getValidURL","prefix","path","endsWith","slice","startsWith"],"sourceRoot":"../../../src","sources":["utils/url.ts"],"mappings":"AAAA,OAAO,MAAMA,WAAW,GAAG,CAACC,MAAD,EAAiBC,IAAjB,KAAkC;EAC5D;EACA,IAAID,MAAM,CAACE,QAAP,CAAgB,GAAhB,CAAJ,EAA0B;IACzBF,MAAM,GAAGA,MAAM,CAACG,KAAP,CAAa,CAAb,EAAgB,CAAC,CAAjB,CAAT;EACA,CAJ2D,CAM5D;;;EACA,IAAIF,IAAI,CAACG,UAAL,CAAgB,OAAhB,KAA4BH,IAAI,CAACG,UAAL,CAAgB,MAAhB,CAAhC,EAAyD;IACxD,OAAOH,IAAP;EACA,CAT2D,CAW5D;;;EACA,IAAIA,IAAI,CAACG,UAAL,CAAgB,GAAhB,CAAJ,EAA0B;IACzB,OAAQ,GAAEJ,MAAO,GAAEC,IAAK,EAAxB;EACA,CAd2D,CAgB5D;;;EACA,OAAQ,GAAED,MAAO,IAAGC,IAAK,EAAzB;AACA,CAlBM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MDImage.d.ts","sourceRoot":"","sources":["../../../../src/components/MDImage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAS,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"MDImage.d.ts","sourceRoot":"","sources":["../../../../src/components/MDImage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAGtD,UAAU,YAAY;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;CACnB;;AAmBD,wBAA6B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../../../src/lib/Markdown.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../../../src/lib/Markdown.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAKf,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;;AAgD7C,wBAA8B"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
|
-
import type { TextStyle, ViewStyle, ImageStyle } from "react-native";
|
|
3
2
|
import type { marked } from "marked";
|
|
4
3
|
import type { ParserOptions } from "./types";
|
|
5
4
|
declare class Parser {
|
|
@@ -9,7 +8,8 @@ declare class Parser {
|
|
|
9
8
|
private baseUrl;
|
|
10
9
|
constructor(options: ParserOptions);
|
|
11
10
|
parse(tokens: marked.Token[]): ReactNode[];
|
|
12
|
-
|
|
11
|
+
private _parse;
|
|
12
|
+
private _parseToken;
|
|
13
13
|
private getNormalizedSiblingNodesForBlockAndInlineTokens;
|
|
14
14
|
}
|
|
15
15
|
export default Parser;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../../../src/lib/Parser.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../../../src/lib/Parser.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,cAAM,MAAM;IACX,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,gBAAgB,CAAwC;IAChE,OAAO,CAAC,OAAO,CAAS;gBACZ,OAAO,EAAE,aAAa;IAclC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE;IAI5B,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,WAAW;IA6JnB,OAAO,CAAC,gDAAgD,CAuDtD;CACF;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ReactNode } from "react";
|
|
2
|
-
import { TextStyle, ViewStyle, ImageStyle } from "react-native";
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type TextStyle, type ViewStyle, type ImageStyle } from "react-native";
|
|
3
3
|
declare class Renderer {
|
|
4
4
|
getTextNode: (children: string | ReactNode[], styles?: TextStyle) => JSX.Element;
|
|
5
5
|
getTextLinkNode: (children: string | ReactNode[], href: string, styles?: TextStyle) => JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/lib/Renderer.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/lib/Renderer.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAKN,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,UAAU,EACf,MAAM,cAAc,CAAC;AAQtB,cAAM,QAAQ;IACb,WAAW,aAAc,MAAM,GAAG,SAAS,EAAE,WAAW,SAAS,iBAM/D;IAEF,eAAe,aACJ,MAAM,GAAG,SAAS,EAAE,QACxB,MAAM,WACH,SAAS,iBAajB;IAEF,gBAAgB,SACT,MAAM,YACF,MAAM,QACV,MAAM,UACJ,UAAU,iBAajB;IAEF,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,SAAS;IAQ5D,gBAAgB,CACf,IAAI,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,SAAS,EAC1B,SAAS,CAAC,EAAE,SAAS;IAatB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,SAAS;IAQ3D,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU;IAM1D,WAAW,CACV,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,SAAS,EAAE,EACf,SAAS,CAAC,EAAE,SAAS,EACrB,SAAS,CAAC,EAAE,SAAS;CAatB;AAED,eAAe,QAAQ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ColorSchemeName } from "react-native";
|
|
1
|
+
import { type ColorSchemeName } from "react-native";
|
|
2
2
|
import type { MarkedStyles, UserTheme } from "./types";
|
|
3
3
|
declare const getStyles: (userStyles?: MarkedStyles, colorScheme?: ColorSchemeName, userTheme?: UserTheme) => MarkedStyles;
|
|
4
4
|
export default getStyles;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/theme/styles.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/theme/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAGhE,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAgBvD,QAAA,MAAM,SAAS,gBACD,YAAY,gBACX,eAAe,cACjB,SAAS,KACnB,YA+GF,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-marked",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.14",
|
|
4
4
|
"description": "Markdown renderer for React Native powered by marked.js",
|
|
5
5
|
"main": "dist/commonjs/index",
|
|
6
6
|
"module": "dist/module/index",
|
|
@@ -48,32 +48,32 @@
|
|
|
48
48
|
"registry": "https://registry.npmjs.org/"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@babel/core": "7.
|
|
51
|
+
"@babel/core": "7.21.3",
|
|
52
52
|
"@babel/preset-env": "7.20.2",
|
|
53
|
-
"@commitlint/config-conventional": "17.4.
|
|
54
|
-
"@evilmartians/lefthook": "1.
|
|
53
|
+
"@commitlint/config-conventional": "17.4.4",
|
|
54
|
+
"@evilmartians/lefthook": "1.3.7",
|
|
55
55
|
"@release-it/conventional-changelog": "5.1.1",
|
|
56
|
-
"@testing-library/jest-native": "5.4.
|
|
57
|
-
"@testing-library/react-native": "
|
|
58
|
-
"@types/jest": "29.
|
|
56
|
+
"@testing-library/jest-native": "5.4.2",
|
|
57
|
+
"@testing-library/react-native": "12.0.0",
|
|
58
|
+
"@types/jest": "29.5.0",
|
|
59
59
|
"@types/marked": "4.0.8",
|
|
60
60
|
"@types/node": "^18.11.18",
|
|
61
|
-
"@types/react": "18.0.
|
|
62
|
-
"@types/react-native": "0.
|
|
63
|
-
"commitlint": "17.
|
|
64
|
-
"danger": "11.2.
|
|
65
|
-
"jest": "29.
|
|
66
|
-
"jest-environment-jsdom": "29.
|
|
67
|
-
"metro-react-native-babel-preset": "0.
|
|
61
|
+
"@types/react": "18.0.28",
|
|
62
|
+
"@types/react-native": "0.71.4",
|
|
63
|
+
"commitlint": "17.5.0",
|
|
64
|
+
"danger": "11.2.4",
|
|
65
|
+
"jest": "29.5.0",
|
|
66
|
+
"jest-environment-jsdom": "29.5.0",
|
|
67
|
+
"metro-react-native-babel-preset": "0.76.0",
|
|
68
68
|
"pod-install": "0.1.38",
|
|
69
|
-
"react": "18.
|
|
70
|
-
"react-native": "0.
|
|
71
|
-
"react-native-builder-bob": "0.20.
|
|
72
|
-
"react-test-renderer": "18.
|
|
73
|
-
"reassure": "0.
|
|
74
|
-
"release-it": "15.
|
|
69
|
+
"react": "18.2.0",
|
|
70
|
+
"react-native": "0.71.4",
|
|
71
|
+
"react-native-builder-bob": "0.20.4",
|
|
72
|
+
"react-test-renderer": "18.2.0",
|
|
73
|
+
"reassure": "0.7.2",
|
|
74
|
+
"release-it": "15.9.1",
|
|
75
75
|
"rome": "11.0.0",
|
|
76
|
-
"typescript": "
|
|
76
|
+
"typescript": "5.0.2"
|
|
77
77
|
},
|
|
78
78
|
"peerDependencies": {
|
|
79
79
|
"react": "^16.8.6 || ^17.0.0 || ^18.0.0",
|
|
@@ -151,7 +151,7 @@
|
|
|
151
151
|
"dependencies": {
|
|
152
152
|
"@jsamr/counter-style": "2.0.2",
|
|
153
153
|
"@jsamr/react-native-li": "2.3.1",
|
|
154
|
-
"marked": "4.
|
|
154
|
+
"marked": "4.3.0",
|
|
155
155
|
"react-native-fit-image": "1.5.5"
|
|
156
156
|
}
|
|
157
157
|
}
|
package/src/lib/Markdown.tsx
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, {
|
|
2
|
+
memo,
|
|
3
|
+
useCallback,
|
|
4
|
+
useMemo,
|
|
5
|
+
type ReactElement,
|
|
6
|
+
type ReactNode,
|
|
7
|
+
} from "react";
|
|
2
8
|
import { FlatList, useColorScheme } from "react-native";
|
|
3
9
|
import { marked } from "marked";
|
|
4
10
|
import Parser from "./Parser";
|
|
@@ -18,14 +24,18 @@ const Markdown = ({
|
|
|
18
24
|
[userStyles, colorScheme, theme],
|
|
19
25
|
);
|
|
20
26
|
|
|
27
|
+
const parser = useMemo(
|
|
28
|
+
() => new Parser({ styles, baseUrl }),
|
|
29
|
+
[styles, baseUrl],
|
|
30
|
+
);
|
|
31
|
+
|
|
21
32
|
const rnElements = useMemo(() => {
|
|
22
|
-
const parser = new Parser({ styles, baseUrl });
|
|
23
33
|
const tokens = marked.lexer(value, { mangle: false, gfm: true });
|
|
24
34
|
return parser.parse(tokens);
|
|
25
35
|
}, [value, styles, baseUrl]);
|
|
26
36
|
|
|
27
37
|
const renderItem = useCallback(({ item }: { item: ReactNode }) => {
|
|
28
|
-
return
|
|
38
|
+
return item as ReactElement;
|
|
29
39
|
}, []);
|
|
30
40
|
|
|
31
41
|
const keyExtractor = useCallback(
|
|
@@ -35,10 +45,10 @@ const Markdown = ({
|
|
|
35
45
|
|
|
36
46
|
return (
|
|
37
47
|
<FlatList
|
|
48
|
+
removeClippedSubviews
|
|
38
49
|
keyExtractor={keyExtractor}
|
|
39
50
|
maxToRenderPerBatch={8}
|
|
40
51
|
initialNumToRender={8}
|
|
41
|
-
removeClippedSubviews={true}
|
|
42
52
|
style={styles.container}
|
|
43
53
|
{...flatListProps}
|
|
44
54
|
data={rnElements}
|
package/src/lib/Parser.tsx
CHANGED
|
@@ -26,173 +26,174 @@ class Parser {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
parse(tokens: marked.Token[]) {
|
|
29
|
-
|
|
30
|
-
switch (token.type) {
|
|
31
|
-
case "space": {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
case "paragraph": {
|
|
35
|
-
const paragraphChildren =
|
|
36
|
-
this.getNormalizedSiblingNodesForBlockAndInlineTokens(
|
|
37
|
-
token.tokens,
|
|
38
|
-
this.styles.text,
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
return this.renderer.getViewNode(
|
|
42
|
-
paragraphChildren,
|
|
43
|
-
this.styles.paragraph,
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
case "blockquote": {
|
|
47
|
-
return this.renderer.getBlockquoteNode(
|
|
48
|
-
this.parse(token.tokens),
|
|
49
|
-
this.styles.blockquote,
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
case "heading": {
|
|
53
|
-
const styles = this.headingStylesMap[token.depth];
|
|
54
|
-
return this.renderer.getTextNode(
|
|
55
|
-
this.parseInline(token.tokens, styles),
|
|
56
|
-
styles,
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
case "code": {
|
|
60
|
-
return this.renderer.getCodeBlockNode(
|
|
61
|
-
token.text,
|
|
62
|
-
this.styles.code,
|
|
63
|
-
this.styles.em,
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
case "hr": {
|
|
67
|
-
return this.renderer.getViewNode(null, this.styles.hr);
|
|
68
|
-
}
|
|
69
|
-
case "list": {
|
|
70
|
-
const li = token.items.map((item) => {
|
|
71
|
-
const children = item.tokens.map((cItem) => {
|
|
72
|
-
if (cItem.type === "text") {
|
|
73
|
-
/* getViewNode since tokens could contain a block like elements (i.e. img) */
|
|
74
|
-
const childTokens = (cItem as marked.Tokens.Text).tokens || [];
|
|
75
|
-
const listChildren =
|
|
76
|
-
this.getNormalizedSiblingNodesForBlockAndInlineTokens(
|
|
77
|
-
childTokens,
|
|
78
|
-
this.styles.li,
|
|
79
|
-
);
|
|
80
|
-
return this.renderer.getViewNode(listChildren, this.styles.li);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/* Parse the nested token */
|
|
84
|
-
return this.parse([cItem]);
|
|
85
|
-
});
|
|
86
|
-
return this.renderer.getViewNode(children, this.styles.li);
|
|
87
|
-
});
|
|
88
|
-
return this.renderer.getListNode(
|
|
89
|
-
token.ordered,
|
|
90
|
-
li,
|
|
91
|
-
this.styles.list,
|
|
92
|
-
this.styles.li,
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
default:
|
|
96
|
-
return this.parseInline([token]);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
return elements.filter((element) => element !== null);
|
|
29
|
+
return this._parse(tokens);
|
|
100
30
|
}
|
|
101
31
|
|
|
102
|
-
|
|
32
|
+
private _parse(
|
|
103
33
|
tokens: marked.Token[],
|
|
104
34
|
styles?: ViewStyle | TextStyle | ImageStyle,
|
|
105
35
|
) {
|
|
106
36
|
const elements: ReactNode[] = tokens.map((token) => {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
linkStyle,
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
case "image": {
|
|
129
|
-
return this.renderer.getImageNode(
|
|
130
|
-
token.href,
|
|
131
|
-
token.text || token.title,
|
|
132
|
-
this.styles.image,
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
case "strong": {
|
|
136
|
-
const boldStyle = {
|
|
137
|
-
...this.styles.strong,
|
|
138
|
-
...styles,
|
|
139
|
-
};
|
|
140
|
-
return this.renderer.getTextNode(
|
|
141
|
-
this.parseInline(token.tokens, boldStyle),
|
|
142
|
-
boldStyle,
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
case "em": {
|
|
146
|
-
const italicStyle = {
|
|
147
|
-
...this.styles.em,
|
|
148
|
-
...styles,
|
|
149
|
-
};
|
|
150
|
-
return this.renderer.getTextNode(
|
|
151
|
-
this.parseInline(token.tokens, italicStyle),
|
|
152
|
-
italicStyle,
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
case "codespan": {
|
|
156
|
-
return this.renderer.getTextNode(token.text, {
|
|
157
|
-
...this.styles.codespan,
|
|
158
|
-
...styles,
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
case "br": {
|
|
162
|
-
return this.renderer.getTextNode("\n", {});
|
|
163
|
-
}
|
|
164
|
-
case "del": {
|
|
165
|
-
const strikethroughStyle = {
|
|
166
|
-
...this.styles.strikethrough,
|
|
167
|
-
...styles,
|
|
168
|
-
};
|
|
169
|
-
return this.renderer.getTextNode(
|
|
170
|
-
this.parseInline(token.tokens, strikethroughStyle),
|
|
171
|
-
strikethroughStyle,
|
|
37
|
+
return this._parseToken(token, styles);
|
|
38
|
+
});
|
|
39
|
+
return elements.filter((element) => element !== null);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private _parseToken(
|
|
43
|
+
token: marked.Token,
|
|
44
|
+
styles?: ViewStyle | TextStyle | ImageStyle,
|
|
45
|
+
): ReactNode {
|
|
46
|
+
switch (token.type) {
|
|
47
|
+
case "space": {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
case "paragraph": {
|
|
51
|
+
const paragraphChildren =
|
|
52
|
+
this.getNormalizedSiblingNodesForBlockAndInlineTokens(
|
|
53
|
+
token.tokens,
|
|
54
|
+
this.styles.text,
|
|
172
55
|
);
|
|
173
|
-
}
|
|
174
|
-
case "text":
|
|
175
|
-
case "html": {
|
|
176
|
-
if (token.type === "html") {
|
|
177
|
-
console.warn(
|
|
178
|
-
"react-native-marked: rendering html from markdown is not supported",
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
56
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
57
|
+
return this.renderer.getViewNode(
|
|
58
|
+
paragraphChildren,
|
|
59
|
+
this.styles.paragraph,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
case "blockquote": {
|
|
63
|
+
return this.renderer.getBlockquoteNode(
|
|
64
|
+
this._parse(token.tokens),
|
|
65
|
+
this.styles.blockquote,
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
case "heading": {
|
|
69
|
+
const styles = this.headingStylesMap[token.depth];
|
|
70
|
+
return this.renderer.getTextNode(
|
|
71
|
+
this._parse(token.tokens, styles),
|
|
72
|
+
styles,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
case "code": {
|
|
76
|
+
return this.renderer.getCodeBlockNode(
|
|
77
|
+
token.text,
|
|
78
|
+
this.styles.code,
|
|
79
|
+
this.styles.em,
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
case "hr": {
|
|
83
|
+
return this.renderer.getViewNode(null, this.styles.hr);
|
|
84
|
+
}
|
|
85
|
+
case "list": {
|
|
86
|
+
const li = token.items.map((item) => {
|
|
87
|
+
const children = item.tokens.map((cItem) => {
|
|
88
|
+
if (cItem.type === "text") {
|
|
89
|
+
/* getViewNode since tokens could contain a block like elements (i.e. img) */
|
|
90
|
+
const childTokens = (cItem as marked.Tokens.Text).tokens || [];
|
|
91
|
+
const listChildren =
|
|
92
|
+
this.getNormalizedSiblingNodesForBlockAndInlineTokens(
|
|
93
|
+
childTokens,
|
|
94
|
+
this.styles.li,
|
|
95
|
+
);
|
|
96
|
+
return this.renderer.getViewNode(listChildren, this.styles.li);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* Parse the nested token */
|
|
100
|
+
return this._parseToken(cItem);
|
|
185
101
|
});
|
|
186
|
-
|
|
187
|
-
|
|
102
|
+
return this.renderer.getViewNode(children, this.styles.li);
|
|
103
|
+
});
|
|
104
|
+
return this.renderer.getListNode(
|
|
105
|
+
token.ordered,
|
|
106
|
+
li,
|
|
107
|
+
this.styles.list,
|
|
108
|
+
this.styles.li,
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
case "escape": {
|
|
112
|
+
return this.renderer.getTextNode(token.text, {
|
|
113
|
+
...this.styles.text,
|
|
114
|
+
...styles,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
case "link": {
|
|
118
|
+
// Note: Linking Images (https://www.markdownguide.org/basic-syntax/#linking-images) are wrapped
|
|
119
|
+
// in paragraph token, so will be handled via `getNormalizedSiblingNodesForBlockAndInlineTokens`
|
|
120
|
+
const linkStyle = {
|
|
121
|
+
...styles,
|
|
122
|
+
...this.styles.link, // To override color property
|
|
123
|
+
};
|
|
124
|
+
const href = getValidURL(this.baseUrl, token.href);
|
|
125
|
+
return this.renderer.getTextLinkNode(
|
|
126
|
+
this._parse(token.tokens, linkStyle),
|
|
127
|
+
href,
|
|
128
|
+
linkStyle,
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
case "image": {
|
|
132
|
+
return this.renderer.getImageNode(
|
|
133
|
+
token.href,
|
|
134
|
+
token.text || token.title,
|
|
135
|
+
this.styles.image,
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
case "strong": {
|
|
139
|
+
const boldStyle = {
|
|
140
|
+
...this.styles.strong,
|
|
141
|
+
...styles,
|
|
142
|
+
};
|
|
143
|
+
return this.renderer.getTextNode(
|
|
144
|
+
this._parse(token.tokens, boldStyle),
|
|
145
|
+
boldStyle,
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
case "em": {
|
|
149
|
+
const italicStyle = {
|
|
150
|
+
...this.styles.em,
|
|
151
|
+
...styles,
|
|
152
|
+
};
|
|
153
|
+
return this.renderer.getTextNode(
|
|
154
|
+
this._parse(token.tokens, italicStyle),
|
|
155
|
+
italicStyle,
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
case "codespan": {
|
|
159
|
+
return this.renderer.getTextNode(token.text, {
|
|
160
|
+
...this.styles.codespan,
|
|
161
|
+
...styles,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
case "br": {
|
|
165
|
+
return this.renderer.getTextNode("\n", {});
|
|
166
|
+
}
|
|
167
|
+
case "del": {
|
|
168
|
+
const strikethroughStyle = {
|
|
169
|
+
...this.styles.strikethrough,
|
|
170
|
+
...styles,
|
|
171
|
+
};
|
|
172
|
+
return this.renderer.getTextNode(
|
|
173
|
+
this._parse(token.tokens, strikethroughStyle),
|
|
174
|
+
strikethroughStyle,
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
case "text":
|
|
178
|
+
case "html": {
|
|
179
|
+
if (token.type === "html") {
|
|
188
180
|
console.warn(
|
|
189
|
-
|
|
181
|
+
"react-native-marked: rendering html from markdown is not supported",
|
|
190
182
|
);
|
|
191
|
-
return null;
|
|
192
183
|
}
|
|
184
|
+
|
|
185
|
+
return this.renderer.getTextNode(token.raw, {
|
|
186
|
+
...this.styles.text,
|
|
187
|
+
...styles,
|
|
188
|
+
});
|
|
193
189
|
}
|
|
194
|
-
|
|
195
|
-
|
|
190
|
+
default: {
|
|
191
|
+
console.warn(
|
|
192
|
+
`react-native-marked: token with '${token.type}' type was not found.`,
|
|
193
|
+
);
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
196
197
|
}
|
|
197
198
|
|
|
198
199
|
private getNormalizedSiblingNodesForBlockAndInlineTokens = (
|
|
@@ -215,14 +216,14 @@ class Parser {
|
|
|
215
216
|
t.tokens[0].type === "image")
|
|
216
217
|
) {
|
|
217
218
|
// Render existing inline tokens in the queue
|
|
218
|
-
const parsed = this.
|
|
219
|
+
const parsed = this._parse(tokenRenderQueue);
|
|
219
220
|
if (parsed.length > 0) {
|
|
220
221
|
siblingNodes.push(this.renderer.getTextNode(parsed, textStyle));
|
|
221
222
|
}
|
|
222
223
|
|
|
223
224
|
// Render the current block token
|
|
224
225
|
if (t.type === "image") {
|
|
225
|
-
siblingNodes.push(this.
|
|
226
|
+
siblingNodes.push(this._parseToken(t));
|
|
226
227
|
} else if (t.type === "link") {
|
|
227
228
|
const imageToken = t.tokens[0] as marked.Tokens.Image;
|
|
228
229
|
const href = getValidURL(this.baseUrl, t.href);
|
|
@@ -245,7 +246,7 @@ class Parser {
|
|
|
245
246
|
/* Remaining temp tokens if any */
|
|
246
247
|
if (tokenRenderQueue.length > 0) {
|
|
247
248
|
siblingNodes.push(
|
|
248
|
-
this.renderer.getTextNode(this.
|
|
249
|
+
this.renderer.getTextNode(this._parse(tokenRenderQueue), {}),
|
|
249
250
|
);
|
|
250
251
|
}
|
|
251
252
|
|
package/src/lib/Renderer.tsx
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import React, { ReactNode } from "react";
|
|
1
|
+
import React, { type ReactNode } from "react";
|
|
2
2
|
import {
|
|
3
3
|
ScrollView,
|
|
4
4
|
View,
|
|
5
5
|
Text,
|
|
6
6
|
TouchableHighlight,
|
|
7
|
-
TextStyle,
|
|
8
|
-
ViewStyle,
|
|
9
|
-
ImageStyle,
|
|
7
|
+
type TextStyle,
|
|
8
|
+
type ViewStyle,
|
|
9
|
+
type ImageStyle,
|
|
10
10
|
} from "react-native";
|
|
11
11
|
import MarkedList from "@jsamr/react-native-li";
|
|
12
12
|
import Disc from "@jsamr/counter-style/presets/disc";
|
|
@@ -76,9 +76,9 @@ class Renderer {
|
|
|
76
76
|
) {
|
|
77
77
|
return (
|
|
78
78
|
<ScrollView
|
|
79
|
+
horizontal
|
|
79
80
|
key={generateRandomString()}
|
|
80
81
|
contentContainerStyle={containerStyle}
|
|
81
|
-
horizontal={true}
|
|
82
82
|
>
|
|
83
83
|
<Text style={textStyle}>{text}</Text>
|
|
84
84
|
</ScrollView>
|
package/src/theme/styles.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StyleSheet, type ColorSchemeName } from "react-native";
|
|
2
2
|
import spacing from "./spacing";
|
|
3
|
-
import colors, { ColorsPropType } from "./colors";
|
|
3
|
+
import colors, { type ColorsPropType } from "./colors";
|
|
4
4
|
import type { MarkedStyles, UserTheme } from "./types";
|
|
5
5
|
|
|
6
6
|
const getFontStyles = (mdColors: ColorsPropType) => {
|