react-native-markdown-renderer
Version:
Markdown renderer for react-native, with CommonMark spec support + adds syntax extensions & sugar (URL autolinking, typographer).
238 lines (221 loc) • 6.6 kB
JavaScript
import React, { Component, PropTypes } from 'react';
import { Text, TouchableWithoutFeedback, View } from 'react-native';
import FitImage from 'react-native-fit-image';
import openUrl from './util/openUrl';
import hasParents from './util/hasParents';
import applyStyle from './util/applyStyle';
const renderRules = {
// when unknown elements are introduced, so it wont break
unknown: (node, children, parent, styles) => {
return (
<View key={node.key}>
<Text>{node.type}</Text>
</View>
);
},
textgroup: (node, children, parent, styles) => {
return (
<Text key={node.key} style={styles.text}>
{children}
</Text>
);
},
inline: (node, children, parent, styles) => {
return <Text key={node.key}>{children}</Text>;
},
text: (node, children, parent, styles) => {
return <Text key={node.key}>{node.content}</Text>;
},
span: (node, children, parent, styles) => {
return <Text key={node.key}>{children}</Text>;
},
strong: (node, children, parent, styles) => {
return (
<Text key={node.key} style={styles.strong}>
{children}
</Text>
);
},
s: (node, children, parent, styles) => {
return (
<Text key={node.key} style={styles.strikethrough}>
{children}
</Text>
);
},
// a
link: (node, children, parent, styles) => {
return (
<Text key={node.key} style={styles.link} onPress={() => openUrl(node.attributes.href)}>
{children}
</Text>
);
},
// a with a non text element nested inside
blocklink: (node, children, parent, styles) => {
return (
<TouchableWithoutFeedback key={node.key} onPress={() => openUrl(node.attributes.href)} style={styles.blocklink}>
<View style={styles.image}>{children}</View>
</TouchableWithoutFeedback>
);
},
em: (node, children, parent, styles) => {
return (
<Text key={node.key} style={styles.em}>
{children}
</Text>
);
},
heading1: (node, children, parent, styles) => {
return (
<View key={node.key} style={styles.headingContainer}>
{applyStyle(children, [styles.heading, styles.heading1], 'Text')}
</View>
);
},
heading2: (node, children, parent, styles) => {
children = applyStyle(children, [styles.heading, styles.heading2], 'Text');
return (
<View key={node.key} style={styles.headingContainer}>
{children}
</View>
);
},
heading3: (node, children, parent, styles) => (
<View key={node.key} style={styles.headingContainer}>
{applyStyle(children, [styles.heading, styles.heading3], 'Text')}
</View>
),
heading4: (node, children, parent, styles) => (
<View key={node.key} style={styles.headingContainer}>
{applyStyle(children, [styles.heading, styles.heading4], 'Text')}
</View>
),
heading5: (node, children, parent, styles) => (
<View key={node.key} style={styles.headingContainer}>
{applyStyle(children, [styles.heading, styles.heading5], 'Text')}
</View>
),
heading6: (node, children, parent, styles) => (
<View key={node.key} style={styles.headingContainer}>
{applyStyle(children, [styles.heading, styles.heading6], 'Text')}
</View>
),
paragraph: (node, children, parent, styles) => (
<View key={node.key} style={styles.paragraph}>
{children}
</View>
),
hardbreak: (node, children, parent, styles) => <View key={node.key} style={styles.hardbreak} />,
blockquote: (node, children, parent, styles) => (
<View key={node.key} style={styles.blockquote}>
{children}
</View>
),
code_inline: (node, children, parent, styles) => {
return (
<Text key={node.key} style={styles.codeInline}>
{node.content}
</Text>
);
},
code_block: (node, children, parent, styles) => {
return (
<Text key={node.key} style={styles.codeBlock}>
{node.content}
</Text>
);
},
fence: (node, children, parent, styles) => {
return (
<Text key={node.key} style={styles.codeBlock}>
{node.content}
</Text>
);
},
pre: (node, children, parent, styles) => (
<View key={node.key} style={styles.pre}>
{children}
</View>
),
// ul
bullet_list: (node, children, parent, styles) => {
return (
<View key={node.key} style={[styles.list, styles.listUnordered]}>
{children}
</View>
);
},
ordered_list: (node, children, parent, styles) => {
return (
<View key={node.key} style={[styles.list, styles.listOrdered]}>
{children}
</View>
);
},
// li
list_item: (node, children, parent, styles) => {
if (hasParents(parent, 'bullet_list')) {
return (
<View key={node.key} style={styles.listUnorderedItem}>
<Text style={styles.listUnorderedItemIcon}>{'\u00B7'}</Text>
<View style={[styles.listItem]}>{children}</View>
</View>
);
}
if (hasParents(parent, 'ordered_list')) {
return (
<View key={node.key} style={styles.listOrderedItem}>
<Text style={styles.listOrderedItemIcon}>{node.index + 1}</Text>
<View style={[styles.listItem]}>{children}</View>
</View>
);
}
return (
<View key={node.key} style={[styles.listItem]}>
{children}
</View>
);
},
table: (node, children, parent, styles) => (
<View key={node.key} style={[styles.table]}>
{children}
</View>
),
thead: (node, children, parent, styles) => (
<View key={node.key} style={[styles.tableHeader]}>
{children}
</View>
),
tbody: (node, children, parent, styles) => <View key={node.key}>{children}</View>,
th: (node, children, parent, styles) => {
return (
<View key={node.key} style={[styles.tableHeaderCell]}>
{children}
</View>
);
},
tr: (node, children, parent, styles) => {
return (
<View key={node.key} style={[styles.tableRow]}>
{children}
</View>
);
},
td: (node, children, parent, styles) => {
return (
<View key={node.key} style={[styles.tableRowCell]}>
{children}
</View>
);
},
hr: (node, children, parent, styles) => {
return <View key={node.key} style={[styles.hr]} />;
},
// br
softbreak: (node, children, parent, styles) => <Text key={node.key}>{'\n'}</Text>,
image: (node, children, parent, styles) => {
return <FitImage indicator={true} key={node.key} style={styles.image} source={{ uri: node.attributes.src }} />;
},
};
export default renderRules;