Skip to content

Commit 779c5c0

Browse files
committed
feat: use chardet to detect binary file
1 parent e204e3b commit 779c5c0

File tree

3 files changed

+12
-16
lines changed

3 files changed

+12
-16
lines changed

frontend/pages/DisplayPaste.tsx

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { useEffect, useState } from "react"
22

33
import { Button, CircularProgress, Link, Tooltip } from "@heroui/react"
4-
import binaryExtensions from "binary-extensions"
4+
import chardet from "chardet"
55

66
import { useErrorModal } from "../components/ErrorModal.js"
77
import { DarkModeToggle, useDarkModeSelection } from "../components/DarkModeToggle.js"
@@ -18,10 +18,6 @@ import "../style.css"
1818
import "../styles/highlight-theme-light.css"
1919
import "../styles/highlight-theme-dark.css"
2020

21-
function isBinaryPath(path: string) {
22-
return binaryExtensions.includes(path.replace(/.*\./, ""))
23-
}
24-
2521
export function DisplayPaste() {
2622
const [pasteFile, setPasteFile] = useState<File | undefined>(undefined)
2723
const [pasteContentBuffer, setPasteContentBuffer] = useState<ArrayBuffer | undefined>(undefined)
@@ -73,7 +69,6 @@ export function DisplayPaste() {
7369

7470
const inferredFilename = filename || (ext && name + ext) || filenameFromDisp
7571
const respBytes = await resp.bytes()
76-
const isBinary = lang === null && inferredFilename !== undefined && isBinaryPath(inferredFilename)
7772
setPasteLang(lang || undefined)
7873

7974
const keyString = url.hash.slice(1)
@@ -84,7 +79,8 @@ export function DisplayPaste() {
8479
setDecrypted("encrypted")
8580
setFileBinary(true)
8681
} else {
87-
setFileBinary(isBinary)
82+
const encoding = chardet.detect(respBytes)
83+
setFileBinary(encoding !== "utf8" && encoding !== "ASCII")
8884
}
8985
} else {
9086
let key: CryptoKey | undefined
@@ -109,8 +105,8 @@ export function DisplayPaste() {
109105
setPasteContentBuffer(decrypted)
110106
setPasteLang(lang || undefined)
111107

112-
const isBinary = lang === null && inferredFilename !== undefined && isBinaryPath(inferredFilename)
113-
setFileBinary(isBinary)
108+
const encoding = chardet.detect(decrypted)
109+
setFileBinary(encoding !== "utf8" && encoding !== "ASCII")
114110
setDecrypted("decrypted")
115111
}
116112
} finally {
@@ -127,7 +123,7 @@ export function DisplayPaste() {
127123
<div className="absolute top-[50%] left-[50%] translate-[-50%] flex flex-col items-center w-full">
128124
<div className="text-foreground-600 mb-2">{`${pasteFile?.name} (${formatSize(pasteFile.size)})`}</div>
129125
<div className="w-fit text-center">
130-
Possibly Binary file{" "}
126+
This file seems to be binary or not in UTF-8.{" "}
131127
<button className="text-primary-500 inline" onClick={() => setForceShowBinary(true)}>
132128
(Click to show)
133129
</button>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
"@tailwindcss/vite": "^4.1.4",
5757
"@types/react": "^19.1.2",
5858
"@types/react-dom": "^19.1.2",
59-
"binary-extensions": "^3.0.0",
59+
"chardet": "^2.1.0",
6060
"framer-motion": "^12.7.4",
6161
"highlight.js": "^11.11.1",
6262
"mdast-util-to-string": "^4.0.0",

yarn.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4176,11 +4176,6 @@ balanced-match@^1.0.0:
41764176
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
41774177
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
41784178

4179-
binary-extensions@^3.0.0:
4180-
version "3.0.0"
4181-
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-3.0.0.tgz#14ce687f80e3ebab2a2fb78bb8611584c29f12c3"
4182-
integrity sha512-X0RfwMgXPEesg6PCXzytQZt9Unh9gtc4SfeTNJvKifUL//Oegcc/Yf31z6hThNZ8dnD3Ir3wkHVN0eWrTvP5ww==
4183-
41844179
41854180
version "0.2.14"
41864181
resolved "https://registry.yarnpkg.com/birpc/-/birpc-0.2.14.tgz#4a5498771e6ff24cf8ae5f47faf90e76ca2fce03"
@@ -4285,6 +4280,11 @@ character-entities@^2.0.0:
42854280
resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22"
42864281
integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==
42874282

4283+
chardet@^2.1.0:
4284+
version "2.1.0"
4285+
resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.1.0.tgz#1007f441a1ae9f9199a4a67f6e978fb0aa9aa3fe"
4286+
integrity sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==
4287+
42884288
check-error@^2.1.1:
42894289
version "2.1.1"
42904290
resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc"

0 commit comments

Comments
 (0)