react-native-marked 1.1.3 → 1.1.5
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/lib/Markdown.js +1 -1
- package/dist/commonjs/lib/Markdown.js.map +1 -1
- package/dist/commonjs/lib/Parser.js +22 -7
- package/dist/commonjs/lib/Parser.js.map +1 -1
- package/dist/commonjs/lib/Renderer.js +10 -1
- package/dist/commonjs/lib/Renderer.js.map +1 -1
- package/dist/module/lib/Markdown.js +1 -1
- package/dist/module/lib/Markdown.js.map +1 -1
- package/dist/module/lib/Parser.js +21 -7
- package/dist/module/lib/Parser.js.map +1 -1
- package/dist/module/lib/Renderer.js +11 -2
- package/dist/module/lib/Renderer.js.map +1 -1
- package/dist/typescript/lib/Markdown.d.ts +1 -1
- package/dist/typescript/lib/Renderer.d.ts +2 -1
- package/package.json +16 -6
- package/src/lib/Markdown.tsx +1 -1
- package/src/lib/Parser.tsx +34 -7
- package/src/lib/Renderer.tsx +13 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Markdown","value","flatListProps","styles","userStyles","systemTheme","useColorScheme","useMemo","getStyles","rnElements","parser","Parser","tokens","marked","lexer","
|
|
1
|
+
{"version":3,"names":["Markdown","value","flatListProps","styles","userStyles","systemTheme","useColorScheme","useMemo","getStyles","rnElements","parser","Parser","tokens","marked","lexer","parse","renderItem","useCallback","item","keyExtractor","_","index","toString","container","memo"],"sources":["Markdown.tsx"],"sourcesContent":["import React, { memo, ReactNode, useCallback, useMemo } from 'react';\nimport { FlatList, useColorScheme } from 'react-native';\nimport { marked } from 'marked';\nimport Parser from './Parser';\nimport getStyles from '../theme/styles';\nimport type { MarkdownProps } from './types';\n\nconst Markdown = ({\n value,\n flatListProps,\n styles: userStyles,\n}: MarkdownProps) => {\n const systemTheme = useColorScheme();\n const styles = useMemo(\n () => getStyles(userStyles, systemTheme),\n [userStyles, systemTheme]\n );\n\n const rnElements = useMemo(() => {\n const parser = new Parser({\n styles,\n });\n const tokens = marked.lexer(value);\n\n return parser.parse(tokens);\n }, [value, styles]);\n\n const renderItem = useCallback(({ item }: { item: ReactNode }) => {\n return <>{item}</>;\n }, []);\n\n const keyExtractor = useCallback((_, index) => index.toString(), []);\n\n return (\n <FlatList\n keyExtractor={keyExtractor}\n maxToRenderPerBatch={8}\n initialNumToRender={8}\n removeClippedSubviews\n style={styles.container}\n {...flatListProps}\n data={rnElements}\n renderItem={renderItem}\n />\n );\n};\n\nexport default memo(Markdown);\n"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAGA,MAAMA,QAAQ,GAAG,QAII;EAAA,IAJH;IAChBC,KADgB;IAEhBC,aAFgB;IAGhBC,MAAM,EAAEC;EAHQ,CAIG;EACnB,MAAMC,WAAW,GAAG,IAAAC,2BAAA,GAApB;EACA,MAAMH,MAAM,GAAG,IAAAI,cAAA,EACb,MAAM,IAAAC,eAAA,EAAUJ,UAAV,EAAsBC,WAAtB,CADO,EAEb,CAACD,UAAD,EAAaC,WAAb,CAFa,CAAf;EAKA,MAAMI,UAAU,GAAG,IAAAF,cAAA,EAAQ,MAAM;IAC/B,MAAMG,MAAM,GAAG,IAAIC,eAAJ,CAAW;MACxBR;IADwB,CAAX,CAAf;;IAGA,MAAMS,MAAM,GAAGC,cAAA,CAAOC,KAAP,CAAab,KAAb,CAAf;;IAEA,OAAOS,MAAM,CAACK,KAAP,CAAaH,MAAb,CAAP;EACD,CAPkB,EAOhB,CAACX,KAAD,EAAQE,MAAR,CAPgB,CAAnB;EASA,MAAMa,UAAU,GAAG,IAAAC,kBAAA,EAAY,SAAmC;IAAA,IAAlC;MAAEC;IAAF,CAAkC;IAChE,oBAAO,4DAAGA,IAAH,CAAP;EACD,CAFkB,EAEhB,EAFgB,CAAnB;EAIA,MAAMC,YAAY,GAAG,IAAAF,kBAAA,EAAY,CAACG,CAAD,EAAIC,KAAJ,KAAcA,KAAK,CAACC,QAAN,EAA1B,EAA4C,EAA5C,CAArB;EAEA,oBACE,6BAAC,qBAAD;IACE,YAAY,EAAEH,YADhB;IAEE,mBAAmB,EAAE,CAFvB;IAGE,kBAAkB,EAAE,CAHtB;IAIE,qBAAqB,MAJvB;IAKE,KAAK,EAAEhB,MAAM,CAACoB;EALhB,GAMMrB,aANN;IAOE,IAAI,EAAEO,UAPR;IAQE,UAAU,EAAEO;EARd,GADF;AAYD,CAtCD;;4BAwCe,IAAAQ,WAAA,EAAKxB,QAAL,C"}
|
|
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
+
var _htmlEntities = require("html-entities");
|
|
9
|
+
|
|
8
10
|
var _Renderer = _interopRequireDefault(require("./Renderer"));
|
|
9
11
|
|
|
10
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -25,16 +27,23 @@ class Parser {
|
|
|
25
27
|
tokens.forEach(t => {
|
|
26
28
|
/**
|
|
27
29
|
* To avoid inlining images
|
|
30
|
+
* Currently supports images, link images
|
|
28
31
|
* Note: to be extend for other token types
|
|
29
32
|
*/
|
|
30
|
-
if (t.type === 'image') {
|
|
33
|
+
if (t.type === 'image' || t.type === 'link' && t.tokens && t.tokens[0] && t.tokens[0].type === 'image') {
|
|
31
34
|
const parsed = this.parseInline(tempTokens);
|
|
32
35
|
|
|
33
36
|
if (parsed.length > 0) {
|
|
34
|
-
siblingNodes.push(this.renderer.getTextNode(
|
|
37
|
+
siblingNodes.push(this.renderer.getTextNode(parsed, textStyle));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (t.type === 'image') {
|
|
41
|
+
siblingNodes.push(this.parseInline([t]));
|
|
42
|
+
} else if (t.type === 'link') {
|
|
43
|
+
const imageToken = t.tokens[0];
|
|
44
|
+
siblingNodes.push(this.renderer.getImageLinkNode(t.href, imageToken.href));
|
|
35
45
|
}
|
|
36
46
|
|
|
37
|
-
siblingNodes.push(this.parseInline([t]));
|
|
38
47
|
tempTokens = [];
|
|
39
48
|
return;
|
|
40
49
|
}
|
|
@@ -104,8 +113,8 @@ class Parser {
|
|
|
104
113
|
const children = item.tokens.map(cItem => {
|
|
105
114
|
if (cItem.type === 'text') {
|
|
106
115
|
/* getViewNode since tokens could contain a block like elements (i.e. img) */
|
|
107
|
-
const
|
|
108
|
-
|
|
116
|
+
const childTokens = cItem.tokens || [];
|
|
117
|
+
const listChildren = this.getNormalizedSiblingNodesForBlockAndInlineTokens(childTokens, this.styles.li);
|
|
109
118
|
return this.renderer.getViewNode(listChildren, this.styles.li);
|
|
110
119
|
}
|
|
111
120
|
/* Parse the nested token */
|
|
@@ -139,11 +148,17 @@ class Parser {
|
|
|
139
148
|
|
|
140
149
|
case 'link':
|
|
141
150
|
{
|
|
151
|
+
if (token.tokens && token.tokens[0] && token.tokens[0].type === 'image') {
|
|
152
|
+
var _token$tokens$;
|
|
153
|
+
|
|
154
|
+
return this.renderer.getImageLinkNode(token.href, (_token$tokens$ = token.tokens[0]) === null || _token$tokens$ === void 0 ? void 0 : _token$tokens$.href);
|
|
155
|
+
}
|
|
156
|
+
|
|
142
157
|
const linkStyle = { ...styles,
|
|
143
158
|
...this.styles.link // To override color property
|
|
144
159
|
|
|
145
160
|
};
|
|
146
|
-
return this.renderer.
|
|
161
|
+
return this.renderer.getTextLinkNode(this.parseInline(token.tokens, linkStyle), token.href, linkStyle);
|
|
147
162
|
}
|
|
148
163
|
|
|
149
164
|
case 'image':
|
|
@@ -191,7 +206,7 @@ class Parser {
|
|
|
191
206
|
return null;
|
|
192
207
|
}
|
|
193
208
|
|
|
194
|
-
return this.renderer.getTextNode(token.raw, { ...this.styles.text,
|
|
209
|
+
return this.renderer.getTextNode((0, _htmlEntities.decode)(token.raw), { ...this.styles.text,
|
|
195
210
|
...styles
|
|
196
211
|
});
|
|
197
212
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Parser","constructor","options","tokens","textStyle","tempTokens","siblingNodes","forEach","t","type","parsed","parseInline","length","push","renderer","getTextNode","styles","Renderer","headingStylesMap","h1","h2","h3","h4","h5","h6","parse","elements","map","token","paragraphChildren","getNormalizedSiblingNodesForBlockAndInlineTokens","text","getViewNode","paragraph","getBlockquoteNode","blockquote","depth","getCodeBlockNode","code","em","hr","li","items","item","children","cItem","listChildren","getListNode","ordered","list","filter","element","linkStyle","link","getLinkNode","href","getImageNode","boldStyle","strong","italicStyle","codespan","raw","trim","console","warn"],"sources":["Parser.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { marked } from 'marked';\nimport Renderer from './Renderer';\nimport type { MarkedStyles } from '../theme/types';\nimport type { CustomStyleProp, ParserOptions, TextStyleProp } from './types';\n\nclass Parser {\n private renderer;\n private styles: MarkedStyles;\n private headingStylesMap: Record<number, TextStyleProp>;\n constructor(options: ParserOptions) {\n this.styles = { ...options.styles };\n this.renderer = new Renderer();\n this.headingStylesMap = {\n 1: this.styles.h1,\n 2: this.styles.h2,\n 3: this.styles.h3,\n 4: this.styles.h4,\n 5: this.styles.h5,\n 6: this.styles.h6,\n };\n }\n\n parse(tokens: marked.Token[]) {\n const elements: ReactNode[] = tokens.map((token) => {\n switch (token.type) {\n case 'space': {\n return null;\n }\n case 'paragraph': {\n const paragraphChildren =\n this.getNormalizedSiblingNodesForBlockAndInlineTokens(\n token.tokens,\n this.styles.text\n );\n\n return this.renderer.getViewNode(\n paragraphChildren,\n this.styles.paragraph\n );\n }\n case 'blockquote': {\n return this.renderer.getBlockquoteNode(\n this.parse(token.tokens),\n this.styles.blockquote\n );\n }\n case 'heading': {\n const styles = this.headingStylesMap[token.depth] ?? this.styles.text;\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, styles),\n styles\n );\n }\n case 'code': {\n return this.renderer.getCodeBlockNode(\n token.text,\n this.styles.code,\n this.styles.em\n );\n }\n case 'hr': {\n return this.renderer.getViewNode(null, this.styles.hr);\n }\n case 'list': {\n const li = token.items.map((item) => {\n const children = item.tokens.map((cItem) => {\n if (cItem.type === 'text') {\n /* getViewNode since tokens could contain a block like elements (i.e. img) */\n const listChildren =\n this.getNormalizedSiblingNodesForBlockAndInlineTokens(\n // @ts-ignore\n cItem.tokens,\n this.styles.li\n );\n return this.renderer.getViewNode(listChildren, this.styles.li);\n }\n\n /* Parse the nested token */\n return this.parse([cItem]);\n });\n return this.renderer.getViewNode(children, this.styles.li);\n });\n return this.renderer.getListNode(\n token.ordered,\n li,\n this.styles.list,\n this.styles.li\n );\n }\n default:\n return this.parseInline([token]);\n }\n });\n return elements.filter((element) => element !== null);\n }\n\n parseInline(tokens: marked.Token[], styles?: CustomStyleProp) {\n const elements: ReactNode[] = tokens.map((token) => {\n if (!token) return null;\n\n switch (token.type) {\n case 'escape': {\n return this.renderer.getTextNode(token.text, {\n ...this.styles.text,\n ...styles,\n });\n }\n case 'link': {\n const linkStyle = {\n ...styles,\n ...this.styles.link, // To override color property\n };\n return this.renderer.getLinkNode(\n this.parseInline(token.tokens, linkStyle),\n token.href,\n linkStyle\n );\n }\n case 'image': {\n return this.renderer.getImageNode(token.href);\n }\n case 'strong': {\n const boldStyle = {\n ...this.styles.strong,\n ...styles,\n };\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, boldStyle),\n boldStyle\n );\n }\n case 'em': {\n const italicStyle = {\n ...this.styles.em,\n ...styles,\n };\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, italicStyle),\n italicStyle\n );\n }\n case 'codespan': {\n return this.renderer.getTextNode(token.text, {\n ...this.styles.codespan,\n ...styles,\n });\n }\n case 'br': {\n return this.renderer.getTextNode('\\n', {});\n }\n case 'del': {\n return null;\n }\n case 'text':\n case 'html': {\n if (token.raw.trim().length < 1) {\n return null;\n }\n\n return this.renderer.getTextNode(token.raw, {\n ...this.styles.text,\n ...styles,\n });\n }\n default: {\n console.warn(`Token with '${token.type}' type was not found.`);\n return null;\n }\n }\n });\n return elements.filter((element) => element !== null);\n }\n\n private getNormalizedSiblingNodesForBlockAndInlineTokens = (\n tokens: marked.Token[],\n textStyle: TextStyleProp\n ): ReactNode[] => {\n let tempTokens: marked.Token[] = [];\n const siblingNodes: ReactNode[] = [];\n tokens.forEach((t) => {\n /**\n * To avoid inlining images\n * Note: to be extend for other token types\n */\n if (t.type === 'image') {\n const parsed = this.parseInline(tempTokens);\n if (parsed.length > 0) {\n siblingNodes.push(\n this.renderer.getTextNode(this.parseInline(tempTokens), textStyle)\n );\n }\n siblingNodes.push(this.parseInline([t]));\n tempTokens = [];\n return;\n }\n tempTokens = [...tempTokens, t];\n });\n\n /* Remaining temp tokens if any */\n if (tempTokens.length > 0) {\n siblingNodes.push(\n this.renderer.getTextNode(this.parseInline(tempTokens), {})\n );\n }\n return siblingNodes;\n };\n}\n\nexport default Parser;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["Parser","constructor","options","tokens","textStyle","tempTokens","siblingNodes","forEach","t","type","parsed","parseInline","length","push","renderer","getTextNode","imageToken","getImageLinkNode","href","styles","Renderer","headingStylesMap","h1","h2","h3","h4","h5","h6","parse","elements","map","token","paragraphChildren","getNormalizedSiblingNodesForBlockAndInlineTokens","text","getViewNode","paragraph","getBlockquoteNode","blockquote","depth","getCodeBlockNode","code","em","hr","li","items","item","children","cItem","childTokens","listChildren","getListNode","ordered","list","filter","element","linkStyle","link","getTextLinkNode","getImageNode","boldStyle","strong","italicStyle","codespan","raw","trim","decode","console","warn"],"sources":["Parser.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { marked } from 'marked';\nimport { decode } from 'html-entities';\nimport Renderer from './Renderer';\nimport type { MarkedStyles } from '../theme/types';\nimport type { CustomStyleProp, ParserOptions, TextStyleProp } from './types';\n\nclass Parser {\n private renderer;\n private styles: MarkedStyles;\n private headingStylesMap: Record<number, TextStyleProp>;\n constructor(options: ParserOptions) {\n this.styles = { ...options.styles };\n this.renderer = new Renderer();\n this.headingStylesMap = {\n 1: this.styles.h1,\n 2: this.styles.h2,\n 3: this.styles.h3,\n 4: this.styles.h4,\n 5: this.styles.h5,\n 6: this.styles.h6,\n };\n }\n\n parse(tokens: marked.Token[]) {\n const elements: ReactNode[] = tokens.map((token) => {\n switch (token.type) {\n case 'space': {\n return null;\n }\n case 'paragraph': {\n const paragraphChildren =\n this.getNormalizedSiblingNodesForBlockAndInlineTokens(\n token.tokens,\n this.styles.text\n );\n\n return this.renderer.getViewNode(\n paragraphChildren,\n this.styles.paragraph\n );\n }\n case 'blockquote': {\n return this.renderer.getBlockquoteNode(\n this.parse(token.tokens),\n this.styles.blockquote\n );\n }\n case 'heading': {\n const styles = this.headingStylesMap[token.depth] ?? this.styles.text;\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, styles),\n styles\n );\n }\n case 'code': {\n return this.renderer.getCodeBlockNode(\n token.text,\n this.styles.code,\n this.styles.em\n );\n }\n case 'hr': {\n return this.renderer.getViewNode(null, this.styles.hr);\n }\n case 'list': {\n const li = token.items.map((item) => {\n const children = item.tokens.map((cItem) => {\n if (cItem.type === 'text') {\n /* getViewNode since tokens could contain a block like elements (i.e. img) */\n const childTokens = (cItem as marked.Tokens.Text).tokens || [];\n const listChildren =\n this.getNormalizedSiblingNodesForBlockAndInlineTokens(\n childTokens,\n this.styles.li\n );\n return this.renderer.getViewNode(listChildren, this.styles.li);\n }\n\n /* Parse the nested token */\n return this.parse([cItem]);\n });\n return this.renderer.getViewNode(children, this.styles.li);\n });\n return this.renderer.getListNode(\n token.ordered,\n li,\n this.styles.list,\n this.styles.li\n );\n }\n default:\n return this.parseInline([token]);\n }\n });\n return elements.filter((element) => element !== null);\n }\n\n parseInline(tokens: marked.Token[], styles?: CustomStyleProp) {\n const elements: ReactNode[] = tokens.map((token) => {\n if (!token) return null;\n\n switch (token.type) {\n case 'escape': {\n return this.renderer.getTextNode(token.text, {\n ...this.styles.text,\n ...styles,\n });\n }\n case 'link': {\n if (\n token.tokens &&\n token.tokens[0] &&\n token.tokens[0].type === 'image'\n ) {\n return this.renderer.getImageLinkNode(\n token.href,\n token.tokens[0]?.href\n );\n }\n\n const linkStyle = {\n ...styles,\n ...this.styles.link, // To override color property\n };\n return this.renderer.getTextLinkNode(\n this.parseInline(token.tokens, linkStyle),\n token.href,\n linkStyle\n );\n }\n case 'image': {\n return this.renderer.getImageNode(token.href);\n }\n case 'strong': {\n const boldStyle = {\n ...this.styles.strong,\n ...styles,\n };\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, boldStyle),\n boldStyle\n );\n }\n case 'em': {\n const italicStyle = {\n ...this.styles.em,\n ...styles,\n };\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, italicStyle),\n italicStyle\n );\n }\n case 'codespan': {\n return this.renderer.getTextNode(token.text, {\n ...this.styles.codespan,\n ...styles,\n });\n }\n case 'br': {\n return this.renderer.getTextNode('\\n', {});\n }\n case 'del': {\n return null;\n }\n case 'text':\n case 'html': {\n if (token.raw.trim().length < 1) {\n return null;\n }\n\n return this.renderer.getTextNode(decode(token.raw), {\n ...this.styles.text,\n ...styles,\n });\n }\n default: {\n console.warn(`Token with '${token.type}' type was not found.`);\n return null;\n }\n }\n });\n return elements.filter((element) => element !== null);\n }\n\n private getNormalizedSiblingNodesForBlockAndInlineTokens = (\n tokens: marked.Token[],\n textStyle: TextStyleProp\n ): ReactNode[] => {\n let tempTokens: marked.Token[] = [];\n const siblingNodes: ReactNode[] = [];\n tokens.forEach((t) => {\n /**\n * To avoid inlining images\n * Currently supports images, link images\n * Note: to be extend for other token types\n */\n if (\n t.type === 'image' ||\n (t.type === 'link' &&\n t.tokens &&\n t.tokens[0] &&\n t.tokens[0].type === 'image')\n ) {\n const parsed = this.parseInline(tempTokens);\n if (parsed.length > 0) {\n siblingNodes.push(this.renderer.getTextNode(parsed, textStyle));\n }\n\n if (t.type === 'image') {\n siblingNodes.push(this.parseInline([t]));\n } else if (t.type === 'link') {\n const imageToken = t.tokens[0] as marked.Tokens.Image;\n siblingNodes.push(\n this.renderer.getImageLinkNode(t.href, imageToken.href)\n );\n }\n\n tempTokens = [];\n return;\n }\n tempTokens = [...tempTokens, t];\n });\n\n /* Remaining temp tokens if any */\n if (tempTokens.length > 0) {\n siblingNodes.push(\n this.renderer.getTextNode(this.parseInline(tempTokens), {})\n );\n }\n\n return siblingNodes;\n };\n}\n\nexport default Parser;\n"],"mappings":"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"}
|
|
@@ -34,13 +34,22 @@ class Renderer {
|
|
|
34
34
|
}, children);
|
|
35
35
|
});
|
|
36
36
|
|
|
37
|
-
_defineProperty(this, "
|
|
37
|
+
_defineProperty(this, "getTextLinkNode", (children, href, styles) => {
|
|
38
38
|
return /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
39
39
|
key: (0, _string.generateRandomString)(),
|
|
40
40
|
onPress: (0, _handlers.onLinkPress)(href),
|
|
41
41
|
style: styles
|
|
42
42
|
}, children);
|
|
43
43
|
});
|
|
44
|
+
|
|
45
|
+
_defineProperty(this, "getImageLinkNode", (href, imageUrl) => {
|
|
46
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.TouchableHighlight, {
|
|
47
|
+
onPress: (0, _handlers.onLinkPress)(href),
|
|
48
|
+
key: (0, _string.generateRandomString)()
|
|
49
|
+
}, /*#__PURE__*/_react.default.createElement(_MDImage.default, {
|
|
50
|
+
uri: imageUrl
|
|
51
|
+
}));
|
|
52
|
+
});
|
|
44
53
|
}
|
|
45
54
|
|
|
46
55
|
getViewNode(children, styles) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Renderer","children","styles","generateRandomString","href","onLinkPress","getViewNode","getCodeBlockNode","text","containerStyle","textStyle","getBlockquoteNode","getImageNode","uri","getListNode","ordered","li","listStyle","Decimal","Disc","map","node"],"sources":["Renderer.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport { ScrollView, View, Text } from 'react-native';\nimport MarkedList from '@jsamr/react-native-li';\nimport Disc from '@jsamr/counter-style/presets/disc';\nimport Decimal from '@jsamr/counter-style/presets/decimal';\nimport MDImage from './../components/MDImage';\nimport { generateRandomString } from '../utils/string';\nimport type { TextStyleProp, ViewStyleProp } from './types';\nimport { onLinkPress } from '../utils/handlers';\n\nclass Renderer {\n getTextNode = (children: string | ReactNode[], styles: TextStyleProp) => {\n return (\n <Text key={generateRandomString()} style={styles}>\n {children}\n </Text>\n );\n };\n\n
|
|
1
|
+
{"version":3,"names":["Renderer","children","styles","generateRandomString","href","onLinkPress","imageUrl","getViewNode","getCodeBlockNode","text","containerStyle","textStyle","getBlockquoteNode","getImageNode","uri","getListNode","ordered","li","listStyle","Decimal","Disc","map","node"],"sources":["Renderer.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport { ScrollView, View, Text, TouchableHighlight } from 'react-native';\nimport MarkedList from '@jsamr/react-native-li';\nimport Disc from '@jsamr/counter-style/presets/disc';\nimport Decimal from '@jsamr/counter-style/presets/decimal';\nimport MDImage from './../components/MDImage';\nimport { generateRandomString } from '../utils/string';\nimport type { TextStyleProp, ViewStyleProp } from './types';\nimport { onLinkPress } from '../utils/handlers';\n\nclass Renderer {\n getTextNode = (children: string | ReactNode[], styles: TextStyleProp) => {\n return (\n <Text key={generateRandomString()} style={styles}>\n {children}\n </Text>\n );\n };\n\n getTextLinkNode = (\n children: string | ReactNode[],\n href: string,\n styles: TextStyleProp\n ) => {\n return (\n <Text\n key={generateRandomString()}\n onPress={onLinkPress(href)}\n style={styles}\n >\n {children}\n </Text>\n );\n };\n\n getImageLinkNode = (href: string, imageUrl: string) => {\n return (\n <TouchableHighlight\n onPress={onLinkPress(href)}\n key={generateRandomString()}\n >\n <MDImage uri={imageUrl} />\n </TouchableHighlight>\n );\n };\n\n getViewNode(children: ReactNode[] | null, styles: ViewStyleProp) {\n return (\n <View key={generateRandomString()} style={styles}>\n {children}\n </View>\n );\n }\n\n getCodeBlockNode(\n text: string,\n containerStyle: ViewStyleProp,\n textStyle: TextStyleProp\n ) {\n return (\n <ScrollView\n key={generateRandomString()}\n contentContainerStyle={containerStyle}\n horizontal\n >\n <Text style={textStyle}>{text}</Text>\n </ScrollView>\n );\n }\n\n getBlockquoteNode(children: ReactNode[], styles: ViewStyleProp) {\n return (\n <View key={generateRandomString()} style={styles}>\n {children}\n </View>\n );\n }\n\n getImageNode(uri: string) {\n return <MDImage key={generateRandomString()} uri={uri} />;\n }\n\n getListNode(\n ordered: boolean,\n li: ReactNode[],\n listStyle: ViewStyleProp,\n textStyle: TextStyleProp\n ) {\n return (\n <MarkedList\n counterRenderer={ordered ? Decimal : Disc}\n markerTextStyle={textStyle}\n markerBoxStyle={listStyle}\n key={generateRandomString()}\n >\n {li.map((node) => node)}\n </MarkedList>\n );\n }\n}\n\nexport default Renderer;\n"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;;;;;AAEA,MAAMA,QAAN,CAAe;EAAA;IAAA,qCACC,CAACC,QAAD,EAAiCC,MAAjC,KAA2D;MACvE,oBACE,6BAAC,iBAAD;QAAM,GAAG,EAAE,IAAAC,4BAAA,GAAX;QAAmC,KAAK,EAAED;MAA1C,GACGD,QADH,CADF;IAKD,CAPY;;IAAA,yCASK,CAChBA,QADgB,EAEhBG,IAFgB,EAGhBF,MAHgB,KAIb;MACH,oBACE,6BAAC,iBAAD;QACE,GAAG,EAAE,IAAAC,4BAAA,GADP;QAEE,OAAO,EAAE,IAAAE,qBAAA,EAAYD,IAAZ,CAFX;QAGE,KAAK,EAAEF;MAHT,GAKGD,QALH,CADF;IASD,CAvBY;;IAAA,0CAyBM,CAACG,IAAD,EAAeE,QAAf,KAAoC;MACrD,oBACE,6BAAC,+BAAD;QACE,OAAO,EAAE,IAAAD,qBAAA,EAAYD,IAAZ,CADX;QAEE,GAAG,EAAE,IAAAD,4BAAA;MAFP,gBAIE,6BAAC,gBAAD;QAAS,GAAG,EAAEG;MAAd,EAJF,CADF;IAQD,CAlCY;EAAA;;EAoCbC,WAAW,CAACN,QAAD,EAA+BC,MAA/B,EAAsD;IAC/D,oBACE,6BAAC,iBAAD;MAAM,GAAG,EAAE,IAAAC,4BAAA,GAAX;MAAmC,KAAK,EAAED;IAA1C,GACGD,QADH,CADF;EAKD;;EAEDO,gBAAgB,CACdC,IADc,EAEdC,cAFc,EAGdC,SAHc,EAId;IACA,oBACE,6BAAC,uBAAD;MACE,GAAG,EAAE,IAAAR,4BAAA,GADP;MAEE,qBAAqB,EAAEO,cAFzB;MAGE,UAAU;IAHZ,gBAKE,6BAAC,iBAAD;MAAM,KAAK,EAAEC;IAAb,GAAyBF,IAAzB,CALF,CADF;EASD;;EAEDG,iBAAiB,CAACX,QAAD,EAAwBC,MAAxB,EAA+C;IAC9D,oBACE,6BAAC,iBAAD;MAAM,GAAG,EAAE,IAAAC,4BAAA,GAAX;MAAmC,KAAK,EAAED;IAA1C,GACGD,QADH,CADF;EAKD;;EAEDY,YAAY,CAACC,GAAD,EAAc;IACxB,oBAAO,6BAAC,gBAAD;MAAS,GAAG,EAAE,IAAAX,4BAAA,GAAd;MAAsC,GAAG,EAAEW;IAA3C,EAAP;EACD;;EAEDC,WAAW,CACTC,OADS,EAETC,EAFS,EAGTC,SAHS,EAITP,SAJS,EAKT;IACA,oBACE,6BAAC,sBAAD;MACE,eAAe,EAAEK,OAAO,GAAGG,gBAAH,GAAaC,aADvC;MAEE,eAAe,EAAET,SAFnB;MAGE,cAAc,EAAEO,SAHlB;MAIE,GAAG,EAAE,IAAAf,4BAAA;IAJP,GAMGc,EAAE,CAACI,GAAH,CAAQC,IAAD,IAAUA,IAAjB,CANH,CADF;EAUD;;AAxFY;;eA2FAtB,Q"}
|
|
@@ -18,7 +18,7 @@ const Markdown = _ref => {
|
|
|
18
18
|
const parser = new Parser({
|
|
19
19
|
styles
|
|
20
20
|
});
|
|
21
|
-
const tokens = marked.lexer(value
|
|
21
|
+
const tokens = marked.lexer(value);
|
|
22
22
|
return parser.parse(tokens);
|
|
23
23
|
}, [value, styles]);
|
|
24
24
|
const renderItem = useCallback(_ref2 => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","memo","useCallback","useMemo","FlatList","useColorScheme","marked","Parser","getStyles","Markdown","value","flatListProps","styles","userStyles","systemTheme","rnElements","parser","tokens","lexer","
|
|
1
|
+
{"version":3,"names":["React","memo","useCallback","useMemo","FlatList","useColorScheme","marked","Parser","getStyles","Markdown","value","flatListProps","styles","userStyles","systemTheme","rnElements","parser","tokens","lexer","parse","renderItem","item","keyExtractor","_","index","toString","container"],"sources":["Markdown.tsx"],"sourcesContent":["import React, { memo, ReactNode, useCallback, useMemo } from 'react';\nimport { FlatList, useColorScheme } from 'react-native';\nimport { marked } from 'marked';\nimport Parser from './Parser';\nimport getStyles from '../theme/styles';\nimport type { MarkdownProps } from './types';\n\nconst Markdown = ({\n value,\n flatListProps,\n styles: userStyles,\n}: MarkdownProps) => {\n const systemTheme = useColorScheme();\n const styles = useMemo(\n () => getStyles(userStyles, systemTheme),\n [userStyles, systemTheme]\n );\n\n const rnElements = useMemo(() => {\n const parser = new Parser({\n styles,\n });\n const tokens = marked.lexer(value);\n\n return parser.parse(tokens);\n }, [value, styles]);\n\n const renderItem = useCallback(({ item }: { item: ReactNode }) => {\n return <>{item}</>;\n }, []);\n\n const keyExtractor = useCallback((_, index) => index.toString(), []);\n\n return (\n <FlatList\n keyExtractor={keyExtractor}\n maxToRenderPerBatch={8}\n initialNumToRender={8}\n removeClippedSubviews\n style={styles.container}\n {...flatListProps}\n data={rnElements}\n renderItem={renderItem}\n />\n );\n};\n\nexport default memo(Markdown);\n"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,IAAhB,EAAiCC,WAAjC,EAA8CC,OAA9C,QAA6D,OAA7D;AACA,SAASC,QAAT,EAAmBC,cAAnB,QAAyC,cAAzC;AACA,SAASC,MAAT,QAAuB,QAAvB;AACA,OAAOC,MAAP,MAAmB,UAAnB;AACA,OAAOC,SAAP,MAAsB,iBAAtB;;AAGA,MAAMC,QAAQ,GAAG,QAII;EAAA,IAJH;IAChBC,KADgB;IAEhBC,aAFgB;IAGhBC,MAAM,EAAEC;EAHQ,CAIG;EACnB,MAAMC,WAAW,GAAGT,cAAc,EAAlC;EACA,MAAMO,MAAM,GAAGT,OAAO,CACpB,MAAMK,SAAS,CAACK,UAAD,EAAaC,WAAb,CADK,EAEpB,CAACD,UAAD,EAAaC,WAAb,CAFoB,CAAtB;EAKA,MAAMC,UAAU,GAAGZ,OAAO,CAAC,MAAM;IAC/B,MAAMa,MAAM,GAAG,IAAIT,MAAJ,CAAW;MACxBK;IADwB,CAAX,CAAf;IAGA,MAAMK,MAAM,GAAGX,MAAM,CAACY,KAAP,CAAaR,KAAb,CAAf;IAEA,OAAOM,MAAM,CAACG,KAAP,CAAaF,MAAb,CAAP;EACD,CAPyB,EAOvB,CAACP,KAAD,EAAQE,MAAR,CAPuB,CAA1B;EASA,MAAMQ,UAAU,GAAGlB,WAAW,CAAC,SAAmC;IAAA,IAAlC;MAAEmB;IAAF,CAAkC;IAChE,oBAAO,0CAAGA,IAAH,CAAP;EACD,CAF6B,EAE3B,EAF2B,CAA9B;EAIA,MAAMC,YAAY,GAAGpB,WAAW,CAAC,CAACqB,CAAD,EAAIC,KAAJ,KAAcA,KAAK,CAACC,QAAN,EAAf,EAAiC,EAAjC,CAAhC;EAEA,oBACE,oBAAC,QAAD;IACE,YAAY,EAAEH,YADhB;IAEE,mBAAmB,EAAE,CAFvB;IAGE,kBAAkB,EAAE,CAHtB;IAIE,qBAAqB,MAJvB;IAKE,KAAK,EAAEV,MAAM,CAACc;EALhB,GAMMf,aANN;IAOE,IAAI,EAAEI,UAPR;IAQE,UAAU,EAAEK;EARd,GADF;AAYD,CAtCD;;AAwCA,4BAAenB,IAAI,CAACQ,QAAD,CAAnB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
2
|
|
|
3
|
+
import { decode } from 'html-entities';
|
|
3
4
|
import Renderer from './Renderer';
|
|
4
5
|
|
|
5
6
|
class Parser {
|
|
@@ -16,16 +17,23 @@ class Parser {
|
|
|
16
17
|
tokens.forEach(t => {
|
|
17
18
|
/**
|
|
18
19
|
* To avoid inlining images
|
|
20
|
+
* Currently supports images, link images
|
|
19
21
|
* Note: to be extend for other token types
|
|
20
22
|
*/
|
|
21
|
-
if (t.type === 'image') {
|
|
23
|
+
if (t.type === 'image' || t.type === 'link' && t.tokens && t.tokens[0] && t.tokens[0].type === 'image') {
|
|
22
24
|
const parsed = this.parseInline(tempTokens);
|
|
23
25
|
|
|
24
26
|
if (parsed.length > 0) {
|
|
25
|
-
siblingNodes.push(this.renderer.getTextNode(
|
|
27
|
+
siblingNodes.push(this.renderer.getTextNode(parsed, textStyle));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (t.type === 'image') {
|
|
31
|
+
siblingNodes.push(this.parseInline([t]));
|
|
32
|
+
} else if (t.type === 'link') {
|
|
33
|
+
const imageToken = t.tokens[0];
|
|
34
|
+
siblingNodes.push(this.renderer.getImageLinkNode(t.href, imageToken.href));
|
|
26
35
|
}
|
|
27
36
|
|
|
28
|
-
siblingNodes.push(this.parseInline([t]));
|
|
29
37
|
tempTokens = [];
|
|
30
38
|
return;
|
|
31
39
|
}
|
|
@@ -95,8 +103,8 @@ class Parser {
|
|
|
95
103
|
const children = item.tokens.map(cItem => {
|
|
96
104
|
if (cItem.type === 'text') {
|
|
97
105
|
/* getViewNode since tokens could contain a block like elements (i.e. img) */
|
|
98
|
-
const
|
|
99
|
-
|
|
106
|
+
const childTokens = cItem.tokens || [];
|
|
107
|
+
const listChildren = this.getNormalizedSiblingNodesForBlockAndInlineTokens(childTokens, this.styles.li);
|
|
100
108
|
return this.renderer.getViewNode(listChildren, this.styles.li);
|
|
101
109
|
}
|
|
102
110
|
/* Parse the nested token */
|
|
@@ -130,11 +138,17 @@ class Parser {
|
|
|
130
138
|
|
|
131
139
|
case 'link':
|
|
132
140
|
{
|
|
141
|
+
if (token.tokens && token.tokens[0] && token.tokens[0].type === 'image') {
|
|
142
|
+
var _token$tokens$;
|
|
143
|
+
|
|
144
|
+
return this.renderer.getImageLinkNode(token.href, (_token$tokens$ = token.tokens[0]) === null || _token$tokens$ === void 0 ? void 0 : _token$tokens$.href);
|
|
145
|
+
}
|
|
146
|
+
|
|
133
147
|
const linkStyle = { ...styles,
|
|
134
148
|
...this.styles.link // To override color property
|
|
135
149
|
|
|
136
150
|
};
|
|
137
|
-
return this.renderer.
|
|
151
|
+
return this.renderer.getTextLinkNode(this.parseInline(token.tokens, linkStyle), token.href, linkStyle);
|
|
138
152
|
}
|
|
139
153
|
|
|
140
154
|
case 'image':
|
|
@@ -182,7 +196,7 @@ class Parser {
|
|
|
182
196
|
return null;
|
|
183
197
|
}
|
|
184
198
|
|
|
185
|
-
return this.renderer.getTextNode(token.raw, { ...this.styles.text,
|
|
199
|
+
return this.renderer.getTextNode(decode(token.raw), { ...this.styles.text,
|
|
186
200
|
...styles
|
|
187
201
|
});
|
|
188
202
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Renderer","Parser","constructor","options","tokens","textStyle","tempTokens","siblingNodes","forEach","t","type","parsed","parseInline","length","push","renderer","getTextNode","styles","headingStylesMap","h1","h2","h3","h4","h5","h6","parse","elements","map","token","paragraphChildren","getNormalizedSiblingNodesForBlockAndInlineTokens","text","getViewNode","paragraph","getBlockquoteNode","blockquote","depth","getCodeBlockNode","code","em","hr","li","items","item","children","cItem","listChildren","getListNode","ordered","list","filter","element","linkStyle","link","getLinkNode","href","getImageNode","boldStyle","strong","italicStyle","codespan","raw","trim","console","warn"],"sources":["Parser.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { marked } from 'marked';\nimport Renderer from './Renderer';\nimport type { MarkedStyles } from '../theme/types';\nimport type { CustomStyleProp, ParserOptions, TextStyleProp } from './types';\n\nclass Parser {\n private renderer;\n private styles: MarkedStyles;\n private headingStylesMap: Record<number, TextStyleProp>;\n constructor(options: ParserOptions) {\n this.styles = { ...options.styles };\n this.renderer = new Renderer();\n this.headingStylesMap = {\n 1: this.styles.h1,\n 2: this.styles.h2,\n 3: this.styles.h3,\n 4: this.styles.h4,\n 5: this.styles.h5,\n 6: this.styles.h6,\n };\n }\n\n parse(tokens: marked.Token[]) {\n const elements: ReactNode[] = tokens.map((token) => {\n switch (token.type) {\n case 'space': {\n return null;\n }\n case 'paragraph': {\n const paragraphChildren =\n this.getNormalizedSiblingNodesForBlockAndInlineTokens(\n token.tokens,\n this.styles.text\n );\n\n return this.renderer.getViewNode(\n paragraphChildren,\n this.styles.paragraph\n );\n }\n case 'blockquote': {\n return this.renderer.getBlockquoteNode(\n this.parse(token.tokens),\n this.styles.blockquote\n );\n }\n case 'heading': {\n const styles = this.headingStylesMap[token.depth] ?? this.styles.text;\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, styles),\n styles\n );\n }\n case 'code': {\n return this.renderer.getCodeBlockNode(\n token.text,\n this.styles.code,\n this.styles.em\n );\n }\n case 'hr': {\n return this.renderer.getViewNode(null, this.styles.hr);\n }\n case 'list': {\n const li = token.items.map((item) => {\n const children = item.tokens.map((cItem) => {\n if (cItem.type === 'text') {\n /* getViewNode since tokens could contain a block like elements (i.e. img) */\n const listChildren =\n this.getNormalizedSiblingNodesForBlockAndInlineTokens(\n // @ts-ignore\n cItem.tokens,\n this.styles.li\n );\n return this.renderer.getViewNode(listChildren, this.styles.li);\n }\n\n /* Parse the nested token */\n return this.parse([cItem]);\n });\n return this.renderer.getViewNode(children, this.styles.li);\n });\n return this.renderer.getListNode(\n token.ordered,\n li,\n this.styles.list,\n this.styles.li\n );\n }\n default:\n return this.parseInline([token]);\n }\n });\n return elements.filter((element) => element !== null);\n }\n\n parseInline(tokens: marked.Token[], styles?: CustomStyleProp) {\n const elements: ReactNode[] = tokens.map((token) => {\n if (!token) return null;\n\n switch (token.type) {\n case 'escape': {\n return this.renderer.getTextNode(token.text, {\n ...this.styles.text,\n ...styles,\n });\n }\n case 'link': {\n const linkStyle = {\n ...styles,\n ...this.styles.link, // To override color property\n };\n return this.renderer.getLinkNode(\n this.parseInline(token.tokens, linkStyle),\n token.href,\n linkStyle\n );\n }\n case 'image': {\n return this.renderer.getImageNode(token.href);\n }\n case 'strong': {\n const boldStyle = {\n ...this.styles.strong,\n ...styles,\n };\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, boldStyle),\n boldStyle\n );\n }\n case 'em': {\n const italicStyle = {\n ...this.styles.em,\n ...styles,\n };\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, italicStyle),\n italicStyle\n );\n }\n case 'codespan': {\n return this.renderer.getTextNode(token.text, {\n ...this.styles.codespan,\n ...styles,\n });\n }\n case 'br': {\n return this.renderer.getTextNode('\\n', {});\n }\n case 'del': {\n return null;\n }\n case 'text':\n case 'html': {\n if (token.raw.trim().length < 1) {\n return null;\n }\n\n return this.renderer.getTextNode(token.raw, {\n ...this.styles.text,\n ...styles,\n });\n }\n default: {\n console.warn(`Token with '${token.type}' type was not found.`);\n return null;\n }\n }\n });\n return elements.filter((element) => element !== null);\n }\n\n private getNormalizedSiblingNodesForBlockAndInlineTokens = (\n tokens: marked.Token[],\n textStyle: TextStyleProp\n ): ReactNode[] => {\n let tempTokens: marked.Token[] = [];\n const siblingNodes: ReactNode[] = [];\n tokens.forEach((t) => {\n /**\n * To avoid inlining images\n * Note: to be extend for other token types\n */\n if (t.type === 'image') {\n const parsed = this.parseInline(tempTokens);\n if (parsed.length > 0) {\n siblingNodes.push(\n this.renderer.getTextNode(this.parseInline(tempTokens), textStyle)\n );\n }\n siblingNodes.push(this.parseInline([t]));\n tempTokens = [];\n return;\n }\n tempTokens = [...tempTokens, t];\n });\n\n /* Remaining temp tokens if any */\n if (tempTokens.length > 0) {\n siblingNodes.push(\n this.renderer.getTextNode(this.parseInline(tempTokens), {})\n );\n }\n return siblingNodes;\n };\n}\n\nexport default Parser;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["decode","Renderer","Parser","constructor","options","tokens","textStyle","tempTokens","siblingNodes","forEach","t","type","parsed","parseInline","length","push","renderer","getTextNode","imageToken","getImageLinkNode","href","styles","headingStylesMap","h1","h2","h3","h4","h5","h6","parse","elements","map","token","paragraphChildren","getNormalizedSiblingNodesForBlockAndInlineTokens","text","getViewNode","paragraph","getBlockquoteNode","blockquote","depth","getCodeBlockNode","code","em","hr","li","items","item","children","cItem","childTokens","listChildren","getListNode","ordered","list","filter","element","linkStyle","link","getTextLinkNode","getImageNode","boldStyle","strong","italicStyle","codespan","raw","trim","console","warn"],"sources":["Parser.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { marked } from 'marked';\nimport { decode } from 'html-entities';\nimport Renderer from './Renderer';\nimport type { MarkedStyles } from '../theme/types';\nimport type { CustomStyleProp, ParserOptions, TextStyleProp } from './types';\n\nclass Parser {\n private renderer;\n private styles: MarkedStyles;\n private headingStylesMap: Record<number, TextStyleProp>;\n constructor(options: ParserOptions) {\n this.styles = { ...options.styles };\n this.renderer = new Renderer();\n this.headingStylesMap = {\n 1: this.styles.h1,\n 2: this.styles.h2,\n 3: this.styles.h3,\n 4: this.styles.h4,\n 5: this.styles.h5,\n 6: this.styles.h6,\n };\n }\n\n parse(tokens: marked.Token[]) {\n const elements: ReactNode[] = tokens.map((token) => {\n switch (token.type) {\n case 'space': {\n return null;\n }\n case 'paragraph': {\n const paragraphChildren =\n this.getNormalizedSiblingNodesForBlockAndInlineTokens(\n token.tokens,\n this.styles.text\n );\n\n return this.renderer.getViewNode(\n paragraphChildren,\n this.styles.paragraph\n );\n }\n case 'blockquote': {\n return this.renderer.getBlockquoteNode(\n this.parse(token.tokens),\n this.styles.blockquote\n );\n }\n case 'heading': {\n const styles = this.headingStylesMap[token.depth] ?? this.styles.text;\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, styles),\n styles\n );\n }\n case 'code': {\n return this.renderer.getCodeBlockNode(\n token.text,\n this.styles.code,\n this.styles.em\n );\n }\n case 'hr': {\n return this.renderer.getViewNode(null, this.styles.hr);\n }\n case 'list': {\n const li = token.items.map((item) => {\n const children = item.tokens.map((cItem) => {\n if (cItem.type === 'text') {\n /* getViewNode since tokens could contain a block like elements (i.e. img) */\n const childTokens = (cItem as marked.Tokens.Text).tokens || [];\n const listChildren =\n this.getNormalizedSiblingNodesForBlockAndInlineTokens(\n childTokens,\n this.styles.li\n );\n return this.renderer.getViewNode(listChildren, this.styles.li);\n }\n\n /* Parse the nested token */\n return this.parse([cItem]);\n });\n return this.renderer.getViewNode(children, this.styles.li);\n });\n return this.renderer.getListNode(\n token.ordered,\n li,\n this.styles.list,\n this.styles.li\n );\n }\n default:\n return this.parseInline([token]);\n }\n });\n return elements.filter((element) => element !== null);\n }\n\n parseInline(tokens: marked.Token[], styles?: CustomStyleProp) {\n const elements: ReactNode[] = tokens.map((token) => {\n if (!token) return null;\n\n switch (token.type) {\n case 'escape': {\n return this.renderer.getTextNode(token.text, {\n ...this.styles.text,\n ...styles,\n });\n }\n case 'link': {\n if (\n token.tokens &&\n token.tokens[0] &&\n token.tokens[0].type === 'image'\n ) {\n return this.renderer.getImageLinkNode(\n token.href,\n token.tokens[0]?.href\n );\n }\n\n const linkStyle = {\n ...styles,\n ...this.styles.link, // To override color property\n };\n return this.renderer.getTextLinkNode(\n this.parseInline(token.tokens, linkStyle),\n token.href,\n linkStyle\n );\n }\n case 'image': {\n return this.renderer.getImageNode(token.href);\n }\n case 'strong': {\n const boldStyle = {\n ...this.styles.strong,\n ...styles,\n };\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, boldStyle),\n boldStyle\n );\n }\n case 'em': {\n const italicStyle = {\n ...this.styles.em,\n ...styles,\n };\n return this.renderer.getTextNode(\n this.parseInline(token.tokens, italicStyle),\n italicStyle\n );\n }\n case 'codespan': {\n return this.renderer.getTextNode(token.text, {\n ...this.styles.codespan,\n ...styles,\n });\n }\n case 'br': {\n return this.renderer.getTextNode('\\n', {});\n }\n case 'del': {\n return null;\n }\n case 'text':\n case 'html': {\n if (token.raw.trim().length < 1) {\n return null;\n }\n\n return this.renderer.getTextNode(decode(token.raw), {\n ...this.styles.text,\n ...styles,\n });\n }\n default: {\n console.warn(`Token with '${token.type}' type was not found.`);\n return null;\n }\n }\n });\n return elements.filter((element) => element !== null);\n }\n\n private getNormalizedSiblingNodesForBlockAndInlineTokens = (\n tokens: marked.Token[],\n textStyle: TextStyleProp\n ): ReactNode[] => {\n let tempTokens: marked.Token[] = [];\n const siblingNodes: ReactNode[] = [];\n tokens.forEach((t) => {\n /**\n * To avoid inlining images\n * Currently supports images, link images\n * Note: to be extend for other token types\n */\n if (\n t.type === 'image' ||\n (t.type === 'link' &&\n t.tokens &&\n t.tokens[0] &&\n t.tokens[0].type === 'image')\n ) {\n const parsed = this.parseInline(tempTokens);\n if (parsed.length > 0) {\n siblingNodes.push(this.renderer.getTextNode(parsed, textStyle));\n }\n\n if (t.type === 'image') {\n siblingNodes.push(this.parseInline([t]));\n } else if (t.type === 'link') {\n const imageToken = t.tokens[0] as marked.Tokens.Image;\n siblingNodes.push(\n this.renderer.getImageLinkNode(t.href, imageToken.href)\n );\n }\n\n tempTokens = [];\n return;\n }\n tempTokens = [...tempTokens, t];\n });\n\n /* Remaining temp tokens if any */\n if (tempTokens.length > 0) {\n siblingNodes.push(\n this.renderer.getTextNode(this.parseInline(tempTokens), {})\n );\n }\n\n return siblingNodes;\n };\n}\n\nexport default Parser;\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
2
|
|
|
3
3
|
import React from 'react';
|
|
4
|
-
import { ScrollView, View, Text } from 'react-native';
|
|
4
|
+
import { ScrollView, View, Text, TouchableHighlight } from 'react-native';
|
|
5
5
|
import MarkedList from '@jsamr/react-native-li';
|
|
6
6
|
import Disc from '@jsamr/counter-style/presets/disc';
|
|
7
7
|
import Decimal from '@jsamr/counter-style/presets/decimal';
|
|
@@ -18,13 +18,22 @@ class Renderer {
|
|
|
18
18
|
}, children);
|
|
19
19
|
});
|
|
20
20
|
|
|
21
|
-
_defineProperty(this, "
|
|
21
|
+
_defineProperty(this, "getTextLinkNode", (children, href, styles) => {
|
|
22
22
|
return /*#__PURE__*/React.createElement(Text, {
|
|
23
23
|
key: generateRandomString(),
|
|
24
24
|
onPress: onLinkPress(href),
|
|
25
25
|
style: styles
|
|
26
26
|
}, children);
|
|
27
27
|
});
|
|
28
|
+
|
|
29
|
+
_defineProperty(this, "getImageLinkNode", (href, imageUrl) => {
|
|
30
|
+
return /*#__PURE__*/React.createElement(TouchableHighlight, {
|
|
31
|
+
onPress: onLinkPress(href),
|
|
32
|
+
key: generateRandomString()
|
|
33
|
+
}, /*#__PURE__*/React.createElement(MDImage, {
|
|
34
|
+
uri: imageUrl
|
|
35
|
+
}));
|
|
36
|
+
});
|
|
28
37
|
}
|
|
29
38
|
|
|
30
39
|
getViewNode(children, styles) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","ScrollView","View","Text","MarkedList","Disc","Decimal","MDImage","generateRandomString","onLinkPress","Renderer","children","styles","href","getViewNode","getCodeBlockNode","text","containerStyle","textStyle","getBlockquoteNode","getImageNode","uri","getListNode","ordered","li","listStyle","map","node"],"sources":["Renderer.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport { ScrollView, View, Text } from 'react-native';\nimport MarkedList from '@jsamr/react-native-li';\nimport Disc from '@jsamr/counter-style/presets/disc';\nimport Decimal from '@jsamr/counter-style/presets/decimal';\nimport MDImage from './../components/MDImage';\nimport { generateRandomString } from '../utils/string';\nimport type { TextStyleProp, ViewStyleProp } from './types';\nimport { onLinkPress } from '../utils/handlers';\n\nclass Renderer {\n getTextNode = (children: string | ReactNode[], styles: TextStyleProp) => {\n return (\n <Text key={generateRandomString()} style={styles}>\n {children}\n </Text>\n );\n };\n\n
|
|
1
|
+
{"version":3,"names":["React","ScrollView","View","Text","TouchableHighlight","MarkedList","Disc","Decimal","MDImage","generateRandomString","onLinkPress","Renderer","children","styles","href","imageUrl","getViewNode","getCodeBlockNode","text","containerStyle","textStyle","getBlockquoteNode","getImageNode","uri","getListNode","ordered","li","listStyle","map","node"],"sources":["Renderer.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport { ScrollView, View, Text, TouchableHighlight } from 'react-native';\nimport MarkedList from '@jsamr/react-native-li';\nimport Disc from '@jsamr/counter-style/presets/disc';\nimport Decimal from '@jsamr/counter-style/presets/decimal';\nimport MDImage from './../components/MDImage';\nimport { generateRandomString } from '../utils/string';\nimport type { TextStyleProp, ViewStyleProp } from './types';\nimport { onLinkPress } from '../utils/handlers';\n\nclass Renderer {\n getTextNode = (children: string | ReactNode[], styles: TextStyleProp) => {\n return (\n <Text key={generateRandomString()} style={styles}>\n {children}\n </Text>\n );\n };\n\n getTextLinkNode = (\n children: string | ReactNode[],\n href: string,\n styles: TextStyleProp\n ) => {\n return (\n <Text\n key={generateRandomString()}\n onPress={onLinkPress(href)}\n style={styles}\n >\n {children}\n </Text>\n );\n };\n\n getImageLinkNode = (href: string, imageUrl: string) => {\n return (\n <TouchableHighlight\n onPress={onLinkPress(href)}\n key={generateRandomString()}\n >\n <MDImage uri={imageUrl} />\n </TouchableHighlight>\n );\n };\n\n getViewNode(children: ReactNode[] | null, styles: ViewStyleProp) {\n return (\n <View key={generateRandomString()} style={styles}>\n {children}\n </View>\n );\n }\n\n getCodeBlockNode(\n text: string,\n containerStyle: ViewStyleProp,\n textStyle: TextStyleProp\n ) {\n return (\n <ScrollView\n key={generateRandomString()}\n contentContainerStyle={containerStyle}\n horizontal\n >\n <Text style={textStyle}>{text}</Text>\n </ScrollView>\n );\n }\n\n getBlockquoteNode(children: ReactNode[], styles: ViewStyleProp) {\n return (\n <View key={generateRandomString()} style={styles}>\n {children}\n </View>\n );\n }\n\n getImageNode(uri: string) {\n return <MDImage key={generateRandomString()} uri={uri} />;\n }\n\n getListNode(\n ordered: boolean,\n li: ReactNode[],\n listStyle: ViewStyleProp,\n textStyle: TextStyleProp\n ) {\n return (\n <MarkedList\n counterRenderer={ordered ? Decimal : Disc}\n markerTextStyle={textStyle}\n markerBoxStyle={listStyle}\n key={generateRandomString()}\n >\n {li.map((node) => node)}\n </MarkedList>\n );\n }\n}\n\nexport default Renderer;\n"],"mappings":";;AAAA,OAAOA,KAAP,MAAiC,OAAjC;AACA,SAASC,UAAT,EAAqBC,IAArB,EAA2BC,IAA3B,EAAiCC,kBAAjC,QAA2D,cAA3D;AACA,OAAOC,UAAP,MAAuB,wBAAvB;AACA,OAAOC,IAAP,MAAiB,mCAAjB;AACA,OAAOC,OAAP,MAAoB,sCAApB;AACA,OAAOC,OAAP,MAAoB,yBAApB;AACA,SAASC,oBAAT,QAAqC,iBAArC;AAEA,SAASC,WAAT,QAA4B,mBAA5B;;AAEA,MAAMC,QAAN,CAAe;EAAA;IAAA,qCACC,CAACC,QAAD,EAAiCC,MAAjC,KAA2D;MACvE,oBACE,oBAAC,IAAD;QAAM,GAAG,EAAEJ,oBAAoB,EAA/B;QAAmC,KAAK,EAAEI;MAA1C,GACGD,QADH,CADF;IAKD,CAPY;;IAAA,yCASK,CAChBA,QADgB,EAEhBE,IAFgB,EAGhBD,MAHgB,KAIb;MACH,oBACE,oBAAC,IAAD;QACE,GAAG,EAAEJ,oBAAoB,EAD3B;QAEE,OAAO,EAAEC,WAAW,CAACI,IAAD,CAFtB;QAGE,KAAK,EAAED;MAHT,GAKGD,QALH,CADF;IASD,CAvBY;;IAAA,0CAyBM,CAACE,IAAD,EAAeC,QAAf,KAAoC;MACrD,oBACE,oBAAC,kBAAD;QACE,OAAO,EAAEL,WAAW,CAACI,IAAD,CADtB;QAEE,GAAG,EAAEL,oBAAoB;MAF3B,gBAIE,oBAAC,OAAD;QAAS,GAAG,EAAEM;MAAd,EAJF,CADF;IAQD,CAlCY;EAAA;;EAoCbC,WAAW,CAACJ,QAAD,EAA+BC,MAA/B,EAAsD;IAC/D,oBACE,oBAAC,IAAD;MAAM,GAAG,EAAEJ,oBAAoB,EAA/B;MAAmC,KAAK,EAAEI;IAA1C,GACGD,QADH,CADF;EAKD;;EAEDK,gBAAgB,CACdC,IADc,EAEdC,cAFc,EAGdC,SAHc,EAId;IACA,oBACE,oBAAC,UAAD;MACE,GAAG,EAAEX,oBAAoB,EAD3B;MAEE,qBAAqB,EAAEU,cAFzB;MAGE,UAAU;IAHZ,gBAKE,oBAAC,IAAD;MAAM,KAAK,EAAEC;IAAb,GAAyBF,IAAzB,CALF,CADF;EASD;;EAEDG,iBAAiB,CAACT,QAAD,EAAwBC,MAAxB,EAA+C;IAC9D,oBACE,oBAAC,IAAD;MAAM,GAAG,EAAEJ,oBAAoB,EAA/B;MAAmC,KAAK,EAAEI;IAA1C,GACGD,QADH,CADF;EAKD;;EAEDU,YAAY,CAACC,GAAD,EAAc;IACxB,oBAAO,oBAAC,OAAD;MAAS,GAAG,EAAEd,oBAAoB,EAAlC;MAAsC,GAAG,EAAEc;IAA3C,EAAP;EACD;;EAEDC,WAAW,CACTC,OADS,EAETC,EAFS,EAGTC,SAHS,EAITP,SAJS,EAKT;IACA,oBACE,oBAAC,UAAD;MACE,eAAe,EAAEK,OAAO,GAAGlB,OAAH,GAAaD,IADvC;MAEE,eAAe,EAAEc,SAFnB;MAGE,cAAc,EAAEO,SAHlB;MAIE,GAAG,EAAElB,oBAAoB;IAJ3B,GAMGiB,EAAE,CAACE,GAAH,CAAQC,IAAD,IAAUA,IAAjB,CANH,CADF;EAUD;;AAxFY;;AA2Ff,eAAelB,QAAf"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { MarkdownProps } from './types';
|
|
3
|
-
declare const _default: React.MemoExoticComponent<({ value, flatListProps, styles, }: MarkdownProps) => JSX.Element>;
|
|
3
|
+
declare const _default: React.MemoExoticComponent<({ value, flatListProps, styles: userStyles, }: MarkdownProps) => JSX.Element>;
|
|
4
4
|
export default _default;
|
|
@@ -2,7 +2,8 @@ import { ReactNode } from 'react';
|
|
|
2
2
|
import type { TextStyleProp, ViewStyleProp } from './types';
|
|
3
3
|
declare class Renderer {
|
|
4
4
|
getTextNode: (children: string | ReactNode[], styles: TextStyleProp) => JSX.Element;
|
|
5
|
-
|
|
5
|
+
getTextLinkNode: (children: string | ReactNode[], href: string, styles: TextStyleProp) => JSX.Element;
|
|
6
|
+
getImageLinkNode: (href: string, imageUrl: string) => JSX.Element;
|
|
6
7
|
getViewNode(children: ReactNode[] | null, styles: ViewStyleProp): JSX.Element;
|
|
7
8
|
getCodeBlockNode(text: string, containerStyle: ViewStyleProp, textStyle: TextStyleProp): JSX.Element;
|
|
8
9
|
getBlockquoteNode(children: ReactNode[], styles: ViewStyleProp): JSX.Element;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-marked",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.5",
|
|
4
4
|
"description": "Markdown renderer for React Native powered by marked.js",
|
|
5
5
|
"main": "dist/commonjs/index",
|
|
6
6
|
"module": "dist/module/index",
|
|
@@ -22,12 +22,13 @@
|
|
|
22
22
|
"!**/__mocks__"
|
|
23
23
|
],
|
|
24
24
|
"scripts": {
|
|
25
|
-
"test": "jest",
|
|
26
25
|
"typescript": "tsc --noEmit",
|
|
27
26
|
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
28
27
|
"build": "bob build",
|
|
29
28
|
"prepare": "yarn build",
|
|
30
|
-
"release": "yarn build && release-it"
|
|
29
|
+
"release": "yarn build && release-it",
|
|
30
|
+
"test": "jest --passWithNoTests",
|
|
31
|
+
"test:updateSnapshot": "jest --updateSnapshot"
|
|
31
32
|
},
|
|
32
33
|
"keywords": [
|
|
33
34
|
"react-native",
|
|
@@ -45,14 +46,16 @@
|
|
|
45
46
|
"registry": "https://registry.npmjs.org/"
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|
|
48
|
-
"@arkweid/lefthook": "^0.7.7",
|
|
49
49
|
"@babel/core": "^7.19.0",
|
|
50
50
|
"@babel/eslint-parser": "^7.18.2",
|
|
51
51
|
"@babel/preset-env": "^7.19.0",
|
|
52
52
|
"@commitlint/config-conventional": "^17.0.2",
|
|
53
|
+
"@evilmartians/lefthook": "^1.1.1",
|
|
53
54
|
"@react-native-community/eslint-config": "^3.0.2",
|
|
54
55
|
"@release-it/conventional-changelog": "^5.0.0",
|
|
55
|
-
"@
|
|
56
|
+
"@testing-library/jest-native": "^5.0.0",
|
|
57
|
+
"@testing-library/react-native": "^11.2.0",
|
|
58
|
+
"@types/jest": "^29.1.1",
|
|
56
59
|
"@types/marked": "^4.0.3",
|
|
57
60
|
"@types/react": "~17.0.21",
|
|
58
61
|
"@types/react-native": "0.68.0",
|
|
@@ -63,12 +66,14 @@
|
|
|
63
66
|
"eslint-config-prettier": "^8.5.0",
|
|
64
67
|
"eslint-plugin-jest": "^27.0.4",
|
|
65
68
|
"eslint-plugin-prettier": "^4.0.0",
|
|
66
|
-
"jest": "^
|
|
69
|
+
"jest": "^29.1.2",
|
|
70
|
+
"jest-environment-jsdom": "^29.1.2",
|
|
67
71
|
"pod-install": "^0.1.0",
|
|
68
72
|
"prettier": "^2.0.5",
|
|
69
73
|
"react": "17.0.2",
|
|
70
74
|
"react-native": "0.68.2",
|
|
71
75
|
"react-native-builder-bob": "^0.18.3",
|
|
76
|
+
"react-test-renderer": "^17.0.2",
|
|
72
77
|
"release-it": "^15.4.1",
|
|
73
78
|
"typescript": "^4.5.2"
|
|
74
79
|
},
|
|
@@ -81,9 +86,13 @@
|
|
|
81
86
|
},
|
|
82
87
|
"jest": {
|
|
83
88
|
"preset": "react-native",
|
|
89
|
+
"testEnvironment": "jsdom",
|
|
84
90
|
"modulePathIgnorePatterns": [
|
|
85
91
|
"<rootDir>/examples/*/node_modules",
|
|
86
92
|
"<rootDir>/dist/"
|
|
93
|
+
],
|
|
94
|
+
"setupFilesAfterEnv": [
|
|
95
|
+
"@testing-library/jest-native/extend-expect"
|
|
87
96
|
]
|
|
88
97
|
},
|
|
89
98
|
"commitlint": {
|
|
@@ -186,6 +195,7 @@
|
|
|
186
195
|
"dependencies": {
|
|
187
196
|
"@jsamr/counter-style": "^2.0.2",
|
|
188
197
|
"@jsamr/react-native-li": "^2.3.1",
|
|
198
|
+
"html-entities": "^2.3.3",
|
|
189
199
|
"marked": "^4.0.18",
|
|
190
200
|
"react-native-fit-image": "^1.5.5"
|
|
191
201
|
}
|
package/src/lib/Markdown.tsx
CHANGED
package/src/lib/Parser.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import type { marked } from 'marked';
|
|
3
|
+
import { decode } from 'html-entities';
|
|
3
4
|
import Renderer from './Renderer';
|
|
4
5
|
import type { MarkedStyles } from '../theme/types';
|
|
5
6
|
import type { CustomStyleProp, ParserOptions, TextStyleProp } from './types';
|
|
@@ -67,10 +68,10 @@ class Parser {
|
|
|
67
68
|
const children = item.tokens.map((cItem) => {
|
|
68
69
|
if (cItem.type === 'text') {
|
|
69
70
|
/* getViewNode since tokens could contain a block like elements (i.e. img) */
|
|
71
|
+
const childTokens = (cItem as marked.Tokens.Text).tokens || [];
|
|
70
72
|
const listChildren =
|
|
71
73
|
this.getNormalizedSiblingNodesForBlockAndInlineTokens(
|
|
72
|
-
|
|
73
|
-
cItem.tokens,
|
|
74
|
+
childTokens,
|
|
74
75
|
this.styles.li
|
|
75
76
|
);
|
|
76
77
|
return this.renderer.getViewNode(listChildren, this.styles.li);
|
|
@@ -107,11 +108,22 @@ class Parser {
|
|
|
107
108
|
});
|
|
108
109
|
}
|
|
109
110
|
case 'link': {
|
|
111
|
+
if (
|
|
112
|
+
token.tokens &&
|
|
113
|
+
token.tokens[0] &&
|
|
114
|
+
token.tokens[0].type === 'image'
|
|
115
|
+
) {
|
|
116
|
+
return this.renderer.getImageLinkNode(
|
|
117
|
+
token.href,
|
|
118
|
+
token.tokens[0]?.href
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
110
122
|
const linkStyle = {
|
|
111
123
|
...styles,
|
|
112
124
|
...this.styles.link, // To override color property
|
|
113
125
|
};
|
|
114
|
-
return this.renderer.
|
|
126
|
+
return this.renderer.getTextLinkNode(
|
|
115
127
|
this.parseInline(token.tokens, linkStyle),
|
|
116
128
|
token.href,
|
|
117
129
|
linkStyle
|
|
@@ -158,7 +170,7 @@ class Parser {
|
|
|
158
170
|
return null;
|
|
159
171
|
}
|
|
160
172
|
|
|
161
|
-
return this.renderer.getTextNode(token.raw, {
|
|
173
|
+
return this.renderer.getTextNode(decode(token.raw), {
|
|
162
174
|
...this.styles.text,
|
|
163
175
|
...styles,
|
|
164
176
|
});
|
|
@@ -181,16 +193,30 @@ class Parser {
|
|
|
181
193
|
tokens.forEach((t) => {
|
|
182
194
|
/**
|
|
183
195
|
* To avoid inlining images
|
|
196
|
+
* Currently supports images, link images
|
|
184
197
|
* Note: to be extend for other token types
|
|
185
198
|
*/
|
|
186
|
-
if (
|
|
199
|
+
if (
|
|
200
|
+
t.type === 'image' ||
|
|
201
|
+
(t.type === 'link' &&
|
|
202
|
+
t.tokens &&
|
|
203
|
+
t.tokens[0] &&
|
|
204
|
+
t.tokens[0].type === 'image')
|
|
205
|
+
) {
|
|
187
206
|
const parsed = this.parseInline(tempTokens);
|
|
188
207
|
if (parsed.length > 0) {
|
|
208
|
+
siblingNodes.push(this.renderer.getTextNode(parsed, textStyle));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (t.type === 'image') {
|
|
212
|
+
siblingNodes.push(this.parseInline([t]));
|
|
213
|
+
} else if (t.type === 'link') {
|
|
214
|
+
const imageToken = t.tokens[0] as marked.Tokens.Image;
|
|
189
215
|
siblingNodes.push(
|
|
190
|
-
this.renderer.
|
|
216
|
+
this.renderer.getImageLinkNode(t.href, imageToken.href)
|
|
191
217
|
);
|
|
192
218
|
}
|
|
193
|
-
|
|
219
|
+
|
|
194
220
|
tempTokens = [];
|
|
195
221
|
return;
|
|
196
222
|
}
|
|
@@ -203,6 +229,7 @@ class Parser {
|
|
|
203
229
|
this.renderer.getTextNode(this.parseInline(tempTokens), {})
|
|
204
230
|
);
|
|
205
231
|
}
|
|
232
|
+
|
|
206
233
|
return siblingNodes;
|
|
207
234
|
};
|
|
208
235
|
}
|
package/src/lib/Renderer.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { ReactNode } from 'react';
|
|
2
|
-
import { ScrollView, View, Text } from 'react-native';
|
|
2
|
+
import { ScrollView, View, Text, TouchableHighlight } from 'react-native';
|
|
3
3
|
import MarkedList from '@jsamr/react-native-li';
|
|
4
4
|
import Disc from '@jsamr/counter-style/presets/disc';
|
|
5
5
|
import Decimal from '@jsamr/counter-style/presets/decimal';
|
|
@@ -17,7 +17,7 @@ class Renderer {
|
|
|
17
17
|
);
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
getTextLinkNode = (
|
|
21
21
|
children: string | ReactNode[],
|
|
22
22
|
href: string,
|
|
23
23
|
styles: TextStyleProp
|
|
@@ -33,6 +33,17 @@ class Renderer {
|
|
|
33
33
|
);
|
|
34
34
|
};
|
|
35
35
|
|
|
36
|
+
getImageLinkNode = (href: string, imageUrl: string) => {
|
|
37
|
+
return (
|
|
38
|
+
<TouchableHighlight
|
|
39
|
+
onPress={onLinkPress(href)}
|
|
40
|
+
key={generateRandomString()}
|
|
41
|
+
>
|
|
42
|
+
<MDImage uri={imageUrl} />
|
|
43
|
+
</TouchableHighlight>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
|
|
36
47
|
getViewNode(children: ReactNode[] | null, styles: ViewStyleProp) {
|
|
37
48
|
return (
|
|
38
49
|
<View key={generateRandomString()} style={styles}>
|