linguist-js
Version:
Analyse the programming languages used in a folder or from raw content, using the same rules that GitHub Linguist does.
23 lines (22 loc) • 1.06 kB
JavaScript
const modelineRegex = /-\*-|(?:syntax|filetype|ft)\s*=/;
const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
export default function byModeline(file, langData, opts) {
if (!opts.checkModeline || opts.quick)
return [];
const firstLine = file.firstLine;
// Check modeline declaration
if (!firstLine || !modelineRegex.test(firstLine))
return [];
const modelineText = firstLine.toLowerCase().split(modelineRegex)[1] ?? '';
// Add identified language(s)
return Object.entries(langData).flatMap(([lang, data]) => {
const safeLang = escapeRegExp(lang.toLowerCase());
const matchesLang = new RegExp(`\\b${safeLang}(?![\\w#+*]|-\\*-)`).test(modelineText);
const aliases = data.aliases ?? [];
const matchesAlias = aliases.some((alias) => {
const safeAlias = escapeRegExp(alias.toLowerCase());
return new RegExp(`\\b${safeAlias}(?![\\w#+*]|-\\*-)`).test(modelineText);
});
return matchesLang || matchesAlias ? [lang] : [];
});
}