UNPKG

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
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; }