diff options
Diffstat (limited to 'desktop/assistant/Files.js')
| -rw-r--r-- | desktop/assistant/Files.js | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/desktop/assistant/Files.js b/desktop/assistant/Files.js index 825aed1..a75e693 100644 --- a/desktop/assistant/Files.js +++ b/desktop/assistant/Files.js @@ -14,9 +14,8 @@ // What a staged file is, for its chip and the actions offered on it. The // text and image lists match desktop-assistant's, which decides what chat // accepts; this only decides what the card offers. -// ponytail: the daemon also takes any text/* mime type; a file of such a -// type with a suffix not listed here reads as "other" and is not offered -// chat. Add the suffix when one shows up. +// A suffix not listed here reads as "other" at first; Assistant.qml then +// asks file(1) and fromMime() gives the kind. // Text splits into prose and data (text) and code or configuration (code), // so each gets the presets that fit it; the daemon sees one text kind. const TEXT = [".md", ".rst", ".txt", ".csv"]; @@ -49,6 +48,25 @@ function kind(path) { function chats(k) { return CHAT.includes(k); } +// For a file the name says nothing about (a script with no suffix), from +// the mime type `file -b --mime-type` reports. Prose and data are text; +// any other text type, scripts and source among them, is code. +const ARCHIVE_MIMES = ["application/zip", "application/x-tar", "application/gzip", + "application/x-xz", "application/x-bzip2", "application/zstd", + "application/x-7z-compressed", "application/x-rar", + "application/vnd.rar"]; + +function fromMime(m) { + if (["text/plain", "text/markdown", "text/csv"].includes(m)) return "text"; + if (m.startsWith("text/") || ["application/json", "application/xml", + "application/javascript"].includes(m)) return "code"; + if (["image/png", "image/jpeg", "image/gif", "image/webp"].includes(m)) return "image"; + if (m === "application/pdf") return "pdf"; + if (m.startsWith("video/")) return "video"; + if (ARCHIVE_MIMES.includes(m)) return "archive"; + return "other"; +} + // A dropped URL to a local path, or "" for anything that is not a local // file: file:///path, or file://localhost/path; any other host is remote. function fromUrl(url) { |
