pb-parser/index.js

68 lines
1.8 KiB
JavaScript

import {deepStrictEqual} from "assert";
/**
* Parses a PB single .pb file
* @param{string} rinput
* @return{Object}
*/
export function parse(rinput) {
let input = rinput.split("\n").map(v => v.trim()).filter(v => v.length > 0)
let object = {}
let object_key = ""
let object_buffer = {}
let object_value_buffer = ""
let object_open = false
for (let line of input) {
if (line.endsWith("{")) {
object_key = line.replaceAll("{", "").trim()
object_buffer = {}
object_value_buffer = ""
object_open = true
} else if (line.endsWith("}")) {
object_open = false
if (object[object_key] != null) {
if (Array.isArray(object[object_key])) {
object[object_key].push(object_buffer)
} else {
let old_obj = object[object_key]
object[object_key] = [old_obj, object_buffer]
}
} else {
object[object_key] = object_buffer
}
} else {
let { key, value } = parse_value(line)
if (object_open === true) {
object_buffer[key] = value
} else {
object[key] = value
}
}
}
return object
}
/**
* Parses a single value
* @param{string} input
* @return{{key: string, value: string|number}}
*/
export function parse_value(input) {
let [key, ...rvalues] = input.split(":")
let value = rvalues.join("").trim()
if (value.startsWith("\"") && value.endsWith("\"")) {
return {
key,
value: value.slice(1, -1).replaceAll("\\", ""),
}
} else {
return {
key,
value: Number(value)
}
}
}