react-native-marked 1.1.7 → 1.2.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/README.md +3 -2
- package/dist/commonjs/components/MDImage.js +4 -1
- package/dist/commonjs/components/MDImage.js.map +1 -1
- package/dist/commonjs/lib/Parser.js +4 -5
- package/dist/commonjs/lib/Parser.js.map +1 -1
- package/dist/commonjs/lib/Renderer.js +10 -6
- package/dist/commonjs/lib/Renderer.js.map +1 -1
- package/dist/commonjs/theme/styles.js +8 -2
- package/dist/commonjs/theme/styles.js.map +1 -1
- package/dist/module/components/MDImage.js +4 -1
- package/dist/module/components/MDImage.js.map +1 -1
- package/dist/module/lib/Parser.js +4 -5
- package/dist/module/lib/Parser.js.map +1 -1
- package/dist/module/lib/Renderer.js +10 -6
- package/dist/module/lib/Renderer.js.map +1 -1
- package/dist/module/theme/styles.js +8 -2
- package/dist/module/theme/styles.js.map +1 -1
- package/dist/typescript/components/MDImage.d.ts +2 -1
- package/dist/typescript/lib/Renderer.d.ts +2 -2
- package/package.json +1 -1
- package/src/components/MDImage.tsx +10 -2
- package/src/lib/Parser.tsx +12 -3
- package/src/lib/Renderer.tsx +9 -4
- package/src/theme/styles.ts +6 -0
package/README.md
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
[](https://github.com/gmsgowtham/react-native-marked/blob/main/LICENSE)
|
|
4
4
|
[](https://github.com/gmsgowtham/react-native-marked/actions/workflows/build.yml)
|
|
5
5
|
[](https://coveralls.io/github/gmsgowtham/react-native-marked?branch=main)
|
|
6
|
-

|
|
7
|
-

|
|
6
|
+
[](https://www.npmjs.com/package/react-native-marked)
|
|
7
|
+
[](https://www.npmjs.com/package/react-native-marked)
|
|
8
8
|
|
|
9
9
|
Markdown renderer for React Native powered by [marked.js](https://marked.js.org/) with built-in theming support
|
|
10
10
|
|
|
@@ -69,3 +69,4 @@ Made with [create-react-native-library](https://github.com/callstack/react-nativ
|
|
|
69
69
|
- [Marked](https://marked.js.org/)
|
|
70
70
|
- [React Native Fit Image](https://github.com/huiseoul/react-native-fit-image)
|
|
71
71
|
- [@jsamr/react-native-li](https://github.com/jsamr/react-native-li)
|
|
72
|
+
- [entities](https://github.com/fb55/entities)
|
|
@@ -19,12 +19,15 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
19
19
|
|
|
20
20
|
const MDImage = _ref => {
|
|
21
21
|
let {
|
|
22
|
-
uri
|
|
22
|
+
uri,
|
|
23
|
+
alt = ''
|
|
23
24
|
} = _ref;
|
|
24
25
|
(0, _react.useEffect)(() => {
|
|
25
26
|
_reactNative.Image.prefetch(uri);
|
|
26
27
|
}, [uri]);
|
|
27
28
|
return /*#__PURE__*/_react.default.createElement(_reactNativeFitImage.default, {
|
|
29
|
+
accessibilityRole: "image",
|
|
30
|
+
accessibilityLabel: alt,
|
|
28
31
|
source: {
|
|
29
32
|
uri
|
|
30
33
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MDImage","uri","useEffect","Image","prefetch","memo"],"sources":["MDImage.tsx"],"sourcesContent":["import React, { memo, useEffect } from 'react';\nimport { Image } from 'react-native';\nimport FitImage from 'react-native-fit-image';\n\ninterface MDImageProps {\n uri: string;\n}\n\nconst MDImage = ({ uri }: MDImageProps) => {\n useEffect(() => {\n Image.prefetch(uri);\n }, [uri]);\n\n return <FitImage
|
|
1
|
+
{"version":3,"names":["MDImage","uri","alt","useEffect","Image","prefetch","memo"],"sources":["MDImage.tsx"],"sourcesContent":["import React, { memo, useEffect } from 'react';\nimport { Image } from 'react-native';\nimport FitImage from 'react-native-fit-image';\n\ninterface MDImageProps {\n uri: string;\n alt?: string;\n}\n\nconst MDImage = ({ uri, alt = '' }: MDImageProps) => {\n useEffect(() => {\n Image.prefetch(uri);\n }, [uri]);\n\n return (\n <FitImage\n accessibilityRole=\"image\"\n accessibilityLabel={alt}\n source={{ uri }}\n resizeMode=\"cover\"\n />\n );\n};\n\nexport default memo(MDImage);\n"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;;;;;;;AAOA,MAAMA,OAAO,GAAG,QAAqC;EAAA,IAApC;IAAEC,GAAF;IAAOC,GAAG,GAAG;EAAb,CAAoC;EACnD,IAAAC,gBAAA,EAAU,MAAM;IACdC,kBAAA,CAAMC,QAAN,CAAeJ,GAAf;EACD,CAFD,EAEG,CAACA,GAAD,CAFH;EAIA,oBACE,6BAAC,4BAAD;IACE,iBAAiB,EAAC,OADpB;IAEE,kBAAkB,EAAEC,GAFtB;IAGE,MAAM,EAAE;MAAED;IAAF,CAHV;IAIE,UAAU,EAAC;EAJb,EADF;AAQD,CAbD;;4BAee,IAAAK,WAAA,EAAKN,OAAL,C"}
|
|
@@ -41,7 +41,7 @@ class Parser {
|
|
|
41
41
|
siblingNodes.push(this.parseInline([t]));
|
|
42
42
|
} else if (t.type === 'link') {
|
|
43
43
|
const imageToken = t.tokens[0];
|
|
44
|
-
siblingNodes.push(this.renderer.getImageLinkNode(t.href, imageToken.href));
|
|
44
|
+
siblingNodes.push(this.renderer.getImageLinkNode(t.href, imageToken.href, imageToken.text || imageToken.title));
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
tempTokens = [];
|
|
@@ -149,9 +149,8 @@ class Parser {
|
|
|
149
149
|
case 'link':
|
|
150
150
|
{
|
|
151
151
|
if (token.tokens && token.tokens[0] && token.tokens[0].type === 'image') {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
return this.renderer.getImageLinkNode(token.href, (_token$tokens$ = token.tokens[0]) === null || _token$tokens$ === void 0 ? void 0 : _token$tokens$.href);
|
|
152
|
+
const imageToken = token.tokens[0];
|
|
153
|
+
return this.renderer.getImageLinkNode(token.href, imageToken.href, imageToken.text || imageToken.title);
|
|
155
154
|
}
|
|
156
155
|
|
|
157
156
|
const linkStyle = { ...styles,
|
|
@@ -163,7 +162,7 @@ class Parser {
|
|
|
163
162
|
|
|
164
163
|
case 'image':
|
|
165
164
|
{
|
|
166
|
-
return this.renderer.getImageNode(token.href);
|
|
165
|
+
return this.renderer.getImageNode(token.href, token.text || token.title);
|
|
167
166
|
}
|
|
168
167
|
|
|
169
168
|
case 'strong':
|
|
@@ -1 +1 @@
|
|
|
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 '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
|
+
{"version":3,"names":["Parser","constructor","options","tokens","textStyle","tempTokens","siblingNodes","forEach","t","type","parsed","parseInline","length","push","renderer","getTextNode","imageToken","getImageLinkNode","href","text","title","styles","Renderer","headingStylesMap","h1","h2","h3","h4","h5","h6","parse","elements","map","token","paragraphChildren","getNormalizedSiblingNodesForBlockAndInlineTokens","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 '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 const imageToken = token.tokens[0];\n return this.renderer.getImageLinkNode(\n token.href,\n imageToken.href,\n imageToken.text || imageToken.title\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(\n token.href,\n token.text || token.title\n );\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(\n t.href,\n imageToken.href,\n imageToken.text || imageToken.title\n )\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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"}
|
|
@@ -36,19 +36,22 @@ class Renderer {
|
|
|
36
36
|
|
|
37
37
|
_defineProperty(this, "getTextLinkNode", (children, href, styles) => {
|
|
38
38
|
return /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
|
|
39
|
+
accessibilityRole: "link",
|
|
40
|
+
accessibilityHint: "Opens in a new window",
|
|
39
41
|
key: (0, _string.generateRandomString)(),
|
|
40
42
|
onPress: (0, _handlers.onLinkPress)(href),
|
|
41
43
|
style: styles
|
|
42
44
|
}, children);
|
|
43
45
|
});
|
|
44
46
|
|
|
45
|
-
_defineProperty(this, "getImageLinkNode", (href, imageUrl) => {
|
|
47
|
+
_defineProperty(this, "getImageLinkNode", (href, imageUrl, alt) => {
|
|
48
|
+
const imageNode = this.getImageNode(imageUrl, alt);
|
|
46
49
|
return /*#__PURE__*/_react.default.createElement(_reactNative.TouchableHighlight, {
|
|
50
|
+
accessibilityRole: "link",
|
|
51
|
+
accessibilityHint: "Opens in a new window",
|
|
47
52
|
onPress: (0, _handlers.onLinkPress)(href),
|
|
48
53
|
key: (0, _string.generateRandomString)()
|
|
49
|
-
},
|
|
50
|
-
uri: imageUrl
|
|
51
|
-
}));
|
|
54
|
+
}, imageNode);
|
|
52
55
|
});
|
|
53
56
|
}
|
|
54
57
|
|
|
@@ -76,10 +79,11 @@ class Renderer {
|
|
|
76
79
|
}, children);
|
|
77
80
|
}
|
|
78
81
|
|
|
79
|
-
getImageNode(uri) {
|
|
82
|
+
getImageNode(uri, alt) {
|
|
80
83
|
return /*#__PURE__*/_react.default.createElement(_MDImage.default, {
|
|
81
84
|
key: (0, _string.generateRandomString)(),
|
|
82
|
-
uri: uri
|
|
85
|
+
uri: uri,
|
|
86
|
+
alt: alt
|
|
83
87
|
});
|
|
84
88
|
}
|
|
85
89
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Renderer","children","styles","generateRandomString","href","onLinkPress","imageUrl","getViewNode","getCodeBlockNode","text","containerStyle","textStyle","getBlockquoteNode","
|
|
1
|
+
{"version":3,"names":["Renderer","children","styles","generateRandomString","href","onLinkPress","imageUrl","alt","imageNode","getImageNode","getViewNode","getCodeBlockNode","text","containerStyle","textStyle","getBlockquoteNode","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 accessibilityRole=\"link\"\n accessibilityHint=\"Opens in a new window\"\n key={generateRandomString()}\n onPress={onLinkPress(href)}\n style={styles}\n >\n {children}\n </Text>\n );\n };\n\n getImageLinkNode = (href: string, imageUrl: string, alt: string) => {\n const imageNode = this.getImageNode(imageUrl, alt);\n return (\n <TouchableHighlight\n accessibilityRole=\"link\"\n accessibilityHint=\"Opens in a new window\"\n onPress={onLinkPress(href)}\n key={generateRandomString()}\n >\n {imageNode}\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, alt: string) {\n return <MDImage key={generateRandomString()} uri={uri} alt={alt} />;\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,iBAAiB,EAAC,MADpB;QAEE,iBAAiB,EAAC,uBAFpB;QAGE,GAAG,EAAE,IAAAC,4BAAA,GAHP;QAIE,OAAO,EAAE,IAAAE,qBAAA,EAAYD,IAAZ,CAJX;QAKE,KAAK,EAAEF;MALT,GAOGD,QAPH,CADF;IAWD,CAzBY;;IAAA,0CA2BM,CAACG,IAAD,EAAeE,QAAf,EAAiCC,GAAjC,KAAiD;MAClE,MAAMC,SAAS,GAAG,KAAKC,YAAL,CAAkBH,QAAlB,EAA4BC,GAA5B,CAAlB;MACA,oBACE,6BAAC,+BAAD;QACE,iBAAiB,EAAC,MADpB;QAEE,iBAAiB,EAAC,uBAFpB;QAGE,OAAO,EAAE,IAAAF,qBAAA,EAAYD,IAAZ,CAHX;QAIE,GAAG,EAAE,IAAAD,4BAAA;MAJP,GAMGK,SANH,CADF;IAUD,CAvCY;EAAA;;EAyCbE,WAAW,CAACT,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;;EAEDU,gBAAgB,CACdC,IADc,EAEdC,cAFc,EAGdC,SAHc,EAId;IACA,oBACE,6BAAC,uBAAD;MACE,GAAG,EAAE,IAAAX,4BAAA,GADP;MAEE,qBAAqB,EAAEU,cAFzB;MAGE,UAAU;IAHZ,gBAKE,6BAAC,iBAAD;MAAM,KAAK,EAAEC;IAAb,GAAyBF,IAAzB,CALF,CADF;EASD;;EAEDG,iBAAiB,CAACd,QAAD,EAAwBC,MAAxB,EAA+C;IAC9D,oBACE,6BAAC,iBAAD;MAAM,GAAG,EAAE,IAAAC,4BAAA,GAAX;MAAmC,KAAK,EAAED;IAA1C,GACGD,QADH,CADF;EAKD;;EAEDQ,YAAY,CAACO,GAAD,EAAcT,GAAd,EAA2B;IACrC,oBAAO,6BAAC,gBAAD;MAAS,GAAG,EAAE,IAAAJ,4BAAA,GAAd;MAAsC,GAAG,EAAEa,GAA3C;MAAgD,GAAG,EAAET;IAArD,EAAP;EACD;;EAEDU,WAAW,CACTC,OADS,EAETC,EAFS,EAGTC,SAHS,EAITN,SAJS,EAKT;IACA,oBACE,6BAAC,sBAAD;MACE,eAAe,EAAEI,OAAO,GAAGG,gBAAH,GAAaC,aADvC;MAEE,eAAe,EAAER,SAFnB;MAGE,cAAc,EAAEM,SAHlB;MAIE,GAAG,EAAE,IAAAjB,4BAAA;IAJP,GAMGgB,EAAE,CAACI,GAAH,CAAQC,IAAD,IAAUA,IAAjB,CANH,CADF;EAUD;;AA7FY;;eAgGAxB,Q"}
|
|
@@ -57,12 +57,18 @@ const getStyles = (userStyles, colorScheme) => {
|
|
|
57
57
|
lineHeight: 40,
|
|
58
58
|
fontWeight: 'bold',
|
|
59
59
|
marginVertical: 8,
|
|
60
|
-
letterSpacing: 0
|
|
60
|
+
letterSpacing: 0,
|
|
61
|
+
paddingBottom: 4,
|
|
62
|
+
borderBottomColor: theme.colors.border,
|
|
63
|
+
borderBottomWidth: 1
|
|
61
64
|
},
|
|
62
65
|
h2: { ...fontStyle.heading,
|
|
63
66
|
fontSize: 28,
|
|
64
67
|
lineHeight: 36,
|
|
65
|
-
marginVertical: 8
|
|
68
|
+
marginVertical: 8,
|
|
69
|
+
paddingBottom: 4,
|
|
70
|
+
borderBottomColor: theme.colors.border,
|
|
71
|
+
borderBottomWidth: 1
|
|
66
72
|
},
|
|
67
73
|
h3: { ...fontStyle.heading,
|
|
68
74
|
fontSize: 24,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getFontStyles","theme","StyleSheet","create","regular","fontSize","lineHeight","color","colors","text","heading","fontWeight","getStyles","userStyles","colorScheme","getTheme","fontStyle","defaultStyles","container","backgroundColor","background","em","strong","paragraph","paddingVertical","link","blockquote","borderLeftColor","border","paddingLeft","borderLeftWidth","opacity","h1","marginVertical","letterSpacing","h2","h3","h4","h5","h6","codespan","code","padding","minWidth","hr","
|
|
1
|
+
{"version":3,"names":["getFontStyles","theme","StyleSheet","create","regular","fontSize","lineHeight","color","colors","text","heading","fontWeight","getStyles","userStyles","colorScheme","getTheme","fontStyle","defaultStyles","container","backgroundColor","background","em","strong","paragraph","paddingVertical","link","blockquote","borderLeftColor","border","paddingLeft","borderLeftWidth","opacity","h1","marginVertical","letterSpacing","paddingBottom","borderBottomColor","borderBottomWidth","h2","h3","h4","h5","h6","codespan","code","padding","minWidth","hr","li","flexShrink"],"sources":["styles.ts"],"sourcesContent":["import { ColorSchemeName, StyleSheet } from 'react-native';\nimport { getTheme } from './theme';\nimport type { MarkedStyles, Theme } from './types';\n\nconst getFontStyles = (theme: Theme) => {\n return StyleSheet.create({\n regular: {\n fontSize: 16,\n lineHeight: 24,\n color: theme.colors.text,\n },\n heading: {\n fontWeight: '500',\n color: theme.colors.text,\n },\n });\n};\n\nconst getStyles = (\n userStyles?: MarkedStyles,\n colorScheme?: ColorSchemeName\n): MarkedStyles => {\n const theme = getTheme(colorScheme || 'light');\n const fontStyle = getFontStyles(theme);\n const defaultStyles = StyleSheet.create<MarkedStyles>({\n container: {\n backgroundColor: theme.colors.background,\n },\n em: {\n ...fontStyle.regular,\n fontStyle: 'italic',\n },\n strong: {\n ...fontStyle.regular,\n fontWeight: 'bold',\n },\n text: {\n ...fontStyle.regular,\n },\n paragraph: {\n ...fontStyle.regular,\n paddingVertical: 8,\n },\n link: {\n ...fontStyle.regular,\n fontStyle: 'italic',\n color: theme.colors.link,\n },\n blockquote: {\n borderLeftColor: theme.colors.border,\n paddingLeft: 16,\n borderLeftWidth: 5,\n opacity: 0.8,\n },\n h1: {\n fontSize: 32,\n lineHeight: 40,\n fontWeight: 'bold',\n marginVertical: 8,\n letterSpacing: 0,\n paddingBottom: 4,\n borderBottomColor: theme.colors.border,\n borderBottomWidth: 1,\n },\n h2: {\n ...fontStyle.heading,\n fontSize: 28,\n lineHeight: 36,\n marginVertical: 8,\n paddingBottom: 4,\n borderBottomColor: theme.colors.border,\n borderBottomWidth: 1,\n },\n h3: {\n ...fontStyle.heading,\n fontSize: 24,\n lineHeight: 32,\n marginVertical: 4,\n },\n h4: {\n ...fontStyle.heading,\n fontSize: 22,\n lineHeight: 28,\n marginVertical: 4,\n },\n h5: {\n ...fontStyle.regular,\n ...fontStyle.heading,\n marginVertical: 2,\n },\n h6: {\n ...fontStyle.heading,\n fontSize: 14,\n lineHeight: 20,\n marginVertical: 2,\n },\n codespan: {\n ...fontStyle.regular,\n fontStyle: 'italic',\n backgroundColor: theme.colors.code,\n fontWeight: '300',\n },\n code: {\n padding: 16,\n backgroundColor: theme.colors.code,\n minWidth: '100%',\n },\n hr: {\n borderBottomWidth: 1,\n borderBottomColor: theme.colors.border,\n marginVertical: 4,\n },\n li: {\n ...fontStyle.regular,\n flexShrink: 1,\n },\n });\n\n return {\n ...defaultStyles,\n ...userStyles,\n };\n};\n\nexport default getStyles;\n"],"mappings":"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"}
|
|
@@ -4,12 +4,15 @@ import FitImage from 'react-native-fit-image';
|
|
|
4
4
|
|
|
5
5
|
const MDImage = _ref => {
|
|
6
6
|
let {
|
|
7
|
-
uri
|
|
7
|
+
uri,
|
|
8
|
+
alt = ''
|
|
8
9
|
} = _ref;
|
|
9
10
|
useEffect(() => {
|
|
10
11
|
Image.prefetch(uri);
|
|
11
12
|
}, [uri]);
|
|
12
13
|
return /*#__PURE__*/React.createElement(FitImage, {
|
|
14
|
+
accessibilityRole: "image",
|
|
15
|
+
accessibilityLabel: alt,
|
|
13
16
|
source: {
|
|
14
17
|
uri
|
|
15
18
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","memo","useEffect","Image","FitImage","MDImage","uri","prefetch"],"sources":["MDImage.tsx"],"sourcesContent":["import React, { memo, useEffect } from 'react';\nimport { Image } from 'react-native';\nimport FitImage from 'react-native-fit-image';\n\ninterface MDImageProps {\n uri: string;\n}\n\nconst MDImage = ({ uri }: MDImageProps) => {\n useEffect(() => {\n Image.prefetch(uri);\n }, [uri]);\n\n return <FitImage
|
|
1
|
+
{"version":3,"names":["React","memo","useEffect","Image","FitImage","MDImage","uri","alt","prefetch"],"sources":["MDImage.tsx"],"sourcesContent":["import React, { memo, useEffect } from 'react';\nimport { Image } from 'react-native';\nimport FitImage from 'react-native-fit-image';\n\ninterface MDImageProps {\n uri: string;\n alt?: string;\n}\n\nconst MDImage = ({ uri, alt = '' }: MDImageProps) => {\n useEffect(() => {\n Image.prefetch(uri);\n }, [uri]);\n\n return (\n <FitImage\n accessibilityRole=\"image\"\n accessibilityLabel={alt}\n source={{ uri }}\n resizeMode=\"cover\"\n />\n );\n};\n\nexport default memo(MDImage);\n"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,IAAhB,EAAsBC,SAAtB,QAAuC,OAAvC;AACA,SAASC,KAAT,QAAsB,cAAtB;AACA,OAAOC,QAAP,MAAqB,wBAArB;;AAOA,MAAMC,OAAO,GAAG,QAAqC;EAAA,IAApC;IAAEC,GAAF;IAAOC,GAAG,GAAG;EAAb,CAAoC;EACnDL,SAAS,CAAC,MAAM;IACdC,KAAK,CAACK,QAAN,CAAeF,GAAf;EACD,CAFQ,EAEN,CAACA,GAAD,CAFM,CAAT;EAIA,oBACE,oBAAC,QAAD;IACE,iBAAiB,EAAC,OADpB;IAEE,kBAAkB,EAAEC,GAFtB;IAGE,MAAM,EAAE;MAAED;IAAF,CAHV;IAIE,UAAU,EAAC;EAJb,EADF;AAQD,CAbD;;AAeA,4BAAeL,IAAI,CAACI,OAAD,CAAnB"}
|
|
@@ -31,7 +31,7 @@ class Parser {
|
|
|
31
31
|
siblingNodes.push(this.parseInline([t]));
|
|
32
32
|
} else if (t.type === 'link') {
|
|
33
33
|
const imageToken = t.tokens[0];
|
|
34
|
-
siblingNodes.push(this.renderer.getImageLinkNode(t.href, imageToken.href));
|
|
34
|
+
siblingNodes.push(this.renderer.getImageLinkNode(t.href, imageToken.href, imageToken.text || imageToken.title));
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
tempTokens = [];
|
|
@@ -139,9 +139,8 @@ class Parser {
|
|
|
139
139
|
case 'link':
|
|
140
140
|
{
|
|
141
141
|
if (token.tokens && token.tokens[0] && token.tokens[0].type === 'image') {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
return this.renderer.getImageLinkNode(token.href, (_token$tokens$ = token.tokens[0]) === null || _token$tokens$ === void 0 ? void 0 : _token$tokens$.href);
|
|
142
|
+
const imageToken = token.tokens[0];
|
|
143
|
+
return this.renderer.getImageLinkNode(token.href, imageToken.href, imageToken.text || imageToken.title);
|
|
145
144
|
}
|
|
146
145
|
|
|
147
146
|
const linkStyle = { ...styles,
|
|
@@ -153,7 +152,7 @@ class Parser {
|
|
|
153
152
|
|
|
154
153
|
case 'image':
|
|
155
154
|
{
|
|
156
|
-
return this.renderer.getImageNode(token.href);
|
|
155
|
+
return this.renderer.getImageNode(token.href, token.text || token.title);
|
|
157
156
|
}
|
|
158
157
|
|
|
159
158
|
case 'strong':
|
|
@@ -1 +1 @@
|
|
|
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 '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
|
+
{"version":3,"names":["decode","Renderer","Parser","constructor","options","tokens","textStyle","tempTokens","siblingNodes","forEach","t","type","parsed","parseInline","length","push","renderer","getTextNode","imageToken","getImageLinkNode","href","text","title","styles","headingStylesMap","h1","h2","h3","h4","h5","h6","parse","elements","map","token","paragraphChildren","getNormalizedSiblingNodesForBlockAndInlineTokens","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 '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 const imageToken = token.tokens[0];\n return this.renderer.getImageLinkNode(\n token.href,\n imageToken.href,\n imageToken.text || imageToken.title\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(\n token.href,\n token.text || token.title\n );\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(\n t.href,\n imageToken.href,\n imageToken.text || imageToken.title\n )\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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"}
|
|
@@ -20,19 +20,22 @@ class Renderer {
|
|
|
20
20
|
|
|
21
21
|
_defineProperty(this, "getTextLinkNode", (children, href, styles) => {
|
|
22
22
|
return /*#__PURE__*/React.createElement(Text, {
|
|
23
|
+
accessibilityRole: "link",
|
|
24
|
+
accessibilityHint: "Opens in a new window",
|
|
23
25
|
key: generateRandomString(),
|
|
24
26
|
onPress: onLinkPress(href),
|
|
25
27
|
style: styles
|
|
26
28
|
}, children);
|
|
27
29
|
});
|
|
28
30
|
|
|
29
|
-
_defineProperty(this, "getImageLinkNode", (href, imageUrl) => {
|
|
31
|
+
_defineProperty(this, "getImageLinkNode", (href, imageUrl, alt) => {
|
|
32
|
+
const imageNode = this.getImageNode(imageUrl, alt);
|
|
30
33
|
return /*#__PURE__*/React.createElement(TouchableHighlight, {
|
|
34
|
+
accessibilityRole: "link",
|
|
35
|
+
accessibilityHint: "Opens in a new window",
|
|
31
36
|
onPress: onLinkPress(href),
|
|
32
37
|
key: generateRandomString()
|
|
33
|
-
},
|
|
34
|
-
uri: imageUrl
|
|
35
|
-
}));
|
|
38
|
+
}, imageNode);
|
|
36
39
|
});
|
|
37
40
|
}
|
|
38
41
|
|
|
@@ -60,10 +63,11 @@ class Renderer {
|
|
|
60
63
|
}, children);
|
|
61
64
|
}
|
|
62
65
|
|
|
63
|
-
getImageNode(uri) {
|
|
66
|
+
getImageNode(uri, alt) {
|
|
64
67
|
return /*#__PURE__*/React.createElement(MDImage, {
|
|
65
68
|
key: generateRandomString(),
|
|
66
|
-
uri: uri
|
|
69
|
+
uri: uri,
|
|
70
|
+
alt: alt
|
|
67
71
|
});
|
|
68
72
|
}
|
|
69
73
|
|
|
@@ -1 +1 @@
|
|
|
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","
|
|
1
|
+
{"version":3,"names":["React","ScrollView","View","Text","TouchableHighlight","MarkedList","Disc","Decimal","MDImage","generateRandomString","onLinkPress","Renderer","children","styles","href","imageUrl","alt","imageNode","getImageNode","getViewNode","getCodeBlockNode","text","containerStyle","textStyle","getBlockquoteNode","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 accessibilityRole=\"link\"\n accessibilityHint=\"Opens in a new window\"\n key={generateRandomString()}\n onPress={onLinkPress(href)}\n style={styles}\n >\n {children}\n </Text>\n );\n };\n\n getImageLinkNode = (href: string, imageUrl: string, alt: string) => {\n const imageNode = this.getImageNode(imageUrl, alt);\n return (\n <TouchableHighlight\n accessibilityRole=\"link\"\n accessibilityHint=\"Opens in a new window\"\n onPress={onLinkPress(href)}\n key={generateRandomString()}\n >\n {imageNode}\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, alt: string) {\n return <MDImage key={generateRandomString()} uri={uri} alt={alt} />;\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,iBAAiB,EAAC,MADpB;QAEE,iBAAiB,EAAC,uBAFpB;QAGE,GAAG,EAAEJ,oBAAoB,EAH3B;QAIE,OAAO,EAAEC,WAAW,CAACI,IAAD,CAJtB;QAKE,KAAK,EAAED;MALT,GAOGD,QAPH,CADF;IAWD,CAzBY;;IAAA,0CA2BM,CAACE,IAAD,EAAeC,QAAf,EAAiCC,GAAjC,KAAiD;MAClE,MAAMC,SAAS,GAAG,KAAKC,YAAL,CAAkBH,QAAlB,EAA4BC,GAA5B,CAAlB;MACA,oBACE,oBAAC,kBAAD;QACE,iBAAiB,EAAC,MADpB;QAEE,iBAAiB,EAAC,uBAFpB;QAGE,OAAO,EAAEN,WAAW,CAACI,IAAD,CAHtB;QAIE,GAAG,EAAEL,oBAAoB;MAJ3B,GAMGQ,SANH,CADF;IAUD,CAvCY;EAAA;;EAyCbE,WAAW,CAACP,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;;EAEDQ,gBAAgB,CACdC,IADc,EAEdC,cAFc,EAGdC,SAHc,EAId;IACA,oBACE,oBAAC,UAAD;MACE,GAAG,EAAEd,oBAAoB,EAD3B;MAEE,qBAAqB,EAAEa,cAFzB;MAGE,UAAU;IAHZ,gBAKE,oBAAC,IAAD;MAAM,KAAK,EAAEC;IAAb,GAAyBF,IAAzB,CALF,CADF;EASD;;EAEDG,iBAAiB,CAACZ,QAAD,EAAwBC,MAAxB,EAA+C;IAC9D,oBACE,oBAAC,IAAD;MAAM,GAAG,EAAEJ,oBAAoB,EAA/B;MAAmC,KAAK,EAAEI;IAA1C,GACGD,QADH,CADF;EAKD;;EAEDM,YAAY,CAACO,GAAD,EAAcT,GAAd,EAA2B;IACrC,oBAAO,oBAAC,OAAD;MAAS,GAAG,EAAEP,oBAAoB,EAAlC;MAAsC,GAAG,EAAEgB,GAA3C;MAAgD,GAAG,EAAET;IAArD,EAAP;EACD;;EAEDU,WAAW,CACTC,OADS,EAETC,EAFS,EAGTC,SAHS,EAITN,SAJS,EAKT;IACA,oBACE,oBAAC,UAAD;MACE,eAAe,EAAEI,OAAO,GAAGpB,OAAH,GAAaD,IADvC;MAEE,eAAe,EAAEiB,SAFnB;MAGE,cAAc,EAAEM,SAHlB;MAIE,GAAG,EAAEpB,oBAAoB;IAJ3B,GAMGmB,EAAE,CAACE,GAAH,CAAQC,IAAD,IAAUA,IAAjB,CANH,CADF;EAUD;;AA7FY;;AAgGf,eAAepB,QAAf"}
|
|
@@ -48,12 +48,18 @@ const getStyles = (userStyles, colorScheme) => {
|
|
|
48
48
|
lineHeight: 40,
|
|
49
49
|
fontWeight: 'bold',
|
|
50
50
|
marginVertical: 8,
|
|
51
|
-
letterSpacing: 0
|
|
51
|
+
letterSpacing: 0,
|
|
52
|
+
paddingBottom: 4,
|
|
53
|
+
borderBottomColor: theme.colors.border,
|
|
54
|
+
borderBottomWidth: 1
|
|
52
55
|
},
|
|
53
56
|
h2: { ...fontStyle.heading,
|
|
54
57
|
fontSize: 28,
|
|
55
58
|
lineHeight: 36,
|
|
56
|
-
marginVertical: 8
|
|
59
|
+
marginVertical: 8,
|
|
60
|
+
paddingBottom: 4,
|
|
61
|
+
borderBottomColor: theme.colors.border,
|
|
62
|
+
borderBottomWidth: 1
|
|
57
63
|
},
|
|
58
64
|
h3: { ...fontStyle.heading,
|
|
59
65
|
fontSize: 24,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["StyleSheet","getTheme","getFontStyles","theme","create","regular","fontSize","lineHeight","color","colors","text","heading","fontWeight","getStyles","userStyles","colorScheme","fontStyle","defaultStyles","container","backgroundColor","background","em","strong","paragraph","paddingVertical","link","blockquote","borderLeftColor","border","paddingLeft","borderLeftWidth","opacity","h1","marginVertical","letterSpacing","h2","h3","h4","h5","h6","codespan","code","padding","minWidth","hr","
|
|
1
|
+
{"version":3,"names":["StyleSheet","getTheme","getFontStyles","theme","create","regular","fontSize","lineHeight","color","colors","text","heading","fontWeight","getStyles","userStyles","colorScheme","fontStyle","defaultStyles","container","backgroundColor","background","em","strong","paragraph","paddingVertical","link","blockquote","borderLeftColor","border","paddingLeft","borderLeftWidth","opacity","h1","marginVertical","letterSpacing","paddingBottom","borderBottomColor","borderBottomWidth","h2","h3","h4","h5","h6","codespan","code","padding","minWidth","hr","li","flexShrink"],"sources":["styles.ts"],"sourcesContent":["import { ColorSchemeName, StyleSheet } from 'react-native';\nimport { getTheme } from './theme';\nimport type { MarkedStyles, Theme } from './types';\n\nconst getFontStyles = (theme: Theme) => {\n return StyleSheet.create({\n regular: {\n fontSize: 16,\n lineHeight: 24,\n color: theme.colors.text,\n },\n heading: {\n fontWeight: '500',\n color: theme.colors.text,\n },\n });\n};\n\nconst getStyles = (\n userStyles?: MarkedStyles,\n colorScheme?: ColorSchemeName\n): MarkedStyles => {\n const theme = getTheme(colorScheme || 'light');\n const fontStyle = getFontStyles(theme);\n const defaultStyles = StyleSheet.create<MarkedStyles>({\n container: {\n backgroundColor: theme.colors.background,\n },\n em: {\n ...fontStyle.regular,\n fontStyle: 'italic',\n },\n strong: {\n ...fontStyle.regular,\n fontWeight: 'bold',\n },\n text: {\n ...fontStyle.regular,\n },\n paragraph: {\n ...fontStyle.regular,\n paddingVertical: 8,\n },\n link: {\n ...fontStyle.regular,\n fontStyle: 'italic',\n color: theme.colors.link,\n },\n blockquote: {\n borderLeftColor: theme.colors.border,\n paddingLeft: 16,\n borderLeftWidth: 5,\n opacity: 0.8,\n },\n h1: {\n fontSize: 32,\n lineHeight: 40,\n fontWeight: 'bold',\n marginVertical: 8,\n letterSpacing: 0,\n paddingBottom: 4,\n borderBottomColor: theme.colors.border,\n borderBottomWidth: 1,\n },\n h2: {\n ...fontStyle.heading,\n fontSize: 28,\n lineHeight: 36,\n marginVertical: 8,\n paddingBottom: 4,\n borderBottomColor: theme.colors.border,\n borderBottomWidth: 1,\n },\n h3: {\n ...fontStyle.heading,\n fontSize: 24,\n lineHeight: 32,\n marginVertical: 4,\n },\n h4: {\n ...fontStyle.heading,\n fontSize: 22,\n lineHeight: 28,\n marginVertical: 4,\n },\n h5: {\n ...fontStyle.regular,\n ...fontStyle.heading,\n marginVertical: 2,\n },\n h6: {\n ...fontStyle.heading,\n fontSize: 14,\n lineHeight: 20,\n marginVertical: 2,\n },\n codespan: {\n ...fontStyle.regular,\n fontStyle: 'italic',\n backgroundColor: theme.colors.code,\n fontWeight: '300',\n },\n code: {\n padding: 16,\n backgroundColor: theme.colors.code,\n minWidth: '100%',\n },\n hr: {\n borderBottomWidth: 1,\n borderBottomColor: theme.colors.border,\n marginVertical: 4,\n },\n li: {\n ...fontStyle.regular,\n flexShrink: 1,\n },\n });\n\n return {\n ...defaultStyles,\n ...userStyles,\n };\n};\n\nexport default getStyles;\n"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
interface MDImageProps {
|
|
3
3
|
uri: string;
|
|
4
|
+
alt?: string;
|
|
4
5
|
}
|
|
5
|
-
declare const _default: React.MemoExoticComponent<({ uri }: MDImageProps) => JSX.Element>;
|
|
6
|
+
declare const _default: React.MemoExoticComponent<({ uri, alt }: MDImageProps) => JSX.Element>;
|
|
6
7
|
export default _default;
|
|
@@ -3,11 +3,11 @@ 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
|
+
getImageLinkNode: (href: string, imageUrl: string, alt: string) => JSX.Element;
|
|
7
7
|
getViewNode(children: ReactNode[] | null, styles: ViewStyleProp): JSX.Element;
|
|
8
8
|
getCodeBlockNode(text: string, containerStyle: ViewStyleProp, textStyle: TextStyleProp): JSX.Element;
|
|
9
9
|
getBlockquoteNode(children: ReactNode[], styles: ViewStyleProp): JSX.Element;
|
|
10
|
-
getImageNode(uri: string): JSX.Element;
|
|
10
|
+
getImageNode(uri: string, alt: string): JSX.Element;
|
|
11
11
|
getListNode(ordered: boolean, li: ReactNode[], listStyle: ViewStyleProp, textStyle: TextStyleProp): JSX.Element;
|
|
12
12
|
}
|
|
13
13
|
export default Renderer;
|
package/package.json
CHANGED
|
@@ -4,14 +4,22 @@ import FitImage from 'react-native-fit-image';
|
|
|
4
4
|
|
|
5
5
|
interface MDImageProps {
|
|
6
6
|
uri: string;
|
|
7
|
+
alt?: string;
|
|
7
8
|
}
|
|
8
9
|
|
|
9
|
-
const MDImage = ({ uri }: MDImageProps) => {
|
|
10
|
+
const MDImage = ({ uri, alt = '' }: MDImageProps) => {
|
|
10
11
|
useEffect(() => {
|
|
11
12
|
Image.prefetch(uri);
|
|
12
13
|
}, [uri]);
|
|
13
14
|
|
|
14
|
-
return
|
|
15
|
+
return (
|
|
16
|
+
<FitImage
|
|
17
|
+
accessibilityRole="image"
|
|
18
|
+
accessibilityLabel={alt}
|
|
19
|
+
source={{ uri }}
|
|
20
|
+
resizeMode="cover"
|
|
21
|
+
/>
|
|
22
|
+
);
|
|
15
23
|
};
|
|
16
24
|
|
|
17
25
|
export default memo(MDImage);
|
package/src/lib/Parser.tsx
CHANGED
|
@@ -113,9 +113,11 @@ class Parser {
|
|
|
113
113
|
token.tokens[0] &&
|
|
114
114
|
token.tokens[0].type === 'image'
|
|
115
115
|
) {
|
|
116
|
+
const imageToken = token.tokens[0];
|
|
116
117
|
return this.renderer.getImageLinkNode(
|
|
117
118
|
token.href,
|
|
118
|
-
|
|
119
|
+
imageToken.href,
|
|
120
|
+
imageToken.text || imageToken.title
|
|
119
121
|
);
|
|
120
122
|
}
|
|
121
123
|
|
|
@@ -130,7 +132,10 @@ class Parser {
|
|
|
130
132
|
);
|
|
131
133
|
}
|
|
132
134
|
case 'image': {
|
|
133
|
-
return this.renderer.getImageNode(
|
|
135
|
+
return this.renderer.getImageNode(
|
|
136
|
+
token.href,
|
|
137
|
+
token.text || token.title
|
|
138
|
+
);
|
|
134
139
|
}
|
|
135
140
|
case 'strong': {
|
|
136
141
|
const boldStyle = {
|
|
@@ -213,7 +218,11 @@ class Parser {
|
|
|
213
218
|
} else if (t.type === 'link') {
|
|
214
219
|
const imageToken = t.tokens[0] as marked.Tokens.Image;
|
|
215
220
|
siblingNodes.push(
|
|
216
|
-
this.renderer.getImageLinkNode(
|
|
221
|
+
this.renderer.getImageLinkNode(
|
|
222
|
+
t.href,
|
|
223
|
+
imageToken.href,
|
|
224
|
+
imageToken.text || imageToken.title
|
|
225
|
+
)
|
|
217
226
|
);
|
|
218
227
|
}
|
|
219
228
|
|
package/src/lib/Renderer.tsx
CHANGED
|
@@ -24,6 +24,8 @@ class Renderer {
|
|
|
24
24
|
) => {
|
|
25
25
|
return (
|
|
26
26
|
<Text
|
|
27
|
+
accessibilityRole="link"
|
|
28
|
+
accessibilityHint="Opens in a new window"
|
|
27
29
|
key={generateRandomString()}
|
|
28
30
|
onPress={onLinkPress(href)}
|
|
29
31
|
style={styles}
|
|
@@ -33,13 +35,16 @@ class Renderer {
|
|
|
33
35
|
);
|
|
34
36
|
};
|
|
35
37
|
|
|
36
|
-
getImageLinkNode = (href: string, imageUrl: string) => {
|
|
38
|
+
getImageLinkNode = (href: string, imageUrl: string, alt: string) => {
|
|
39
|
+
const imageNode = this.getImageNode(imageUrl, alt);
|
|
37
40
|
return (
|
|
38
41
|
<TouchableHighlight
|
|
42
|
+
accessibilityRole="link"
|
|
43
|
+
accessibilityHint="Opens in a new window"
|
|
39
44
|
onPress={onLinkPress(href)}
|
|
40
45
|
key={generateRandomString()}
|
|
41
46
|
>
|
|
42
|
-
|
|
47
|
+
{imageNode}
|
|
43
48
|
</TouchableHighlight>
|
|
44
49
|
);
|
|
45
50
|
};
|
|
@@ -76,8 +81,8 @@ class Renderer {
|
|
|
76
81
|
);
|
|
77
82
|
}
|
|
78
83
|
|
|
79
|
-
getImageNode(uri: string) {
|
|
80
|
-
return <MDImage key={generateRandomString()} uri={uri} />;
|
|
84
|
+
getImageNode(uri: string, alt: string) {
|
|
85
|
+
return <MDImage key={generateRandomString()} uri={uri} alt={alt} />;
|
|
81
86
|
}
|
|
82
87
|
|
|
83
88
|
getListNode(
|
package/src/theme/styles.ts
CHANGED
|
@@ -58,12 +58,18 @@ const getStyles = (
|
|
|
58
58
|
fontWeight: 'bold',
|
|
59
59
|
marginVertical: 8,
|
|
60
60
|
letterSpacing: 0,
|
|
61
|
+
paddingBottom: 4,
|
|
62
|
+
borderBottomColor: theme.colors.border,
|
|
63
|
+
borderBottomWidth: 1,
|
|
61
64
|
},
|
|
62
65
|
h2: {
|
|
63
66
|
...fontStyle.heading,
|
|
64
67
|
fontSize: 28,
|
|
65
68
|
lineHeight: 36,
|
|
66
69
|
marginVertical: 8,
|
|
70
|
+
paddingBottom: 4,
|
|
71
|
+
borderBottomColor: theme.colors.border,
|
|
72
|
+
borderBottomWidth: 1,
|
|
67
73
|
},
|
|
68
74
|
h3: {
|
|
69
75
|
...fontStyle.heading,
|