linguist-js
Version:
Analyse the programming languages used in a folder or from raw content, using the same rules that GitHub Linguist does.
34 lines (33 loc) • 1.7 kB
JavaScript
import { normPath } from '../fs/normalisedPath.js';
/**
* Parses a gitattributes file.
*/
export default function parseGitattributes(content, folderRoot = '.') {
const output = [];
for (const rawLine of content.split('\n')) {
const line = rawLine.replace(/#.*/, '').trim();
if (!line)
continue;
const parts = line.split(/\s+/g);
const fileGlob = parts[0];
const relFileGlob = normPath(folderRoot, fileGlob);
const attrParts = parts.slice(1);
const isTrue = (str) => !str.startsWith('-') && !str.endsWith('=false');
const isFalse = (str) => str.startsWith('-') || str.endsWith('=false');
const trueParts = (str) => attrParts.filter(part => part.includes(str) && isTrue(part));
const falseParts = (str) => attrParts.filter(part => part.includes(str) && isFalse(part));
const hasTrueParts = (str) => trueParts(str).length > 0;
const hasFalseParts = (str) => falseParts(str).length > 0;
const boolOrNullVal = (str) => hasTrueParts(str) ? true : hasFalseParts(str) ? false : null;
const attrs = {
'generated': boolOrNullVal('linguist-generated'),
'vendored': boolOrNullVal('linguist-vendored'),
'documentation': boolOrNullVal('linguist-documentation'),
'detectable': boolOrNullVal('linguist-detectable'),
'binary': hasTrueParts('binary') || hasFalseParts('text') ? true : hasFalseParts('binary') || hasTrueParts('text') ? false : null,
'language': trueParts('linguist-language').at(-1)?.split('=')[1] ?? null,
};
output.push({ glob: relFileGlob, attrs });
}
return output;
}