private static void ViewVmtObjectContent(VmtTemplate VmtObject) { Console.Clear(); if (VmtObject.IsBrokenFile) { Console.WriteLine("File is broken!"); Console.WriteLine("\n Press any button to continue..."); Console.ReadLine(); } else { Console.WriteLine($" \"{VmtObject.MaterialType}\""); Console.WriteLine(" {"); foreach (var Field in VmtObject.Values) { Console.WriteLine($" \"{Field.Key}\" \"{Field.Value}\""); } Console.WriteLine(" }"); Console.WriteLine("\n Press any button to continue..."); Console.ReadLine(); } }
private static string VmtTemplateToFileContent(VmtTemplate VmtObject) { string NewFileContent = $"\"{VmtObject.MaterialType}\"\n"; NewFileContent += "{\n"; foreach (var Field in VmtObject.Values) { NewFileContent += $" \"{Field.Key}\" \"{Field.Value}\"\n"; } NewFileContent += "}\n"; NewFileContent = NewFileContent.Replace("\n", Environment.NewLine); return(NewFileContent); }
private static void VmtFileEditor() { Console.WriteLine(" Write to vmt file path:"); Console.Write("> "); string VmtFilePath = Console.ReadLine(); VmtTemplate VmtObject = VmtParser.ParseVmtFile(VmtFilePath); if (VmtObject.IsBrokenFile) { Console.WriteLine("File is broken!"); Console.WriteLine("\n Press any button to continue..."); Console.ReadLine(); return; } bool IsExit = false; while (!IsExit) { Console.Clear(); Console.WriteLine(" 1 - Add value"); Console.WriteLine(" 2 - Delete value"); Console.WriteLine(" 3 - View the contents of the future file"); Console.WriteLine(" 4 - Save"); Console.WriteLine(" 0 - Back"); Console.Write("> "); string command = Console.ReadLine(); if (long.TryParse(command, out _)) { switch (Convert.ToInt64(command)) { case 1: var Field = NewVmtField(); if (VmtObject.Values.Exists(x => x.Key == Field.Key)) { VmtTemplate.VmtField GetField = VmtObject.Values.Find(x => x.Key == Field.Key); GetField.Key = Field.Key; GetField.Value = Field.Value; } else { VmtObject.Values.Add(Field); } break; case 2: Console.WriteLine(" Write the key (Example: $basetexture):"); Console.Write("> "); string Key = Console.ReadLine(); RemoveValueOnVmtObject(ref VmtObject, Key); break; case 3: ViewVmtObjectContent(VmtObject); break; case 4: Console.WriteLine(" Write the output directory path:"); Console.Write("> "); string OutputDirectory = Console.ReadLine(); if (!Directory.Exists(OutputDirectory)) { Directory.CreateDirectory(OutputDirectory); } string FileName = Path.GetFileName(VmtObject.FilePath); using (var WriterFile = new StreamWriter(Path.Combine(OutputDirectory, FileName))) { string FileContent = VmtTemplateToFileContent(VmtObject); WriterFile.Write(FileContent); } break; case 0: IsExit = true; break; } } } }
private static void RemoveValueOnVmtObject(ref VmtTemplate VmtObject, string Key) { VmtObject.Values.RemoveAll(x => x.Key == Key); }
private static void VmtDirectoryEditor() { bool IsSearchSubDir = true; Console.WriteLine(" Write to directory path:"); Console.Write("> "); string VmtDirectoryPath = Console.ReadLine(); VmtDirectoryPath = VmtParser.NormalizePath(VmtDirectoryPath); Console.WriteLine(" Default: Yes. You can leave the field blank."); Console.WriteLine(" Search in sub-directories? [ Y/n ]:"); Console.Write("> "); string ReadSearchSubDir = Console.ReadLine(); if (ReadSearchSubDir.Trim().ToLower() == "n") { IsSearchSubDir = false; } string[] VmtFiles; if (IsSearchSubDir) { VmtFiles = Directory.GetFiles(VmtDirectoryPath, "*.vmt", SearchOption.AllDirectories); } else { VmtFiles = Directory.GetFiles(VmtDirectoryPath, "*.vmt", SearchOption.TopDirectoryOnly); } List <VmtTemplate> VmtObjectList = new List <VmtTemplate>(); foreach (string VmtFilePath in VmtFiles) { VmtTemplate VmtEmptyObject = VmtParser.ParseVmtFile(VmtFilePath); VmtEmptyObject.LocalDirectoryPath = VmtEmptyObject.DirectoryPath.Replace(VmtDirectoryPath, string.Empty); VmtObjectList.Add(VmtEmptyObject); } bool IsExit = false; while (!IsExit) { Console.Clear(); Console.WriteLine(" 1 - Add value"); Console.WriteLine(" 2 - Delete value"); Console.WriteLine(" 3 - Save"); Console.WriteLine(" 0 - Back"); Console.Write("> "); string command = Console.ReadLine(); if (long.TryParse(command, out _)) { switch (Convert.ToInt64(command)) { case 1: var Field = NewVmtField(); for (int i = 0; i < VmtObjectList.Count; i++) { VmtTemplate VmtObject = VmtObjectList[i]; if (VmtObject.IsBrokenFile) { continue; } try { if (VmtObject.Values.Exists(x => x.Key == Field.Key)) { VmtTemplate.VmtField GetField = VmtObject.Values.Find(x => x.Key == Field.Key); GetField.Key = Field.Key; GetField.Value = Field.Value; } else { VmtObject.Values.Add(Field); } } catch (Exception ex) { Console.WriteLine(" Modification error:\n" + ex); Console.WriteLine("-------------------------------"); Console.WriteLine(" File Content:"); VmtTemplateToFileContent(VmtObject); } } break; case 2: Console.WriteLine(" Write the key (Example: $basetexture):"); Console.Write("> "); string Key = Console.ReadLine(); for (int i = 0; i < VmtObjectList.Count; i++) { VmtTemplate VmtObject = VmtObjectList[i]; if (VmtObject.IsBrokenFile) { continue; } RemoveValueOnVmtObject(ref VmtObject, Key); VmtObjectList[i] = VmtObject; } break; case 3: Console.WriteLine(" Write the output directory path:"); Console.Write("> "); string OutputDirectory = Console.ReadLine(); if (!Directory.Exists(OutputDirectory)) { Directory.CreateDirectory(OutputDirectory); } foreach (VmtTemplate VmtObject in VmtObjectList) { string FileName = Path.GetFileName(VmtObject.FilePath); Console.WriteLine(VmtObject.LocalDirectoryPath + @"\" + Path.GetFileName(VmtObject.FilePath)); string OutputSubDirectory = Path.Combine(OutputDirectory, VmtObject.LocalDirectoryPath); if (!Directory.Exists(OutputSubDirectory)) { Directory.CreateDirectory(OutputSubDirectory); } if (VmtObject.IsBrokenFile) { string NewFilePath = Path.Combine(OutputSubDirectory, FileName); if (!File.Exists(NewFilePath)) { File.Copy(VmtObject.FilePath, NewFilePath); } Console.WriteLine("--------------------------------"); Console.WriteLine(" File is broken - " + VmtObject.FilePath); Console.WriteLine(" The file will be copied but not modified."); Console.WriteLine("--------------------------------"); } else { string OutputFIlePath = Path.Combine(OutputSubDirectory, FileName); using (var WriterFile = new StreamWriter(OutputFIlePath)) { string FileContent = VmtTemplateToFileContent(VmtObject); WriterFile.Write(FileContent); } } } Console.WriteLine("\n Press any button to continue..."); Console.ReadLine(); break; case 0: IsExit = true; break; } } } }
public static VmtTemplate ParseVmtFile(string FilePath) { string MaterialType = "VertexlitGeneric"; var MaterialFields = new List <VmtTemplate.VmtField>(); var VmtObject = new VmtTemplate(); VmtObject.IsBrokenFile = true; VmtObject.SetPath(FilePath); #if DEBUG Console.WriteLine("File - " + FilePath); #endif using (var ReadingFile = new StreamReader(FilePath)) { try { string FileContent = ReadingFile.ReadToEnd(); FileContent = Regex.Replace(FileContent.Replace("\t", " "), @"[ ]{2,}", " "); int StartSubContent = -1; int EndSubContent = -1; for (int i = 0; i < FileContent.Length; i++) { if (FileContent[i] == '{' && StartSubContent == -1) { StartSubContent = i; break; } } for (int i = FileContent.Length - 1; i >= 0; i--) { if (FileContent[i] == '}' && EndSubContent == -1) { EndSubContent = i; break; } } MaterialType = FileContent.Trim().Substring(0, StartSubContent - 1).Trim(); MaterialType = MaterialType.Replace("\"", string.Empty); string SubContent = FileContent.Substring(StartSubContent + 1, EndSubContent - StartSubContent - 1); string[] SubContentSplit = SubContent.Split(Environment.NewLine); for (int i = 0; i < SubContentSplit.Length; i++) { string Filed = SubContentSplit[i].Trim(); if (Filed.Replace(" ", "") != string.Empty) { Filed = Filed.Replace("\"", string.Empty); string[] KeyAndValue = Filed.Split(' ', 2); MaterialFields.Add(new VmtTemplate.VmtField(KeyAndValue[0], KeyAndValue[1])); } } /* #if DEBUG * Console.WriteLine("Type - " + MaterialType); #endif * #if DEBUG * foreach (var Filed in MaterialFields) * Console.WriteLine(Filed.Key + " - " + Filed.Value); #endif */ } catch { return(VmtObject); } } VmtObject.MaterialType = MaterialType; VmtObject.Values = MaterialFields; VmtObject.IsBrokenFile = false; return(VmtObject); }