Skip to content

Commit

Permalink
Render file as readable with ext (#1446)
Browse files Browse the repository at this point in the history
  • Loading branch information
ajbura authored Oct 10, 2023
1 parent 609b132 commit 152576e
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 11 deletions.
10 changes: 3 additions & 7 deletions src/app/components/text-viewer/TextViewer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@ import classNames from 'classnames';
import { Box, Chip, Header, Icon, IconButton, Icons, Scroll, Text, as } from 'folds';
import { ErrorBoundary } from 'react-error-boundary';
import * as css from './TextViewer.css';
import { mimeTypeToExt } from '../../utils/mimeTypes';
import { copyToClipboard } from '../../utils/dom';

const ReactPrism = lazy(() => import('../../plugins/react-prism/ReactPrism'));

export type TextViewerProps = {
name: string;
text: string;
mimeType: string;
langName: string;
requestClose: () => void;
};

export const TextViewer = as<'div', TextViewerProps>(
({ className, name, text, mimeType, requestClose, ...props }, ref) => {
({ className, name, text, langName, requestClose, ...props }, ref) => {
const handleCopy = () => {
copyToClipboard(text);
};
Expand Down Expand Up @@ -51,10 +50,7 @@ export const TextViewer = as<'div', TextViewerProps>(
alignItems="Center"
>
<Scroll hideTrack variant="Background" visibility="Hover">
<Text
as="pre"
className={classNames(css.TextViewerPre, `language-${mimeTypeToExt(mimeType)}`)}
>
<Text as="pre" className={classNames(css.TextViewerPre, `language-${langName}`)}>
<ErrorBoundary fallback={<code>{text}</code>}>
<Suspense fallback={<code>{text}</code>}>
<ReactPrism>{(codeRef) => <code ref={codeRef}>{text}</code>}</ReactPrism>
Expand Down
16 changes: 13 additions & 3 deletions src/app/organisms/room/message/FileContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,12 @@ import { useMatrixClient } from '../../../hooks/useMatrixClient';
import { getFileSrcUrl, getSrcFile } from './util';
import { bytesToSize } from '../../../utils/common';
import { TextViewer } from '../../../components/text-viewer';
import { READABLE_TEXT_MIME_TYPES } from '../../../utils/mimeTypes';
import {
READABLE_EXT_TO_MIME_TYPE,
READABLE_TEXT_MIME_TYPES,
getFileNameExt,
mimeTypeToExt,
} from '../../../utils/mimeTypes';
import { PdfViewer } from '../../../components/Pdf-viewer';
import * as css from './styles.css';

Expand Down Expand Up @@ -103,7 +108,11 @@ function ReadTextFile({ body, mimeType, url, encInfo }: Omit<FileContentProps, '
<TextViewer
name={body}
text={textState.data}
mimeType={mimeType}
langName={
READABLE_TEXT_MIME_TYPES.includes(mimeType)
? mimeTypeToExt(mimeType)
: mimeTypeToExt(READABLE_EXT_TO_MIME_TYPE[getFileNameExt(body)] ?? mimeType)
}
requestClose={() => setTextViewer(false)}
/>
</Modal>
Expand Down Expand Up @@ -247,7 +256,8 @@ function DownloadFile({ body, mimeType, url, info, encInfo }: FileContentProps)
export const FileContent = as<'div', FileContentProps>(
({ body, mimeType, url, info, encInfo, ...props }, ref) => (
<Box direction="Column" gap="300" {...props} ref={ref}>
{READABLE_TEXT_MIME_TYPES.includes(mimeType) && (
{(READABLE_TEXT_MIME_TYPES.includes(mimeType) ||
READABLE_EXT_TO_MIME_TYPE[getFileNameExt(body)]) && (
<ReadTextFile body={body} mimeType={mimeType} url={url} encInfo={encInfo} />
)}
{mimeType === 'application/pdf' && (
Expand Down
2 changes: 1 addition & 1 deletion src/app/organisms/room/message/Message.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ export const MessageSourceCodeItem = as<
<Modal variant="Surface" size="500">
<TextViewer
name="Source Code"
mimeType="application/json"
langName="json"
text={text}
requestClose={handleClose}
/>
Expand Down
41 changes: 41 additions & 0 deletions src/app/utils/mimeTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,43 @@ export const READABLE_TEXT_MIME_TYPES = [
...TEXT_MIME_TYPE,
];

export const READABLE_EXT_TO_MIME_TYPE: Record<string, string> = {
go: 'text/go',
rs: 'text/rust',
py: 'text/python',
swift: 'text/swift',
c: 'text/c',
cpp: 'text/cpp',
java: 'text/java',
kt: 'text/kotlin',
lua: 'text/lua',
php: 'text/php',
ts: 'text/typescript',
js: 'text/javascript',
jsx: 'text/jsx',
tsx: 'text/tsx',
html: 'text/html',
xhtml: 'text/xhtml',
xht: 'text/xhtml',
css: 'text/css',
scss: 'text/scss',
sass: 'text/sass',
json: 'text/json',
md: 'text/markdown',
yaml: 'text/yaml',
yni: 'text/yni',
xml: 'text/xml',
txt: 'text/plain',
text: 'text/plain',
conf: 'text/conf',
cfg: 'text/conf',
cnf: 'text/conf',
log: 'text/log',
me: 'text/me',
cvs: 'text/cvs',
tvs: 'text/tvs',
};

export const ALLOWED_BLOB_MIME_TYPES = [
...IMAGE_MIME_TYPES,
...VIDEO_MIME_TYPES,
Expand Down Expand Up @@ -92,3 +129,7 @@ export const mimeTypeToExt = (mimeType: string): string => {
const extStart = mimeType.lastIndexOf('/') + 1;
return mimeType.slice(extStart);
};
export const getFileNameExt = (fileName: string): string => {
const extStart = fileName.lastIndexOf('.') + 1;
return fileName.slice(extStart);
};

0 comments on commit 152576e

Please sign in to comment.