コード例 #1
0
ファイル: MainWindow.xaml.cs プロジェクト: gheiler/h5c
        private void Compile(DeviceConfig config)
        {
            MoveProgressBar(0);
            string deviceName               = Enum.GetName(typeof(DeviceConfig.Devices), config.Device);
            string proyectFolder            = config.Origin;
            string destinyFolder            = config.Destiny;
            string modulesFolder            = System.IO.Path.Combine(proyectFolder, config.ModulesFolder);
            string defaultContainerFilePath = System.IO.Path.Combine(modulesFolder, config.DefaultContainerFileName);
            string defaultHeaderFilePath    = System.IO.Path.Combine(modulesFolder, "header", config.DefaultHeaderFileName);
            string defaultFooterFilePath    = System.IO.Path.Combine(modulesFolder, "footer", config.DefaultFooterFileName);

            if (Directory.Exists(proyectFolder))         // existe el proyecto
            {
                if (Directory.Exists(destinyFolder))     // existe la carpeta destino
                {
                    if (Directory.Exists(modulesFolder)) // existe la carpeta con los modulos
                    {
                        // chequeo que exista el archivo base en donde se compilaran los modulos
                        if (!File.Exists(defaultContainerFilePath))
                        {
                            txtResult.Text += String.Format("{0} - No existe el archivo: {1} en el directorio raiz del proyecto: {2} {3}", deviceName, defaultFileName, proyectFolder, Environment.NewLine);
                            return;
                        }

                        string defaultContainerFileContent = string.Empty;
                        string defaultHeaderFileContent    = string.Empty;
                        string defaultFooterFileContent    = string.Empty;

                        string defaultCompleteContent = defaultContainerFileContent = System.IO.File.ReadAllText(defaultContainerFilePath, Encoding.UTF8);

                        if (File.Exists(defaultHeaderFilePath))
                        {
                            defaultHeaderFileContent = System.IO.File.ReadAllText(defaultHeaderFilePath, Encoding.UTF8);
                            defaultCompleteContent   = ReplaceInstructionPlace(defaultCompleteContent, "header", defaultHeaderFileContent);
                        }
                        if (File.Exists(defaultFooterFilePath))
                        {
                            defaultFooterFileContent = System.IO.File.ReadAllText(defaultFooterFilePath, Encoding.UTF8);
                            defaultCompleteContent   = ReplaceInstructionPlace(defaultCompleteContent, "footer", defaultFooterFileContent);
                        }

                        // Obtengo la lista de archivos a ser compilados
                        List <string> filePaths = Directory.GetFiles(System.IO.Path.Combine(modulesFolder, "body")).ToList();

                        // Genero Htmls
                        double percentage = (1.0 / Convert.ToDouble(filePaths.Count)) * 50; // Supongo el compilado de archivos el 50% del total
                        foreach (string filePath in filePaths)                              // recorro los archivos del body
                        {
                            string headerContent    = defaultHeaderFileContent;             // contenido default del header
                            string footerContent    = defaultFooterFileContent;             // contenido default del footer
                            string cointanerContent = defaultContainerFileContent;
                            string completeContent  = defaultCompleteContent;

                            string bodyFileName = System.IO.Path.GetFileNameWithoutExtension(filePath);
                            string bodyContent  = System.IO.File.ReadAllText(filePath, Encoding.UTF8); // seteo el contenido del body

                            List <Dictionary <CompilerProperty, string> > bodyInstructions = GetInstructions(bodyContent);

                            if (bodyInstructions.Count > 0)
                            {
                                foreach (Dictionary <CompilerProperty, string> Instruction in bodyInstructions) // Recorro las instrucciones del body
                                {
                                    string        position, fileName, vars, device;
                                    string        contentBeenModified = string.Empty;
                                    List <string> kvVars;
                                    Instruction.TryGetValue(CompilerProperty.Position, out position);
                                    Instruction.TryGetValue(CompilerProperty.FileName, out fileName);
                                    Instruction.TryGetValue(CompilerProperty.Vars, out vars);
                                    Instruction.TryGetValue(CompilerProperty.Device, out device);

                                    if (position != null)
                                    {
                                        if (device != null && config.Device != (DeviceConfig.Devices)Enum.Parse(typeof(DeviceConfig.Devices), device, true))
                                        {
                                            continue; // si la instruccion es especifica de algun dispositivo, solo aplico a ese
                                        }

                                        if (fileName != null)
                                        {
                                            try
                                            {
                                                contentBeenModified = System.IO.File.ReadAllText(System.IO.Path.Combine(proyectFolder, fileName), Encoding.UTF8);
                                            }
                                            catch
                                            {
                                                txtResult.Text += string.Format("{0} - El nombre del archivo {1} esta mal formateado o no existe {2}", deviceName, fileName, Environment.NewLine);
                                            }
                                        }

                                        if (fileName == null && vars != null) // Si solo planeo cargar vars en algun archivo default
                                        {
                                            switch (position)                 // asigno el archivo default corresdpondiente a la posicion al contenido que esta siendo modificado
                                            {
                                            case "header":
                                                contentBeenModified = headerContent;
                                                break;

                                            case "body":
                                                contentBeenModified = cointanerContent;
                                                break;

                                            case "footer":
                                                contentBeenModified = footerContent;
                                                break;
                                            }
                                        }

                                        if (vars != null)                      // Busco si hay variables a remplazar en el html parcial a cargar
                                        {
                                            kvVars = vars.Split(',').ToList(); // TODO: cambiar "," por variable
                                            foreach (var kvVar in kvVars)
                                            {
                                                if (kvVar.Split(':').Length > 1) // si no tiene valor no remplazo // TODO: cambiar ":" por variable
                                                {
                                                    contentBeenModified = ReplaceInstructionVar(kvVar.Split(':')[0].Trim(), kvVar.Split(':')[1].Trim(), contentBeenModified);
                                                }
                                            }
                                        }

                                        // TODO: Aca si correspondiera deberia de forma recursiva cargar mas html para el contenido siendo modificado

                                        switch (position) // asigno el contenido modificado a la seccion correspondiente
                                        {
                                        case "header":
                                            headerContent = contentBeenModified;
                                            break;

                                        case "body":
                                            cointanerContent = contentBeenModified;
                                            break;

                                        case "footer":
                                            footerContent = contentBeenModified;
                                            break;
                                        }
                                    }
                                }
                                completeContent = ReplaceInstructionPlace(cointanerContent, "header", headerContent);
                                completeContent = ReplaceInstructionPlace(completeContent, "footer", footerContent);
                            }

                            string moduleContent = ReplaceInstructionPlace(completeContent, "body", bodyContent); // index con header, body y footer ya remplazado
                            moduleContent = RemoveInstructions(moduleContent);                                    // remuevo las instrucciones que puedan haber quedado

                            string destinyFilePath = Path.Combine(destinyFolder, string.Concat(bodyFileName, ".html"));
                            FileManagment.CreateFileFromString(moduleContent, destinyFilePath);

                            // Move status bar
                            MoveProgressBar(percentage);
                        }

                        // Copy Resources
                        if ((bool)config.CopyResources)
                        {
                            List <string> lResourcesFolders = config.ResourcesFolders.Split(',').ToList();
                            //TODO: copiar carpetas especificadas y no las que a mi se me cantó
                            string resFileName = string.Empty;
                            string resDestName = string.Empty;
                            int    i           = 1;
                            foreach (string rFolder in lResourcesFolders)
                            {
                                var  sFolder = rFolder.Trim();
                                bool minify  = false;
                                // TODO: agregar una variable minificar js
                                //if (rFolder == "js") {
                                //    minify = (bool)config.MinifyJs;
                                //} else {
                                //    minify = (bool)config.MinifyCss;
                                //}
                                minify = (bool)config.MinifyCss;
                                string originPath  = System.IO.Path.Combine(proyectFolder, sFolder);
                                string destinyPath = System.IO.Path.Combine(destinyFolder, sFolder);
                                FileManagment.DirectoryCopy(originPath, destinyPath, true, minify);
                                MoveProgressBar(50 + (40 / lResourcesFolders.Count * i));
                                i++;
                            }

                            /*
                             * // Css Minify
                             * string cssOriginPath = System.IO.Path.Combine(proyectFolder, "css");
                             * string cssDestinyPath = System.IO.Path.Combine(destinyFolder, "css");
                             * DirectoryCopy(cssOriginPath, cssDestinyPath, true, (bool)config.MinifyCss);
                             * MoveProgressBar(65);
                             *
                             * // Js Minify
                             * string jsOriginPath = System.IO.Path.Combine(proyectFolder, "js");
                             * string jsDestinyPath = System.IO.Path.Combine(destinyFolder, "js");
                             * DirectoryCopy(jsOriginPath, jsDestinyPath, true, (bool)config.MinifyCss);
                             * MoveProgressBar(80);
                             *
                             * // Image Reduction
                             * string imgOriginPath = System.IO.Path.Combine(proyectFolder, "img");
                             * string imgDestinyPath = System.IO.Path.Combine(destinyFolder, "img");
                             * DirectoryCopy(imgOriginPath, imgDestinyPath, true, (bool)config.MinifyCss);
                             * MoveProgressBar(90);*/
                        }

                        // Show Log

                        // Finish Status Bar
                        txtResult.Text += String.Format("{0} - Compilacion Finalizada Correctamente! {1}", deviceName, Environment.NewLine);
                        MoveProgressBar(100);
                    }
                    else
                    {
                        txtResult.Text += String.Format("{0} - El directorio de los modulos a compilar no existe o no tiene permisos de lectura {1}", deviceName, Environment.NewLine);
                        MoveProgressBar(0);
                    }
                }
                else
                {
                    txtResult.Text += String.Format("{0} - El directorio de destino del proyecto no existe o no tiene permisos de lectura/escritura {1}", deviceName, Environment.NewLine);
                    MoveProgressBar(0);
                }
            }
            else
            {
                txtResult.Text += String.Format("{0} - El directorio del proyecto no existe o no tiene permisos de lectura {1}", deviceName, Environment.NewLine);
                MoveProgressBar(0);
            }
        }
コード例 #2
0
ファイル: MainWindow.xaml.cs プロジェクト: gheiler/h5c
 private void SaveProject(string filePath)
 {
     SaveDevice(SelectedDevice);
     FileManagment.CreateFileFromString(JSONHelper.Serialize <Project>(OpenProject), filePath);
 }