Skip to content
internal/classify
Edit
On this page

Group naming and text/binary classification: extension normalization, the ext, type and hybrid methods, sniffing on a map miss, and the empty-file rule.

#internal/classify

#internal/classify

Package classify determines a file's group name (format) and its text/binary classification, according to the selected grouping method.

#MethodExt

Go go
const MethodExt    = "ext"

Grouping method names.

#MethodType

Go go
const MethodType   = "type"

#MethodHybrid

Go go
const MethodHybrid = "hybrid"

#FormatsRaw

Go go
const FormatsRaw       = "raw"

Format naming modes: how the group name a file lands in is spelled.

#FormatsCanonical

Go go
const FormatsCanonical = "canonical"

#GroupNoExtension

Go go
const GroupNoExtension = "(no extension)"

Group names for files that could not be assigned a real format.

#GroupUnknown

Go go
const GroupUnknown     = "(unknown)"

#Class

Go go
type Class struct

Class is the classification outcome for a single file.

#Classifier

Go go
type Classifier struct

Classifier classifies files per a fixed method and embedded lists.

#New

Go go
func New(method, formats string, textExts, textMimes map[string]struct{}, aliases map[string]string) *Classifier

New returns a Classifier for the given method ("ext", "type", or "hybrid") and format naming mode ("raw" or "canonical"). aliases is the canonical alias table, read only in canonical mode.

#NormalizeExt

Go go
func NormalizeExt(name string) string

NormalizeExt returns the normalized extension of a file name: the suffix after the last dot, lowercased, without the dot. Following Python's Path.suffix semantics: "archive.tar.gz" -> "gz"; dotfiles like ".bashrc", bare names like "Makefile", and trailing-dot names have no extension.

#ShebangFormat

Go go
func ShebangFormat(line string) (string, bool)

ShebangFormat maps a shebang line to the format name its scripts are grouped under in canonical mode. The second result is false when the line is not a shebang, names no interpreter, or names one with no unambiguous format.

The interpreter is found by stripping an env wrapper (its flags, its -S/--split-string forms, and any NAME=value assignments), then unwrapping the uv run X and uvx X runner forms. A trailing version suffix on the interpreter's base name is dropped, so python3.12 reads as python.

#Classifier.ExtIsText

Go go
func (c *Classifier) ExtIsText(ext string) bool

ExtIsText reports whether a normalized extension classifies as text.

#Classifier.MimeIsText

Go go
func (c *Classifier) MimeIsText(mime string) bool

MimeIsText reports whether a MIME type classifies as text: it starts with "text/" or is in the embedded text-mimetypes list.

#Classifier.File

Go go
func (c *Classifier) File(absPath, name string, size int64) (Class, error)

File classifies the file at absPath whose base name is name and whose size in bytes is size. A non-nil error means the file could not be read during sniffing; the caller must treat it as unreadable. Class.Sniffed is valid even when err is non-nil.

Search