private static List <Element> ExpandRepeater(List <Element> element_list, Environment environment) { List <Element> expanded_list = new List <Element>(); for (int i = 0; i < element_list.Count; ++i) { if (element_list[i].GetKind() == Element.Kind.Repeater) { ElementRepeater repeater = (ElementRepeater)element_list[i]; int times = repeater.GetTimes(environment); expanded_list.Add(repeater.GetCommentElement()); if (repeater.IsExistIndex(environment)) { int start = repeater.GetStart(environment); int end = repeater.GetEnd(environment); int step = (repeater.IsReverse(environment) ? -1 : 1); for (int j = start; Math.Min(start, end) <= j && j <= Math.Max(start, end); j += step) { for (int k = 0; k < times; ++k) { Element element = element_list[i + k + 1].GetClone(); element.SetRepeaterLineNumber(repeater.GetLineNumber()); element.SetIteratingNumber(j); expanded_list.Add(element); } } } i += times; } else { expanded_list.Add(element_list[i]); } } return(expanded_list); }
private static List <Element> Parse(string tejun_str, out Setting setting) { string[] lines = tejun_str.Split(new string[] { "\r\n" }, StringSplitOptions.None); setting = new Setting(); List <string> comment_list = new List <string>(); List <Element> element_list = new List <Element>(); for (int i = 0; i < lines.Length; ++i) { if (lines[i] == "") { continue; } if (IsCommentLine(lines[i])) { comment_list.Add(lines[i]); continue; } if (lines[i].StartsWith("framenumber", StringComparison.InvariantCultureIgnoreCase)) { string[] array = lines[i].Split('\t'); try { setting.frame_number = double.Parse(array[1]); } catch (FormatException) { throw new FormatException("framenumber の後ろにはタブ文字と数字が必要です。"); } continue; } if (lines[i].StartsWith("FlipVertical", StringComparison.InvariantCultureIgnoreCase)) { string[] array = lines[i].Split('\t'); if (array.Length >= 2 && array[1] == "on") { setting.flip_vertical = true; } continue; } if (lines[i].StartsWith("imcolorspace", StringComparison.InvariantCultureIgnoreCase)) { string[] array = lines[i].Split('\t'); if (array.Length >= 2) { setting.imcolorspace = array[1]; } continue; } if (lines[i].StartsWith("colorspace", StringComparison.InvariantCultureIgnoreCase)) { string[] array = lines[i].Split('\t'); if (array.Length >= 2) { setting.colorspace = array[1]; } continue; } if (lines[i].StartsWith("ConvertFpsZone", StringComparison.InvariantCultureIgnoreCase)) { string[] array = lines[i].Split('\t'); if (array.Length >= 2) { setting.zone = int.Parse(array[1]); } continue; } if (lines[i].StartsWith("LayerLevel", StringComparison.InvariantCultureIgnoreCase)) { string[] array = lines[i].Split('\t'); if (array.Length >= 2) { setting.layer_level = array[1]; } continue; } Element element; if (lines[i].StartsWith("繰り返し\t")) { element = new ElementRepeater(lines[i], i + 1); } else { element = new Element(lines[i], i + 1); } element.AddCommentRange(comment_list); comment_list.Clear(); element_list.Add(element); } if (comment_list.Count > 0) { Element element = new Element(Element.Kind.Comment); element.AddCommentRange(comment_list); element_list.Add(element); } return(element_list); }