117 lines
2.7 KiB
Plaintext
117 lines
2.7 KiB
Plaintext
// prettify_mcode.ce — reformat .mcode files to be human-readable
|
|
// Usage: ./cell --dev prettify_mcode boot/tokenize.cm.mcode
|
|
// ./cell --dev prettify_mcode boot/*.mcode
|
|
|
|
var fd = use("fd")
|
|
var json = use("json")
|
|
|
|
if (length(args) == 0) {
|
|
print("usage: cell prettify_mcode <file.mcode> [...]")
|
|
disrupt
|
|
}
|
|
|
|
// Collapse leaf arrays (instruction arrays) onto single lines
|
|
var compact_arrays = function(json_text) {
|
|
var lines = array(json_text, "\n")
|
|
var result = []
|
|
var i = 0
|
|
var line = null
|
|
var trimmed = null
|
|
var collecting = false
|
|
var collected = null
|
|
var indent = null
|
|
var is_leaf = null
|
|
var j = 0
|
|
var inner = null
|
|
var parts = null
|
|
var trailing = null
|
|
var chars = null
|
|
var k = 0
|
|
|
|
while (i < length(lines)) {
|
|
line = lines[i]
|
|
trimmed = trim(line)
|
|
if (collecting == false && trimmed == "[") {
|
|
collecting = true
|
|
chars = array(line)
|
|
k = 0
|
|
while (k < length(chars) && chars[k] == " ") {
|
|
k = k + 1
|
|
}
|
|
indent = text(line, 0, k)
|
|
collected = []
|
|
i = i + 1
|
|
continue
|
|
}
|
|
if (collecting) {
|
|
if (trimmed == "]" || trimmed == "],") {
|
|
is_leaf = true
|
|
j = 0
|
|
while (j < length(collected)) {
|
|
inner = trim(collected[j])
|
|
if (starts_with(inner, "[") || starts_with(inner, "{")) {
|
|
is_leaf = false
|
|
}
|
|
j = j + 1
|
|
}
|
|
if (is_leaf && length(collected) > 0) {
|
|
parts = []
|
|
j = 0
|
|
while (j < length(collected)) {
|
|
inner = trim(collected[j])
|
|
if (ends_with(inner, ",")) {
|
|
inner = text(inner, 0, length(inner) - 1)
|
|
}
|
|
parts[] = inner
|
|
j = j + 1
|
|
}
|
|
trailing = ""
|
|
if (ends_with(trimmed, ",")) {
|
|
trailing = ","
|
|
}
|
|
result[] = `${indent}[${text(parts, ", ")}]${trailing}`
|
|
} else {
|
|
result[] = `${indent}[`
|
|
j = 0
|
|
while (j < length(collected)) {
|
|
result[] = collected[j]
|
|
j = j + 1
|
|
}
|
|
result[] = line
|
|
}
|
|
collecting = false
|
|
} else {
|
|
collected[] = line
|
|
}
|
|
i = i + 1
|
|
continue
|
|
}
|
|
result[] = line
|
|
i = i + 1
|
|
}
|
|
return text(result, "\n")
|
|
}
|
|
|
|
var i = 0
|
|
var path = null
|
|
var raw = null
|
|
var obj = null
|
|
var pretty = null
|
|
var f = null
|
|
while (i < length(args)) {
|
|
path = args[i]
|
|
if (!fd.is_file(path)) {
|
|
print(`skip ${path} (not found)`)
|
|
i = i + 1
|
|
continue
|
|
}
|
|
raw = text(fd.slurp(path))
|
|
obj = json.decode(raw)
|
|
pretty = compact_arrays(json.encode(obj, null, 2))
|
|
f = fd.open(path, "w")
|
|
fd.write(f, pretty)
|
|
fd.close(f)
|
|
print(`prettified ${path}`)
|
|
i = i + 1
|
|
}
|