Esempio n. 1
0
        /// <summary>
        /// Inicializa una nueva instancia de la clase <see cref="AssFile"/> al leer un archivo ASS.
        /// </summary>
        /// <param name="ruta">Ruta del archivo ASS.</param>
        public AssFile(string ruta)
        {
            Funciones.ChangeCulture();

            // Inicializando.
            ScriptInfo            = new ScriptInfo();
            AegisubProjectGarbage = new AegisubProjectGarbage();
            Fonts     = new List <AttachedFont>();
            Graphics  = new List <AttachedGraphic>();
            Styles    = new List <Style>();
            Events    = new List <Line>();
            Directory = System.IO.Path.GetDirectoryName(ruta);
            Name      = System.IO.Path.GetFileNameWithoutExtension(ruta);
            Extension = System.IO.Path.GetExtension(ruta);


            // Indicadores de categoría.
            var scriptInfoActivo            = false;
            var aegisubProjectGarbageActivo = false;
            var stylesActivo   = false;
            var graphicsActivo = false;
            var fontsActivo    = false;
            var eventsActivo   = false;

            // Identificadores de líneas de archivo.ass.
            var _Comment               = "; ";
            var _Title                 = "Title: ";
            var _ScriptType            = "ScriptType: ";
            var _WrapStyle             = "WrapStyle: ";
            var _ScaledBorderAndShadow = "ScaledBorderAndShadow: ";
            var _PlayResX              = "PlayResX: ";
            var _PlayResY              = "PlayResY: ";
            var _YCbCrMatrix           = "YCbCr Matrix: ";
            var _AutomationScripts     = "Automation Scripts: ";
            var _ExportFilters         = "Export Filters: ";
            var _ExportEncoding        = "Export Encoding: ";
            var _AudioFile             = "Audio File: ";
            var _VideoFile             = "Video File: ";
            var _TimecodesFile         = "Timecodes File: ";
            var _VideoARMode           = "Video AR Mode: ";
            var _VideoARValue          = "Video AR Value: ";
            var _VideoZoomPercent      = "Video Zoom Percent: ";
            var _ActiveLine            = "Active Line: ";
            var _VideoPosition         = "Video Position: ";
            var _Style                 = "Style: ";
            var _filename              = "filename: ";
            var _fontname              = "fontname: ";
            var _LineDialogue          = "Dialogue: ";
            var _LineComment           = "Comment: ";

            List <string> lineas;

            try {
                lineas = File.ReadAllLines(ruta, System.Text.Encoding.ASCII).ToList();
            } catch (Exception) {
                throw;
            }

            for (var i = 0; i < lineas.Count; i++)
            {
                var lineaActual = lineas[i];

                switch (lineaActual)
                {
                case "[Script Info]":
                    scriptInfoActivo = true;
                    goto Fin;

                case "[Aegisub Project Garbage]":
                    scriptInfoActivo            = false;
                    aegisubProjectGarbageActivo = true;
                    goto Fin;

                case "[V4+ Styles]":
                    aegisubProjectGarbageActivo = false;
                    stylesActivo = true;
                    goto Fin;

                case "[Graphics]":
                    stylesActivo   = false;
                    graphicsActivo = true;
                    goto Fin;

                case "[Fonts]":
                    graphicsActivo = false;
                    fontsActivo    = true;
                    goto Fin;

                case "[Events]":
                    fontsActivo  = false;
                    eventsActivo = true;
                    goto Fin;

                default:
                    break;
                }

                if (scriptInfoActivo)
                {
                    if (lineaActual.StartsWith(_Comment))
                    {
                        ScriptInfo.Comments.Add(lineaActual.Substring(_Comment.Length));
                    }
                    else

                    if (lineaActual.StartsWith(_Title))
                    {
                        ScriptInfo.Title = lineaActual.Substring(_Title.Length);
                    }
                    else

                    if (lineaActual.StartsWith(_ScriptType))
                    {
                        ScriptInfo.ScriptType = lineaActual.Substring(_ScriptType.Length);
                    }
                    else

                    if (lineaActual.StartsWith(_WrapStyle))
                    {
                        ScriptInfo.WrapStyle = WrapStyleInfo.StringToWrapStyle(lineaActual.Substring(_WrapStyle.Length));
                    }
                    else

                    if (lineaActual.StartsWith(_ScaledBorderAndShadow))
                    {
                        var aux = false;

                        if (lineaActual.Substring(_ScaledBorderAndShadow.Length) == "yes")
                        {
                            aux = true;
                        }

                        ScriptInfo.ScaledBorderAndShadow = aux;
                    }
                    else

                    if (lineaActual.StartsWith(_PlayResX))
                    {
                        ScriptInfo.PlayResX = int.Parse(lineaActual.Substring(_PlayResX.Length));
                    }
                    else

                    if (lineaActual.StartsWith(_PlayResY))
                    {
                        ScriptInfo.PlayResY = int.Parse(lineaActual.Substring(_PlayResY.Length));
                    }
                    else

                    if (lineaActual.StartsWith(_YCbCrMatrix))
                    {
                        ScriptInfo.YCbCrMatrix = YCbCrMatrixInfo.StringToYCbCrMatrix(lineaActual.Substring(_YCbCrMatrix.Length));
                    }
                    else

                    if (lineaActual == "[Aegisub Project Garbage]")
                    {
                        scriptInfoActivo            = false;
                        aegisubProjectGarbageActivo = true;
                    }
                    else

                    if (lineaActual != "")
                    {
                        ScriptInfo.Others.Add(lineaActual);
                    }
                }
                else

                if (aegisubProjectGarbageActivo)
                {
                    if (lineaActual.StartsWith(_AutomationScripts))
                    {
                        AegisubProjectGarbage.AutomationScripts = lineaActual.Substring(_AutomationScripts.Length);
                    }
                    else

                    if (lineaActual.StartsWith(_ExportFilters))
                    {
                        AegisubProjectGarbage.ExportFilters = lineaActual.Substring(_ExportFilters.Length);
                    }
                    else

                    if (lineaActual.StartsWith(_ExportEncoding))
                    {
                        AegisubProjectGarbage.ExportEncoding = lineaActual.Substring(_ExportEncoding.Length);
                    }
                    else

                    if (lineaActual.StartsWith(_AudioFile))
                    {
                        AegisubProjectGarbage.AudioFile = lineaActual.Substring(_AudioFile.Length);
                    }
                    else

                    if (lineaActual.StartsWith(_VideoFile))
                    {
                        AegisubProjectGarbage.VideoFile = lineaActual.Substring(_VideoFile.Length);
                    }
                    else

                    if (lineaActual.StartsWith(_TimecodesFile))
                    {
                        AegisubProjectGarbage.TimecodesFile = lineaActual.Substring(_TimecodesFile.Length);
                    }
                    else

                    if (lineaActual.StartsWith(_VideoARMode))
                    {
                        AegisubProjectGarbage.VideoARMode = int.Parse(lineaActual.Substring(_VideoARMode.Length));
                    }
                    else

                    if (lineaActual.StartsWith(_VideoARValue))
                    {
                        AegisubProjectGarbage.VideoARValue = double.Parse(lineaActual.Substring(_VideoARValue.Length));
                    }
                    else

                    if (lineaActual.StartsWith(_VideoZoomPercent))
                    {
                        AegisubProjectGarbage.VideoZoomPercent = double.Parse(lineaActual.Substring(_VideoZoomPercent.Length));
                    }
                    else

                    if (lineaActual.StartsWith(_ActiveLine))
                    {
                        AegisubProjectGarbage.ActiveLine = int.Parse(lineaActual.Substring(_ActiveLine.Length));
                    }
                    else

                    if (lineaActual.StartsWith(_VideoPosition))
                    {
                        AegisubProjectGarbage.VideoPosition = int.Parse(lineaActual.Substring(_VideoPosition.Length));
                    }
                    else

                    if (lineaActual == "[V4+ Styles]")
                    {
                        aegisubProjectGarbageActivo = false;
                    }
                    else

                    if (lineaActual != "")
                    {
                        AegisubProjectGarbage.Others.Add(lineaActual);
                    }
                }
                else

                if (stylesActivo && lineaActual.StartsWith(_Style))
                {
                    var style = new Style(lineaActual.Substring(_Style.Length));
                    Styles.Add(style);
                }
                else

                if (graphicsActivo && lineaActual.StartsWith(_filename))
                {
                    var graphic = new AttachedGraphic()
                    {
                        Name = lineaActual.Substring(_filename.Length)
                    };

                    var siguienteIndice = i + 1;
                    while (lineas[siguienteIndice] != null && lineas[siguienteIndice] != string.Empty)
                    {
                        graphic.Data.Add(lineas[siguienteIndice]);
                        siguienteIndice++;
                    }
                    Graphics.Add(graphic);
                }
                else

                if (fontsActivo && lineaActual.StartsWith(_fontname))
                {
                    var font = new AttachedFont()
                    {
                        Name = lineaActual.Substring(_fontname.Length)
                    };

                    var siguienteIndice = i + 1;
                    while (lineas[siguienteIndice] != null && lineas[siguienteIndice] != string.Empty)
                    {
                        font.Data.Add(lineas[siguienteIndice]);
                        siguienteIndice++;
                    }
                    Fonts.Add(font);
                }
                else

                if (eventsActivo)
                {
                    if (lineaActual.StartsWith(_LineDialogue) || lineaActual.StartsWith(_LineComment))
                    {
                        var linea = new Line(lineaActual);
                        Events.Add(linea);
                    }
                }

Fin:
                continue;
            }
        }