39 lines
1.1 KiB
Julia
39 lines
1.1 KiB
Julia
const nesttext = """
|
|
RosettaCode
|
|
rocks
|
|
code
|
|
comparison
|
|
wiki
|
|
mocks
|
|
trolling
|
|
"""
|
|
|
|
function nesttoindent(txt)
|
|
ret = ""
|
|
windent = gcd(length.([x.match for x in eachmatch(r"\s+", txt)]) .- 1)
|
|
for lin in split(txt, "\n")
|
|
ret *= isempty(lin) ? "\n" : isspace(lin[1]) ?
|
|
replace(lin, r"\s+" => (s) -> "$(length(s)÷windent) ") * "\n" :
|
|
"0 " * lin * "\n"
|
|
end
|
|
return ret, " "^windent
|
|
end
|
|
|
|
function indenttonest(txt, indenttext)
|
|
ret = ""
|
|
for lin in filter(x -> length(x) > 1, split(txt, "\n"))
|
|
(num, name) = split(lin, r"\s+", limit=2)
|
|
indentnum = parse(Int, num)
|
|
ret *= indentnum == 0 ? name * "\n" : indenttext^indentnum * name * "\n"
|
|
end
|
|
return ret
|
|
end
|
|
|
|
indenttext, itext = nesttoindent(nesttext)
|
|
restorednesttext = indenttonest(indenttext, itext)
|
|
|
|
println("Original:\n", nesttext, "\n")
|
|
println("Indent form:\n", indenttext, "\n")
|
|
println("Back to nest form:\n", restorednesttext, "\n")
|
|
println("original == restored: ", strip(nesttext) == strip(restorednesttext))
|