Hansa
September 23, 2026 ยท View on GitHub
Detect the programming language based only on content.
Just content, no filename, no extension, nothing else. There are other tools for that.
This is a port of a piece of go-enry to Crystal, trained on the same Linguist corpus (go-enry v2.9.6).
Before the classifier runs, two content-only strategies from go-enry v2 are consulted, in this order:
- Editor modelines (
# vim: set ft=ruby:,# -*- mode: python -*-) in the first or last 5 lines. - Shebang lines, including
/usr/bin/envindirection, with the interpreter mapped through Linguist's table. A shebang naming one language wins outright; ambiguous ones (perl โ Perl/Pod) restrict the classifier to those candidates.
Paradoxically it will detect Crystal as Ruby but it's close enough ;-)
Installation
-
Add the dependency to your
shard.yml:dependencies: hansa: github: ralsina/hansa -
Run
shards install
Usage
require "hansa"
puts Hansa.classify(File.read(ARGV[0])) # => "Ruby"
There is a "hansa" command line tool that can be used to classify files:
$ hansa src/hansa.cr
src/hansa.cr CoffeeScript
$ printf '#!/bin/bash\necho hi\n' | hansa -
- Shell
Run hansa --help for usage. Errors are reported on stderr with a
non-zero exit code, and a file argument of - reads standard input.
Development
I don't expect to do much more development here.
Contributing
- Fork it (https://github.com/ralsina/hansa/fork)
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a new Pull Request
Contributors
- Roberto Alsina - creator and maintainer