50 lines
1.3 KiB
Plaintext
50 lines
1.3 KiB
Plaintext
fcn nestToIndent(nestTree){
|
|
fcn(out,node,level){
|
|
out.append(List(level,node[0])); // (n,name) or ("..",name)
|
|
if(node.len()>1){ // (name children), (name, (tree))
|
|
level+=1;
|
|
foreach child in (node[1,*]){
|
|
if(String.isType(child)) out.append(List(level,child));
|
|
else self.fcn(out,child,level)
|
|
}
|
|
}
|
|
out
|
|
}(List(),nestTree,0)
|
|
}
|
|
fcn nestToString(nestTree,dot="."){
|
|
fcn(out,dot,node,level){
|
|
out.writeln(dot*level,node[0]); // (name)
|
|
if(node.len()>1){ // (name children), (name, (tree))
|
|
level+=1;
|
|
foreach child in (node[1,*]){
|
|
if(String.isType(child)) out.writeln(dot*level,child);
|
|
else self.fcn(out,dot,child,level)
|
|
}
|
|
}
|
|
out
|
|
}(Data(),dot,nestTree,0).text
|
|
}
|
|
|
|
fcn indentToNest(iTree,depth=0,nTree=List()){
|
|
while(iTree){ // (n,name)
|
|
d, name := iTree[0];
|
|
if(d==depth){
|
|
nTree.append(name);
|
|
iTree.pop(0);
|
|
}
|
|
else if(d>depth){ // assume can't skip levels down
|
|
if(nTree.len()>1 and not List.isType((nm:=nTree[-1]))){
|
|
nTree[-1]=(children:=List(nm));
|
|
indentToNest(iTree,d,children);
|
|
}else{
|
|
nTree.append(children:=List(name));
|
|
iTree.pop(0);
|
|
indentToNest(iTree,d+1,children);
|
|
}
|
|
}
|
|
else break; // d<depth
|
|
}
|
|
return(nTree)
|
|
}
|
|
fcn indentToString(indentTree){ indentTree.apply("concat"," ").concat("\n") }
|