Ejemplo n.º 1
0
        /// <summary>
        /// 从 ASS 加载
        /// </summary>
        /// <param name="text">ASS 文本</param>
        public void LoadAss(string text)
        {
            _styles = new List<SubStationStyle>();
            _events = new List<SubStationEvent>();

            string[] lines = text.Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            int mode = 0;

            int playRexX = 0;
            int playRexY = 0;
            bool isStyle = false;
            bool isEvent = false;

            foreach (string s in lines)
            {
                string line = s.Trim();

                if (line == "[Script Info]")
                {
                    mode = 1;
                    System.Diagnostics.Debug.WriteLine(line);
                }
                else if (line == "[V4+ Styles]")
                {
                    mode = 2;
                    System.Diagnostics.Debug.WriteLine(line);
                }
                else if (line == "[Events]")
                {
                    mode = 3;
                    System.Diagnostics.Debug.WriteLine(line);
                }
                else
                {
                    switch (mode)
                    {
                        case 1:
                            if (line.Length > 9)
                            {
                                if (line.Substring(0, 9) == "PlayResX:")
                                {
                                    playRexX = int.Parse(line.Substring(9).Trim());
                                }
                                else if (line.Substring(0, 9) == "PlayResY:")
                                {
                                    playRexY = int.Parse(line.Substring(9).Trim());
                                }
                                
                                if (playRexX > 0 && playRexY > 0)
                                {
                                    _scriptInfo = new SubStationInfo(playRexX, playRexY);
                                }
                            }
                            break;
                        case 2:
                            if (line.Replace(" ", "") == "Format:Name,Fontname,Fontsize,PrimaryColour,SecondaryColour,OutlineColour,BackColour,Bold,Italic,Underline,StrikeOut,ScaleX,ScaleY,Spacing,Angle,BorderStyle,Outline,Shadow,Alignment,MarginL,MarginR,MarginV,Encoding")
                            {
                                isStyle = true;
                            }

                            if (isStyle)
                            {
                                if (line.Length > 6)
                                {
                                    if (line.Substring(0, 6) == "Style:")
                                    {
                                        SubStationStyle substyle = new SubStationStyle(line);
                                        _styles.Add(substyle);
                                    }
                                }
                            }
                            break;
                        case 3:
                            if (line.Replace(" ", "") == "Format:Layer,Start,End,Style,Actor,MarginL,MarginR,MarginV,Effect,Text")
                            {
                                isEvent = true;
                            }

                            if (isEvent)
                            {
                                if (line.Length > 9)
                                {
                                    if (line.Substring(0, 9) == "Dialogue:")
                                    {
                                        SubStationEvent subevent = new SubStationEvent(line);
                                        _events.Add(subevent);
                                    }
                                }
                            }
                            break;
                        default:
                            //do nothing
                            break;
                    }
                }
            }

            bool hasDefault = false;
            foreach (SubStationStyle _style in _styles)
            {
                if (_style.Name == "Default") hasDefault = true;
            }
            if (!hasDefault) _styles.Insert(0, new SubStationStyle());
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 从 XingSub 时间轴加载
        /// </summary>
        /// <param name="text">XingSub 对白时间轴文本</param>
        public void LoadXss(string text)
        {
            if (_styles.Count == 0)
            {
                _styles.Add(new SubStationStyle());
            }

            _events = new List<SubStationEvent>();
            string[] line = text.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            for (int i = 0; i < line.Length - 1; i++)
            {
                if (line[i].Length > 7 && line[i + 1].Length >= 7)
                {
                    string startTime = TimeToStamp(line[i].Substring(0, 7));
                    string endTime = TimeToStamp(line[i + 1].Substring(0, 7));
                    string subtitle = line[i].Substring(7);

                    SubStationEvent subevent = new SubStationEvent(startTime, endTime, subtitle);
                    _events.Add(subevent);
                }
            }
        }