diff --git a/src/main.rs b/src/main.rs index d29efd8..31aa981 100644 --- a/src/main.rs +++ b/src/main.rs @@ -366,7 +366,7 @@ enum TrimStackInstruction{ } enum WriteStackInstruction<'a>{ - Node(&'a TreeNode), + Node(&'a TreeNode,u32),//(Node,NameTally) PushFolder(String), PopFolder, Destroy(Ref), @@ -387,8 +387,8 @@ fn sanitize<'a>(s:&'a str)->std::borrow::Cow<'a,str>{ lazy_regex::regex!(r"[^a-zA-Z0-9._-]").replace_all(s,"_") } -fn write_item(dom:&rbx_dom_weak::WeakDom,mut file:std::path::PathBuf,node:&TreeNode)->AResult<()>{ - file.push(sanitize(node.name.as_str()).as_ref()); +fn write_item(dom:&rbx_dom_weak::WeakDom,mut file:std::path::PathBuf,node:&TreeNode,node_name_override:&str)->AResult<()>{ + file.push(sanitize(node_name_override).as_ref()); match node.class{ Class::Folder=>(), Class::ModuleScript|Class::LocalScript|Class::Script=>{ @@ -509,15 +509,16 @@ fn decompile(input_file:std::path::PathBuf,output_folder:std::path::PathBuf)->AR //generate folders, models, and scripts //delete models and scripts from dom - { + + let mut name_tally=std::collections::HashMap::::new(); let mut folder=output_folder.clone(); - let mut stack=vec![WriteStackInstruction::Node(tree_refs.get(&dom.root_ref()).unwrap())]; + let mut stack=vec![WriteStackInstruction::Node(tree_refs.get(&dom.root_ref()).unwrap(),0)]; while let Some(instruction)=stack.pop(){ match instruction{ WriteStackInstruction::PushFolder(component)=>folder.push(component), WriteStackInstruction::PopFolder=>assert!(folder.pop(),"weirdness"), WriteStackInstruction::Destroy(referent)=>dom.destroy(referent), - WriteStackInstruction::Node(node)=>{ + WriteStackInstruction::Node(node,name_count)=>{ //properties.json to override class or other simple properties let mut properties=PropertiesOverride::default(); let has_children=node.children.len()!=0; @@ -533,10 +534,15 @@ fn decompile(input_file:std::path::PathBuf,output_folder:std::path::PathBuf)->AR Class::Script=>properties.ClassName=Some("Script".to_string()), Class::Model=>(), } + let name_override=if 0AR std::fs::write(file,serde_json::to_string(&properties)?)? } //write item in subfolder - write_item(&dom,subfolder,node)?; + write_item(&dom,subfolder,node,name_override.as_str())?; }else{ //write item - write_item(&dom,folder.clone(),node)?; + write_item(&dom,folder.clone(),node,name_override.as_str())?; } //queue item to be deleted from dom after child objects are handled (stack is popped from the back) match node.class{ @@ -559,17 +565,19 @@ fn decompile(input_file:std::path::PathBuf,output_folder:std::path::PathBuf)->AR } if has_children{ stack.push(WriteStackInstruction::PopFolder); + name_tally.clear(); for referent in &node.children{ if let Some(c)=tree_refs.get(referent){ - stack.push(WriteStackInstruction::Node(c)); + let v=name_tally.entry(c.name.clone()).and_modify(|v|*v+=1).or_default(); + stack.push(WriteStackInstruction::Node(c,*v)); } } - stack.push(WriteStackInstruction::PushFolder(sanitize(node.name.as_str()).to_string())); + stack.push(WriteStackInstruction::PushFolder(sanitize(name_override.as_str()).to_string())); } }, } } - } + //write what remains in template.rbxlx { let mut file=output_folder.clone();