fastparselite
Version:
Super simple & fast DSL parser for lightweight config-like data using custom syntax.
73 lines (64 loc) • 1.94 kB
JavaScript
const fs = require("fs");
// Parse your LiteData format
function parseLiteData(text) {
const lines = text.split(/\r?\n/).map(line => line.trim()).filter(line => line && !line.startsWith("//") && !line.startsWith("#"));
const stack = [];
const result = {};
let current = result;
let currentKey = null;
for (let line of lines) {
if (line.startsWith("@")) {
currentKey = line.slice(1).trim();
result[currentKey] = {};
current = result[currentKey];
stack.push(current);
} else if (line.endsWith("{")) {
const key = line.replace("{", "").trim();
const obj = {};
current[key] = obj;
stack.push(current);
current = obj;
} else if (line === "}") {
current = stack.pop();
} else {
const [key, valueRaw] = line.split(":").map(s => s.trim());
const value = parseValue(valueRaw);
current[key] = value;
}
}
return result;
}
// Convert values based on type
function parseValue(value) {
if (!value) return null;
if (value.startsWith('"') && value.endsWith('"')) return value.slice(1, -1);
if (value === "true") return true;
if (value === "false") return false;
if (!isNaN(value)) return parseFloat(value);
if (value.startsWith("[") && value.endsWith("]")) {
return value.slice(1, -1).split(",").map(v => parseValue(v.trim()));
}
return value;
}
// Flatten all nested values into one level for easier access
function mergeTopLevel(obj) {
const flat = { ...obj };
function extract(subObj) {
for (const key in subObj) {
const val = subObj[key];
if (typeof val === "object" && !Array.isArray(val)) {
extract(val);
} else {
if (!flat.hasOwnProperty(key)) {
flat[key] = val;
}
}
}
}
extract(obj);
return flat;
}
module.exports = {
parseLiteData,
mergeTopLevel
};