1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
using System.Reflection; |
4 |
using System.Text; |
5 |
using CLAP; |
6 |
using CLAP.Interception; |
7 |
using CLAP.Validation; |
8 |
|
9 |
namespace xmlTools |
10 |
{ |
11 |
// Define a class to receive parsed values |
12 |
class ParametersParser |
13 |
{ |
14 |
private static string globalFileName=""; |
15 |
private static string globalElement=""; |
16 |
private static string globalParentElement=""; |
17 |
|
18 |
[Verb] |
19 |
public static void addValue( |
20 |
[Parameter(Required = true, Description = "Values to add to Element. Separated multiple by spaces.")] string value |
21 |
) |
22 |
{ |
23 |
initialChecks(); |
24 |
XmlTools myTools = new XmlTools(globalElement, globalParentElement); |
25 |
List<string> filesToProcess = getFilesToProcess(globalFileName); |
26 |
foreach (string currentFile in filesToProcess) |
27 |
{ |
28 |
myTools.addValues(currentFile, value); |
29 |
} |
30 |
printProcessedMessage(filesToProcess.Count, MethodBase.GetCurrentMethod().Name); |
31 |
} |
32 |
|
33 |
[Verb] |
34 |
public static void removeValue( |
35 |
[Parameter(Required = true, Description = "Values to remove of Element. Separated multiple by spaces.")] string value |
36 |
) |
37 |
{ |
38 |
initialChecks(); |
39 |
XmlTools myTools = new XmlTools(globalElement, globalParentElement); |
40 |
List<string> filesToProcess = getFilesToProcess(globalFileName); |
41 |
foreach (string currentFile in filesToProcess) |
42 |
{ |
43 |
myTools.removeValues(currentFile, value); |
44 |
} |
45 |
printProcessedMessage(filesToProcess.Count, MethodBase.GetCurrentMethod().Name); |
46 |
} |
47 |
|
48 |
[Verb] |
49 |
public static void updateChainValues( |
50 |
[Parameter(Required = true, Description = "The new first value of the chain. All the chain will be updated based on this value")] string newValue, |
51 |
[Parameter(Description = "Value which have some kind of relation with -newVal \n Together with -newVal updates all the values based on the" + |
52 |
"-newVal and another position specified on -valRelation parameter (basically starts with (newVal-valRelation) ) Is especially useful when" + |
53 |
"updating multiple related chains (on different files), like multiple objects from one position to another. Don't use with -filename, because" + |
54 |
"it will only update one file. \nExample: xmlTools.exe -newVal \"1 1 1\" -valRelation \"4 4 4\" -valElement Translation -valParentElement" + |
55 |
"OBANKeyFrame")] string valRelation, |
56 |
[Parameter(Description = "Only update specific positions. Positions starts with 0, separted multiple positions with space. Example: valPositions=0 1 4")] [MoreThan(-1)] string valPositions |
57 |
) |
58 |
{ |
59 |
initialChecks(); |
60 |
XmlTools myTools = new XmlTools(globalElement, globalParentElement); |
61 |
List<string> filesToProcess = getFilesToProcess(globalFileName); |
62 |
foreach (string currentFile in filesToProcess) |
63 |
{ |
64 |
myTools.changeValue(currentFile, newValue, valRelation, valPositions); |
65 |
} |
66 |
printProcessedMessage(filesToProcess.Count, MethodBase.GetCurrentMethod().Name); |
67 |
} |
68 |
|
69 |
[Verb(Description = "Inverts a chain (like an OBAN animation). Example: xmlTools.exe -filename OBANheli_rotorblades08.xml -invert -valElement Translation -valParentElement OBANKeyFrame (inverts translation chain)")] |
70 |
public static void Invert() |
71 |
{ |
72 |
initialChecks(); |
73 |
XmlTools myTools = new XmlTools(globalElement, globalParentElement); |
74 |
List<string> filesToProcess = getFilesToProcess(globalFileName); |
75 |
foreach (string currentFile in filesToProcess) |
76 |
{ |
77 |
myTools.invert(currentFile); //Inverting the element order |
78 |
} |
79 |
printProcessedMessage(filesToProcess.Count, MethodBase.GetCurrentMethod().Name); |
80 |
} |
81 |
|
82 |
[Verb] |
83 |
public static void replaceValue( |
84 |
[Parameter(Required = true, Description = "Old value to replace in Element.")] string oldValue, |
85 |
[Parameter(Required = true, Description = "New value to replace in Element.")] string newValue |
86 |
) |
87 |
{ |
88 |
XmlTools myTools = new XmlTools(globalElement, globalParentElement); |
89 |
List<string> filesToProcess = getFilesToProcess(globalFileName); |
90 |
foreach (string currentFile in filesToProcess) |
91 |
{ |
92 |
myTools.replaceValue(currentFile, oldValue, newValue); |
93 |
} |
94 |
printProcessedMessage(filesToProcess.Count, MethodBase.GetCurrentMethod().Name); |
95 |
} |
96 |
|
97 |
[Verb] |
98 |
public static void replaceAll( |
99 |
[Parameter(Required = true, Description = "Value to replace in Element. Replace all values of a element by another value.")] string value, |
100 |
[Parameter(Description = "Only replace specific positions. Positions starts with 0, separted multiple positions with space. Example: valPositions=0 1 4")] [MoreThan(-1)] string valPositions |
101 |
) |
102 |
{ |
103 |
initialChecks(); |
104 |
XmlTools myTools = new XmlTools(globalElement, globalParentElement); |
105 |
List<string> filesToProcess = getFilesToProcess(globalFileName); |
106 |
foreach (string currentFile in filesToProcess) |
107 |
{ |
108 |
if (valPositions != null) |
109 |
{ |
110 |
myTools.replaceAll(currentFile, value, valPositions); |
111 |
} |
112 |
else |
113 |
{ |
114 |
myTools.replaceAll(currentFile, value); |
115 |
} |
116 |
} |
117 |
printProcessedMessage(filesToProcess.Count, MethodBase.GetCurrentMethod().Name); |
118 |
} |
119 |
|
120 |
/// <summary> |
121 |
/// Patch in files can be used with wildcard or empty filename instead |
122 |
/// </summary> |
123 |
/// <param name="filename"></param> |
124 |
[Verb] |
125 |
public static void patchFile( |
126 |
[Parameter(Description = "Force the specified patch to run in specified files")] string forceInFiles |
127 |
) |
128 |
{ |
129 |
XmlPatch myPatch; |
130 |
|
131 |
if (forceInFiles != "") |
132 |
{ |
133 |
myPatch = new XmlPatch(globalFileName, forceInFiles); |
134 |
} |
135 |
else |
136 |
{ |
137 |
myPatch = new XmlPatch(globalFileName); |
138 |
} |
139 |
|
140 |
myPatch.startPatch(); |
141 |
} |
142 |
|
143 |
[Verb] |
144 |
public static void version() |
145 |
{ |
146 |
Console.WriteLine("xmlTools v" + Program.toolsVersion); |
147 |
Console.WriteLine("\nWritten by s10k"); |
148 |
} |
149 |
|
150 |
// Global Parameters |
151 |
[Global] |
152 |
public static void fileName( |
153 |
[Parameter(Required = true, Description = "Filename to apply the operations (with patchFile specifies the patch filename). Wildcards accepted for multiple files. No filename = search all .xml files in current path.")] string filename // xml filename. Wildcards accepted. |
154 |
) |
155 |
{ |
156 |
globalFileName = filename; |
157 |
} |
158 |
|
159 |
[Global] |
160 |
public static void element( |
161 |
[Parameter(Required = true, Description = "Element to apply the operation.")] string element |
162 |
) |
163 |
{ |
164 |
globalElement = element; |
165 |
} |
166 |
|
167 |
[Global] |
168 |
public static void parElement( |
169 |
[Parameter(Required = true, Description = "Parent of the Element to apply the operation.")] string parentElement |
170 |
) |
171 |
{ |
172 |
globalParentElement = parentElement; |
173 |
} |
174 |
|
175 |
//[PreVerbExecution] |
176 |
//private static void InitialChecks(PreVerbExecutionContext context) |
177 |
//{ |
178 |
// bool elementFound = false; |
179 |
// foreach(ParameterAndValue param in context.Parameters){ |
180 |
// if (param.Parameter.Names[0] == "element") |
181 |
// { |
182 |
// if(!String.IsNullOrEmpty(param.Value.ToString().Trim())){ |
183 |
// elementFound = true; |
184 |
// } |
185 |
// break; |
186 |
// } |
187 |
// } |
188 |
// if (!elementFound) |
189 |
// { |
190 |
// Console.Error.WriteLine("You must specify the element parameter where the operations will be processed."); |
191 |
// Console.ReadLine(); |
192 |
// System.Environment.Exit(1); |
193 |
// } |
194 |
//} |
195 |
|
196 |
// Private functions |
197 |
private static List<String> getFilesToProcess(String filename) |
198 |
{ |
199 |
List<String> filesToProccess = new List<String>(); |
200 |
|
201 |
if (filename == "") // No filename? Process everything xml file found. |
202 |
{ |
203 |
List<string> allXmlFiles = Util.getAllXmlFiles(); |
204 |
foreach (String file in allXmlFiles) |
205 |
{ |
206 |
filesToProccess.Add(file); |
207 |
} |
208 |
} |
209 |
else if (Util.containsWildcard(filename)) // Contains wildcards? Get all files that match it. |
210 |
{ |
211 |
List<string> matchingWildcardFiles = Util.getXmlFilesWildcard(filename); |
212 |
foreach (String file in matchingWildcardFiles) |
213 |
{ |
214 |
filesToProccess.Add(file); |
215 |
} |
216 |
} |
217 |
else // Add the file specified |
218 |
{ |
219 |
if (System.IO.File.Exists(filename)) |
220 |
{ |
221 |
filesToProccess.Add(filename); |
222 |
} |
223 |
else |
224 |
{ |
225 |
Program.printAppError(Program.appErrors.FILE_NOT_FOUND, "The file specified: " + filename + " doesn't exists.", true); |
226 |
} |
227 |
} |
228 |
return filesToProccess; |
229 |
} |
230 |
|
231 |
private static void printProcessedMessage(int count, string methodName) |
232 |
{ |
233 |
Console.WriteLine(count + " files processed with " + methodName + " command."); |
234 |
} |
235 |
|
236 |
private static void initialChecks() |
237 |
{ |
238 |
if (String.IsNullOrEmpty(globalElement.Trim())) |
239 |
{ |
240 |
Program.printAppError(Program.appErrors.ELEMENT_NOT_FOUND, "You must specify the element parameter where the operations will be processed.", true); |
241 |
} |
242 |
|
243 |
} |
244 |
} |
245 |
} |