// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import React from 'react'; import {Platform, ScrollView, Text} from 'react-native'; import {TextInput} from 'react-native-gesture-handler'; import {createStyleObject} from 'react-syntax-highlighter/create-element'; import {changeOpacity} from '@utils/theme'; type Props = { rows: any[]; stylesheet: any; defaultColor: string; fontFamily: string; fontSize?: number; digits: number; selectable?: boolean; selectionColor?: string; }; function createNativeElement({node, stylesheet, key, defaultColor, fontFamily, fontSize = 12, digits}: any): any { const {properties, type, tagName, value} = node; const startingStyle = {fontFamily, fontSize}; if (properties?.key?.startsWith('line-number')) { let valueString = `${node.children[0].value}. `; for (let i = valueString.length; i < digits + 2; i++) { valueString += ' '; } return ( {valueString} ); } if (type === 'text') { return value; } else if (tagName) { if (properties.style?.display) { properties.style.display = 'flex'; } if (properties.style?.paddingRight) { delete properties.style.paddingRight; } if (properties.style?.userSelect) { delete properties.style.userSelect; } const style = createStyleObject( properties.className, { color: defaultColor, ...properties.style, ...startingStyle, }, stylesheet, ); const children = node.children.map((child: any, i: number) => createNativeElement({ node: child, stylesheet, key: `${key}-${i}`, defaultColor: style.color || defaultColor, fontSize, fontFamily, digits, }), ); return ( {children} ); } return null; } const CodeHighlightRenderer = ({ defaultColor, digits, fontFamily, fontSize = 12, rows, selectable, selectionColor, stylesheet, }: Props) => { const content = rows.map((row, index) => { const elements = createNativeElement({ node: row, stylesheet, key: `row-${index}`, defaultColor, fontSize, fontFamily, digits, }); return [ elements, index < rows.length - 1 ? '\n' : null, ]; }); let component: React.ReactNode; if (Platform.OS === 'android') { component = ( {content} ); } else { component = ( {content} ); } return ( {component} ); }; export default CodeHighlightRenderer;