@gmod/vcf
Version:
High performance streaming Variant Call Format (VCF) parser in pure JavaScript
65 lines • 1.96 kB
JavaScript
// constructed with the assistance of claude AI
//
// I first prompted it with a regex that splits a comma separated string with
// awareness of quotation from this stackoverflow queston
// https://stackoverflow.com/a/18893443/2129219, and asked it to add support
// for square brackets
//
// it undid the regex into serial logic and the result was this function
function customSplit(str) {
const result = [];
let current = '';
let inQuotes = false;
let inBrackets = false;
for (const char of str) {
if (char === '"') {
inQuotes = !inQuotes;
current += char;
}
else if (char === '[') {
inBrackets = true;
current += char;
}
else if (char === ']') {
inBrackets = false;
current += char;
}
else if (char === ',' && !inQuotes && !inBrackets) {
result.push(current.trim());
current = '';
}
else {
current += char;
}
}
if (current) {
result.push(current.trim());
}
return result;
}
function splitFirst(str, split) {
const index = str.indexOf(split);
return [str.slice(0, index), str.slice(index + 1)];
}
export function parseMetaString(metaString) {
const inside = metaString.replace(/^<|>$/g, '');
return Object.fromEntries(customSplit(inside).map(f => {
const [key, val] = splitFirst(f, '=');
if (val && val.startsWith('[') && val.endsWith(']')) {
return [
key,
val
.slice(1, -1)
.split(',')
.map(f => f.trim()),
];
}
else if (val && val.startsWith('"') && val.endsWith('"')) {
return [key, val.slice(1, -1)];
}
else {
return [key, val?.replaceAll(/^"|"$/g, '')];
}
}));
}
//# sourceMappingURL=parseMetaString.js.map