Ignore:
Timestamp:
May 25, 2013, 11:53:39 PM (12 years ago)
Author:
s10k
Message:

XmlTools: v0.9

Location:
xmlTools/trunk/posUpdate
Files:
12 added
5 edited

Legend:

Unmodified
Added
Removed
  • xmlTools/trunk/posUpdate/ParametersParser.cs

    r867 r874  
    142142        }
    143143
    144         [Verb]
     144        [Verb(Description = "Displays current XmlTools version.")]
    145145        public static void version()
    146146        {
    147             Console.WriteLine("xmlTools v" + Program.toolsVersion);
     147            Console.WriteLine("xmlTools v" + Program.XmlToolsVersion);
    148148            Console.WriteLine("\nWritten by s10k");
     149        }
     150
     151        [Verb(Description = "Displays extra informations about XmlTools.")]
     152        public static void about()
     153        {
     154            version();
     155            Console.WriteLine();
     156            Console.WriteLine("For extra XmlTools support check it page at: http://wiki.oni2.net/XmlTools");
     157            Console.WriteLine();
     158            Console.WriteLine("This program uses the following free libraries: ");
     159            Console.WriteLine("-CLAP: for parameter parsing. (http://adrianaisemberg.github.io/CLAP/)");
     160            Console.WriteLine("-IronJS: for custom javascript code execution. (https://github.com/fholm/IronJS)");
     161            Console.WriteLine();
     162            Console.WriteLine("A big thanks to all the oni.bungie.org community!");
    149163        }
    150164
  • xmlTools/trunk/posUpdate/Program.cs

    r868 r874  
    11using System;
    22using System.Collections.Generic;
     3using System.IO;
    34using System.Text;
    4 using System.Xml;
    5 using System.IO;
    6 using System.Globalization;
    7 using System.Text.RegularExpressions;
    85
    96namespace xmlTools
     
    118    class Program
    129    {
    13         public static readonly string toolsVersion = "0.8g";
     10        public const string XmlToolsVersion = "0.9"; // const variable are by default static
    1411        private static appErrors lastError = appErrors.NO_ERROR;
    1512
     
    3229            PATCH_ELEMENT_NOT_FOUND = 203,
    3330            PATCH_ADDTO_ERROR_PARSING_XML = 204,
    34             PATCH_COMMAND_NOT_FOUND = 205
     31            PATCH_COMMAND_NOT_FOUND = 205,
     32            PATCH_CODE_PROCESS_ERROR=206,
     33            PATCH_CODE_NOT_FOUND=207,
     34            PATCH_CODE_PARSE_XML_OUTPUT_ERROR=208,
    3535        }
    3636
     
    4949        public static int Main(string[] args)
    5050        {
     51
    5152            try
    5253            {
  • xmlTools/trunk/posUpdate/XmlPatch.cs

    r868 r874  
    22using System.Collections.Generic;
    33using System.Diagnostics;
     4using System.IO;
    45using System.Text;
    56using System.Xml;
     7using IronJS;
    68
    79namespace xmlTools
     
    1517        String forceFiles = "";
    1618        bool globalNoBackups = false;
     19        IronJS.Hosting.CSharp.Context jsEngine = null; // initialize only when necessary
    1720
    1821        public XmlPatch(String file, bool noBackups)
     
    5053                    while ((line = file.ReadLine()) != "</xml>")
    5154                    {
    52                         xmlToInject += line + "\n"; //get all the xml that will be injected
     55                        xmlToInject += line + System.Environment.NewLine; //get all the xml that will be injected
    5356                    }
    5457                    if (!addOperation(operation, xmlToInject))
     
    7174                    {
    7275                        Program.printAppError(Program.appErrors.PATCH_COMMAND_PROCESS_ERROR, "Error while performing command operation in patch file. Aborting...");
     76                        return false;
     77                    }
     78                }
     79                else if (line.StartsWith("@CUSTOMCODE "))
     80                {
     81                    string operation = line;
     82                    string jsCode = "";
     83
     84                    file.ReadLine(); //ignore <xml> start header
     85                    while ((line = file.ReadLine()) != "</code>")
     86                    {
     87                        jsCode += line + System.Environment.NewLine; //get all the xml that will be injected
     88                    }
     89                    if (!executeCode(operation, jsCode))
     90                    {
     91                        Program.printAppError(Program.appErrors.PATCH_CODE_PROCESS_ERROR, "Error while performing code operation in patch file. Aborting...");
    7392                        return false;
    7493                    }
     
    91110            //@ADDTO File "example.xml" ParentElement "Animation" Element "Lookup"
    92111
    93             string File = "", ParentElement = "", Element = "";
     112            string FileParam = "", ParentElementParam = "", ElementParam = "";
    94113
    95114            //---------------------------------------------------Parse Operation command (start)
     
    98117                if (String.IsNullOrEmpty(forceFiles))
    99118                {
    100                     File = getPatchParameter(operation, "File");
     119                    FileParam = getPatchParameter(operation, "File");
    101120                }
    102121                else
    103122                {
    104                     File = forceFiles;
    105                 }
    106 
    107                 ParentElement = getPatchParameter(operation, "ParentElement"); //Get the ParentElement
    108 
    109                 Element = getPatchParameter(operation, "Element"); //Get the Element
     123                    FileParam = forceFiles;
     124                }
     125
     126                ParentElementParam = getPatchParameter(operation, "ParentElement"); //Get the ParentElement
     127
     128                ElementParam = getPatchParameter(operation, "Element"); //Get the Element
    110129            }
    111130            catch (Exception e)
     
    115134            }
    116135
    117             if (String.IsNullOrEmpty(Element))
     136            if (String.IsNullOrEmpty(ElementParam))
    118137            {
    119138                return false;
     
    122141            //---------------------------------------------------Parse Operation command (end)
    123142            List<String> filesToProcess = new List<String>();
    124             if (String.IsNullOrEmpty(File))
     143            if (String.IsNullOrEmpty(FileParam))
    125144            {
    126145                filesToProcess = Util.getAllXmlFiles(); //no file specified, use all xml files found in same folder
    127146            }
    128             else if (Util.containsWildcard(File))
    129             {
    130                 filesToProcess = Util.getXmlFilesWildcard(File);
     147            else if (Util.containsWildcard(FileParam))
     148            {
     149                filesToProcess = Util.getXmlFilesWildcard(FileParam);
    131150            }
    132151            else
    133152            {
    134                 filesToProcess.Add(File);
     153                filesToProcess.Add(FileParam);
    135154            }
    136155
     
    147166
    148167                List<XmlNode> myElements = new List<XmlNode>();
    149                 Util.getAllSpecificElements(xdoc.DocumentElement, ref myElements, Element, ParentElement); //Returns all after "Oni" element
     168                Util.getAllSpecificElements(xdoc.DocumentElement, ref myElements, ElementParam, ParentElementParam); //Returns all after "Oni" element
    150169
    151170                if (myElements.Count == 0)
     
    183202            //@REMOVE File "example.xml" ParentElement "Particles" Element "Particle"
    184203
    185             string File = "", ParentElement = "", Element = "";
     204            string FileParam = "", ParentElementParam = "", ElementParam = "";
    186205
    187206            //---------------------------------------------------Parse Operation command (start)
     
    190209                if (String.IsNullOrEmpty(forceFiles))
    191210                {
    192                     File = getPatchParameter(operation, "File");
     211                    FileParam = getPatchParameter(operation, "File");
    193212                }
    194213                else
    195214                {
    196                     File = forceFiles;
    197                 }
    198 
    199                 ParentElement = getPatchParameter(operation, "ParentElement"); //Get the ParentElement
    200 
    201                 Element = getPatchParameter(operation, "Element"); //Get the Element
     215                    FileParam = forceFiles;
     216                }
     217
     218                ParentElementParam = getPatchParameter(operation, "ParentElement"); //Get the ParentElement
     219
     220                ElementParam = getPatchParameter(operation, "Element"); //Get the Element
    202221            }
    203222            catch (Exception e)
     
    207226            }
    208227
    209             if (String.IsNullOrEmpty(Element))
     228            if (String.IsNullOrEmpty(ElementParam))
    210229            {
    211230                return false;
     
    215234
    216235            List<String> filesToProcess = new List<String>();
    217             if (String.IsNullOrEmpty(File))
     236            if (String.IsNullOrEmpty(FileParam))
    218237            {
    219238                filesToProcess = Util.getAllXmlFiles(); //no file specified, use all xml files found in same folder
    220239            }
    221             else if (Util.containsWildcard(File))
    222             {
    223                 filesToProcess = Util.getXmlFilesWildcard(File);
     240            else if (Util.containsWildcard(FileParam))
     241            {
     242                filesToProcess = Util.getXmlFilesWildcard(FileParam);
    224243            }
    225244            else
    226245            {
    227                 filesToProcess.Add(File);
     246                filesToProcess.Add(FileParam);
    228247            }
    229248
     
    242261
    243262                List<XmlNode> myElements = new List<XmlNode>();
    244                 Util.getAllSpecificElements(xdoc.DocumentElement, ref myElements, Element, ParentElement); //Returns all after "Oni" element
     263                Util.getAllSpecificElements(xdoc.DocumentElement, ref myElements, ElementParam, ParentElementParam); //Returns all after "Oni" element
    245264
    246265                if (myElements.Count == 0)
     
    262281
    263282        /// <summary>
    264         ///
     283        ///  Executes a command for xmlTools
    265284        /// </summary>
    266285        /// <param name="command"></param>
     
    285304
    286305                    // Filename already exists?
    287                     if (Util.ContainsIgnoreCase(command,"filename:"))
     306                    if (Util.ContainsIgnoreCase(command, "filename:"))
    288307                    {
    289308                        paramType = "filename:";
     
    296315                    else
    297316                    {
    298                         command = command.Insert(command.Length," -filename:" + this.forceFiles);
     317                        command = command.Insert(command.Length, " -filename:" + this.forceFiles);
    299318                    }
    300319
     
    306325                        {
    307326                            endIdx = command.IndexOf("\n", startIdx); // or with endline
    308                             if(endIdx==-1){ // Filename parameters is the last one in the file (file ends with this parameter)
    309                                 endIdx=command.Length-1;
     327                            if (endIdx == -1)
     328                            { // Filename parameters is the last one in the file (file ends with this parameter)
     329                                endIdx = command.Length - 1;
    310330                            }
    311331                        }
     
    316336                }
    317337
    318                 if (this.globalNoBackups && !Util.ContainsIgnoreCase(command,"nobackups")) // add noBackup flag if provided as global parameter
     338                if (this.globalNoBackups && !Util.ContainsIgnoreCase(command, "nobackups")) // add noBackup flag if provided as global parameter
    319339                {
    320340                    command = command.Insert(command.Length, " -nobackups");
     
    328348                return false;
    329349            }
     350
     351            return true;
     352        }
     353
     354        /// <summary>
     355        /// Executes custom Javascript code over the xml file specified. Uses .NET JINT library.
     356        /// </summary>
     357        /// <param name="command"></param>
     358        /// <returns></returns>
     359        private bool executeCode(string operation, string jsCode)
     360        {
     361            string FileParam = "";
     362
     363            //---------------------------------------------------Parse Operation command (start)
     364            try
     365            {
     366                if (String.IsNullOrEmpty(forceFiles))
     367                {
     368                    FileParam = getPatchParameter(operation, "File");
     369                }
     370                else
     371                {
     372                    FileParam = forceFiles;
     373                }
     374
     375            }
     376            catch (Exception e)
     377            {
     378                Program.printAppError(Program.appErrors.PATCH_CODE_PROCESS_ERROR, "Error parsing codeOperation in Patch file.\n" + e.ToString());
     379                return false;
     380            }
     381
     382            //---------------------------------------------------Parse Operation command (end)
     383            List<String> filesToProcess = new List<String>();
     384            if (String.IsNullOrEmpty(FileParam))
     385            {
     386                filesToProcess = Util.getAllXmlFiles(); //no file specified, use all xml files found in same folder
     387            }
     388            else if (Util.containsWildcard(FileParam))
     389            {
     390                filesToProcess = Util.getXmlFilesWildcard(FileParam);
     391            }
     392            else
     393            {
     394                filesToProcess.Add(FileParam);
     395            }
     396
     397            //---------------------------------------------------JS Code Proccess (start)
     398            foreach (String currXMLFile in filesToProcess)
     399            {
     400                if (!this.globalNoBackups && !Util.ContainsIgnoreCase(operation, "NoBackups")) // only skip backup if specified via global parameter or in patch file
     401                {
     402                    Util.backupFile(currXMLFile);
     403                }
     404
     405                string xmlFileContent = File.ReadAllText(currXMLFile);
     406
     407                // Initialize Jint Engine
     408                if (jsEngine == null)
     409                {
     410                    jsEngine = new IronJS.Hosting.CSharp.Context();
     411
     412                    // Load XML libraries
     413                    jsEngine.Execute(xmlTools.Properties.Resources.tinyxmlsax);
     414                    jsEngine.Execute(xmlTools.Properties.Resources.tinyxmlw3cdom);
     415                }
     416
     417                // Construct code to execute
     418                StringBuilder sourceCode = new StringBuilder();
     419
     420                // give user the xml we needs to edit...
     421                sourceCode.Append("var $xmlData='").Append(xmlFileContent.Replace(System.Environment.NewLine, " \\" + System.Environment.NewLine)).Append("';").AppendLine(); // replace is for multine string in javascript (http://stackoverflow.com/questions/805107/creating-multiline-strings-in-javascript)
     422                // append the user js code...
     423                sourceCode.Append(jsCode).AppendLine();
     424                // return to .NET the new xml data
     425                sourceCode.Append("$xmlData;");
     426
     427                try
     428                {
     429                    xmlFileContent = jsEngine.Execute(sourceCode.ToString()).ToString();
     430                }
     431                catch (Exception e)
     432                {
     433                    Program.printAppError(Program.appErrors.PATCH_CODE_PROCESS_ERROR, "Error parsing code in customCodeOperation in Patch file.\n" + e.ToString());
     434                    return false;
     435                }
     436
     437                // Let's see if the returned result is valid xml...
     438                try
     439                {
     440                    XmlDocument xmlDoc = new XmlDocument();
     441
     442                    xmlDoc.LoadXml(xmlFileContent);
     443
     444                    xmlDoc.Save(currXMLFile); //saving the new xml with this method will auto ident it.
     445
     446                }
     447                catch (Exception e)
     448                {
     449                    Program.printAppError(Program.appErrors.PATCH_CODE_PARSE_XML_OUTPUT_ERROR, "Error parsing result xml to customCodeOperation in Patch file.\n" + e.ToString());
     450                    return false;
     451                }
     452            }
     453            //---------------------------------------------------JS Code Proccess (end)
    330454
    331455            return true;
  • xmlTools/trunk/posUpdate/bin/Release/merge.bat

    r710 r874  
    1 ilmerge /log:log.txt  /out:xmlTools.exe posUpdate.exe CLAP.dll
     1ilmerge /log:log.txt  /out:xmlTools.exe posUpdate.exe CLAP.dll IronJS.dll FSharp.Core.dll Microsoft.Scripting.Core.dll
    22pause
  • xmlTools/trunk/posUpdate/xmlTools.csproj

    r710 r874  
    1111    <RootNamespace>xmlTools</RootNamespace>
    1212    <AssemblyName>posUpdate</AssemblyName>
    13     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     13    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    1414    <TargetFrameworkProfile>
    1515    </TargetFrameworkProfile>
    1616    <FileAlignment>512</FileAlignment>
     17    <IsWebBootstrapper>false</IsWebBootstrapper>
    1718    <PublishUrl>publish\</PublishUrl>
    1819    <Install>true</Install>
     
    2728    <ApplicationRevision>0</ApplicationRevision>
    2829    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
    29     <IsWebBootstrapper>false</IsWebBootstrapper>
    3030    <UseApplicationTrust>false</UseApplicationTrust>
    3131    <BootstrapperEnabled>true</BootstrapperEnabled>
     
    5454      <HintPath>..\..\..\Libraries\net20\CLAP.dll</HintPath>
    5555    </Reference>
     56    <Reference Include="FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
     57      <SpecificVersion>False</SpecificVersion>
     58      <HintPath>bin\Debug\FSharp.Core.dll</HintPath>
     59    </Reference>
     60    <Reference Include="IronJS, Version=0.2.0.0, Culture=neutral, processorArchitecture=x86">
     61      <SpecificVersion>False</SpecificVersion>
     62      <HintPath>bin\Debug\IronJS.dll</HintPath>
     63    </Reference>
     64    <Reference Include="Microsoft.Scripting.Core, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
     65      <SpecificVersion>False</SpecificVersion>
     66      <HintPath>bin\Debug\Microsoft.Scripting.Core.dll</HintPath>
     67    </Reference>
     68    <Reference Include="Microsoft.Scripting.ExtensionAttribute">
     69      <HintPath>..\..\..\..\..\..\..\dev_libs\IronJS\Microsoft.Scripting.ExtensionAttribute.dll</HintPath>
     70    </Reference>
    5671    <Reference Include="System" />
    5772    <Reference Include="System.Data" />
     
    6075  <ItemGroup>
    6176    <Compile Include="ParametersParser.cs" />
     77    <Compile Include="Properties\Resources.Designer.cs">
     78      <AutoGen>True</AutoGen>
     79      <DesignTime>True</DesignTime>
     80      <DependentUpon>Resources.resx</DependentUpon>
     81    </Compile>
    6282    <Compile Include="Util.cs" />
    6383    <Compile Include="XmlPatch.cs" />
     
    84104    </BootstrapperPackage>
    85105  </ItemGroup>
     106  <ItemGroup>
     107    <EmbeddedResource Include="Properties\Resources.resx">
     108      <Generator>ResXFileCodeGenerator</Generator>
     109      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
     110    </EmbeddedResource>
     111  </ItemGroup>
     112  <ItemGroup>
     113    <None Include="Resources\TextFile1.txt" />
     114  </ItemGroup>
     115  <ItemGroup>
     116    <None Include="Resources\xmlsax.txt" />
     117  </ItemGroup>
     118  <ItemGroup>
     119    <None Include="Resources\xmlsax.js.txt" />
     120  </ItemGroup>
     121  <ItemGroup>
     122    <WCFMetadata Include="Service References\" />
     123  </ItemGroup>
    86124  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    87125  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Note: See TracChangeset for help on using the changeset viewer.