/// <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; } }