Skip to content

Commit 2cb1642

Browse files
committed
chore: add preview of markdown lib fork for testing
1 parent 7b7ad2e commit 2cb1642

File tree

8 files changed

+1357
-39
lines changed

8 files changed

+1357
-39
lines changed

examples/SampleApp/yarn.lock

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2041,6 +2041,18 @@
20412041
"@jridgewell/resolve-uri" "^3.1.0"
20422042
"@jridgewell/sourcemap-codec" "^1.4.14"
20432043

2044+
"@khanacademy/[email protected]":
2045+
version "2.1.0"
2046+
resolved "https://registry.yarnpkg.com/@khanacademy/perseus-utils/-/perseus-utils-2.1.0.tgz#a405f5e740e73a1345f2b172ff34260b6d87f57e"
2047+
integrity sha512-QgN9qW1hnoCGkErSVwCJ5SmWAqlcgXA3TvtMjsyv8LiYbAS4/ZMQOHIuq5P7u0t1i6tp02w7Qjbz/COsxyHg/A==
2048+
2049+
"@khanacademy/simple-markdown@^2.1.0":
2050+
version "2.1.0"
2051+
resolved "https://registry.yarnpkg.com/@khanacademy/simple-markdown/-/simple-markdown-2.1.0.tgz#7fcbbcb4d0eda7d0dfb09c2ae35f0b9eb1e07dcf"
2052+
integrity sha512-U9yemDLqP3ehAhUdBhzVfZe9h10wWbkrIkfFf2ejSO/cUSFZwjt+KRfZtZK6q2HY+RkNYUjALDpwJu7LkrY1gw==
2053+
dependencies:
2054+
"@khanacademy/perseus-utils" "2.1.0"
2055+
20442056
"@napi-rs/wasm-runtime@^0.2.11":
20452057
version "0.2.11"
20462058
resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz#192c1610e1625048089ab4e35bc0649ce478500e"

package/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
},
6969
"dependencies": {
7070
"@gorhom/bottom-sheet": "^5.1.8",
71+
"@khanacademy/simple-markdown": "^2.1.0",
7172
"@ungap/structured-clone": "^1.3.0",
7273
"dayjs": "1.11.13",
7374
"emoji-regex": "^10.4.0",
@@ -77,7 +78,6 @@
7778
"lodash-es": "4.17.21",
7879
"mime-types": "^2.1.35",
7980
"path": "0.12.7",
80-
"react-native-markdown-package": "1.8.2",
8181
"react-native-url-polyfill": "^2.0.0",
8282
"stream-chat": "^9.23.0",
8383
"use-sync-external-store": "^1.5.0"
@@ -112,11 +112,11 @@
112112
"@babel/core": "^7.27.4",
113113
"@babel/runtime": "^7.27.6",
114114
"@op-engineering/op-sqlite": "^14.0.3",
115-
"@shopify/flash-list": "^2.1.0",
116115
"@react-native-community/eslint-config": "3.2.0",
117116
"@react-native-community/eslint-plugin": "1.3.0",
118117
"@react-native-community/netinfo": "^11.4.1",
119118
"@react-native/babel-preset": "0.79.3",
119+
"@shopify/flash-list": "^2.1.0",
120120
"@testing-library/jest-native": "^5.4.3",
121121
"@testing-library/react-native": "13.2.0",
122122
"@types/better-sqlite3": "^7.6.13",
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import React, { PropsWithChildren, useMemo } from 'react';
2+
import { View } from 'react-native';
3+
4+
import SimpleMarkdown, {
5+
OutputRules,
6+
ParserRules,
7+
ReactOutputRule,
8+
} from '@khanacademy/simple-markdown';
9+
import { isArray, isEqual, merge } from 'lodash';
10+
11+
import { getLocalRules } from './rules';
12+
import styles from './styles';
13+
14+
import { MarkdownStyle } from '../../../../../contexts';
15+
16+
type DefaultRules = typeof SimpleMarkdown.defaultRules;
17+
18+
export type MarkdownRules = Partial<DefaultRules>;
19+
20+
export type MarkdownProps = {
21+
onLink: (url: string) => Promise<void>;
22+
rules: MarkdownRules;
23+
styles: MarkdownStyle;
24+
};
25+
26+
export type MarkdownOptions = Partial<Pick<MarkdownProps, 'onLink'>>;
27+
28+
const Markdown = (props: PropsWithChildren<MarkdownProps>) => {
29+
const { onLink, rules: rulesProp, styles: stylesProp, children } = props;
30+
31+
const mergedStyles = useMemo(() => merge({}, styles, stylesProp), [stylesProp]);
32+
const localRules = useMemo(
33+
() =>
34+
merge(
35+
{},
36+
SimpleMarkdown.defaultRules,
37+
{ ...SimpleMarkdown.defaultRules },
38+
getLocalRules(mergedStyles, { onLink }),
39+
rulesProp,
40+
) as unknown as ParserRules,
41+
[mergedStyles, onLink, rulesProp],
42+
);
43+
44+
const parser = useMemo(() => SimpleMarkdown.parserFor(localRules), [localRules]);
45+
const renderer = useMemo(
46+
() => SimpleMarkdown.outputFor(localRules as unknown as OutputRules<ReactOutputRule>, 'react'),
47+
[localRules],
48+
);
49+
50+
const childText = useMemo(() => (isArray(children) ? children.join('') : children), [children]);
51+
52+
const toRender = useMemo(() => {
53+
const blockSource = `${childText ?? ''}\n\n`;
54+
return parser(blockSource, { inline: false });
55+
}, [childText, parser]);
56+
57+
const tree = useMemo(() => renderer(toRender), [renderer, toRender]);
58+
59+
return <View style={[styles.view, stylesProp?.view]}>{tree}</View>;
60+
};
61+
62+
const areEqual = (prevProps: PropsWithChildren, nextProps: PropsWithChildren) =>
63+
isEqual(prevProps.children, nextProps.children);
64+
65+
export default React.memo(Markdown, areEqual);

0 commit comments

Comments
 (0)