react-native-marked 1.1.6 → 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 CHANGED
@@ -1,6 +1,10 @@
1
1
  # react-native-marked
2
2
 
3
+ [![GitHub license](https://img.shields.io/github/license/gmsgowtham/react-native-marked)](https://github.com/gmsgowtham/react-native-marked/blob/main/LICENSE)
3
4
  [![CI](https://github.com/gmsgowtham/react-native-marked/actions/workflows/build.yml/badge.svg)](https://github.com/gmsgowtham/react-native-marked/actions/workflows/build.yml)
5
+ [![Coverage Status](https://coveralls.io/repos/github/gmsgowtham/react-native-marked/badge.svg?branch=main)](https://coveralls.io/github/gmsgowtham/react-native-marked?branch=main)
6
+ [![npm](https://img.shields.io/npm/v/react-native-marked)](https://www.npmjs.com/package/react-native-marked)
7
+ [![npm](https://img.shields.io/npm/dw/react-native-marked)](https://www.npmjs.com/package/react-native-marked)
4
8
 
5
9
  Markdown renderer for React Native powered by [marked.js](https://marked.js.org/) with built-in theming support
6
10
 
@@ -31,8 +35,17 @@ export default ExampleComponent;
31
35
  ```
32
36
 
33
37
  ## Example
38
+
34
39
  https://snack.expo.dev/@gmsgowtham/react-native-marked
35
40
 
41
+ ## [Props](https://github.com/gmsgowtham/react-native-marked/blob/4ef070931b7d309a7490c41e45129e12525d12d9/src/lib/types.ts#L18)
42
+
43
+ | Prop | Description | Type | Optional? |
44
+ | ------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------- |
45
+ | value | Markdown value | string | false |
46
+ | flatListProps | Props for customizing the underlying FlatList used | `Omit<FlatListProps<ReactNode>, 'data' \| 'renderItem' \| 'horizontal'>`<br><br><br>(`'data'`, `'renderItem'`, and `'horizontal'` props are omitted and cannot be overridden.) | true |
47
+ | styles | Styles for parsed components | [MarkedStyles](https://github.com/gmsgowtham/react-native-marked/blob/4ef070931b7d309a7490c41e45129e12525d12d9/src/theme/types.ts#L3) | true |
48
+
36
49
  ## Screenshots
37
50
 
38
51
  | Dark Theme | Light Theme |
@@ -56,3 +69,4 @@ Made with [create-react-native-library](https://github.com/callstack/react-nativ
56
69
  - [Marked](https://marked.js.org/)
57
70
  - [React Native Fit Image](https://github.com/huiseoul/react-native-fit-image)
58
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 source={{ uri }} resizeMode=\"cover\" />;\n};\n\nexport default memo(MDImage);\n"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;;;;;;;AAMA,MAAMA,OAAO,GAAG,QAA2B;EAAA,IAA1B;IAAEC;EAAF,CAA0B;EACzC,IAAAC,gBAAA,EAAU,MAAM;IACdC,kBAAA,CAAMC,QAAN,CAAeH,GAAf;EACD,CAFD,EAEG,CAACA,GAAD,CAFH;EAIA,oBAAO,6BAAC,4BAAD;IAAU,MAAM,EAAE;MAAEA;IAAF,CAAlB;IAA2B,UAAU,EAAC;EAAtC,EAAP;AACD,CAND;;4BAQe,IAAAI,WAAA,EAAKL,OAAL,C"}
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
- 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);
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
- }, /*#__PURE__*/_react.default.createElement(_MDImage.default, {
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","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"}
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","borderBottomWidth","borderBottomColor","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 },\n h2: {\n ...fontStyle.heading,\n fontSize: 28,\n lineHeight: 36,\n marginVertical: 8,\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
+ {"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 source={{ uri }} resizeMode=\"cover\" />;\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;;AAMA,MAAMC,OAAO,GAAG,QAA2B;EAAA,IAA1B;IAAEC;EAAF,CAA0B;EACzCJ,SAAS,CAAC,MAAM;IACdC,KAAK,CAACI,QAAN,CAAeD,GAAf;EACD,CAFQ,EAEN,CAACA,GAAD,CAFM,CAAT;EAIA,oBAAO,oBAAC,QAAD;IAAU,MAAM,EAAE;MAAEA;IAAF,CAAlB;IAA2B,UAAU,EAAC;EAAtC,EAAP;AACD,CAND;;AAQA,4BAAeL,IAAI,CAACI,OAAD,CAAnB"}
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
- 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);
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
- }, /*#__PURE__*/React.createElement(MDImage, {
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","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
+ {"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","borderBottomWidth","borderBottomColor","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 },\n h2: {\n ...fontStyle.heading,\n fontSize: 28,\n lineHeight: 36,\n marginVertical: 8,\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
+ {"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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-marked",
3
- "version": "1.1.6",
3
+ "version": "1.2.0",
4
4
  "description": "Markdown renderer for React Native powered by marked.js",
5
5
  "main": "dist/commonjs/index",
6
6
  "module": "dist/module/index",
@@ -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 <FitImage source={{ uri }} resizeMode="cover" />;
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);
@@ -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
- token.tokens[0]?.href
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(token.href);
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(t.href, imageToken.href)
221
+ this.renderer.getImageLinkNode(
222
+ t.href,
223
+ imageToken.href,
224
+ imageToken.text || imageToken.title
225
+ )
217
226
  );
218
227
  }
219
228
 
@@ -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
- <MDImage uri={imageUrl} />
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(
@@ -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,