/// <summary> /// 格式化内容 /// </summary> /// <param name="content"></param> /// <param name="separators"></param> /// <param name="type"></param> /// <param name="arguments"></param> private void FormatLineContent( string content, string[] separators, ref ScenarioContentType type, ref List <string> arguments) { // 按 [" ","\t"] 分割每行 string[] lineValues = content.Split(separators, StringSplitOptions.RemoveEmptyEntries); // 如果起始以标识开头,并且还没有内容 if (lineValues[0].StartsWith(flagMark) && arguments.Count == 0) { type = ScenarioContentType.Flag; } // 添加内容 for (int vi = 0; vi < lineValues.Length; vi++) { string value = lineValues[vi].Trim(); if (!string.IsNullOrEmpty(value)) { arguments.Add(value); } } }
/// <summary> /// Format one line in content. /// </summary> /// <param name="line"></param> /// <param name="flagMark"></param> /// <param name="separators"></param> /// <param name="type"></param> /// <param name="args"></param> /// <param name="withCommenting"></param> /// <param name="commentingPrefix"></param> /// <returns></returns> public static bool FormatLineInContent( string line, string[] separators, ref ScenarioContentType type, ref List <string> args, bool useFlagMark = true, string flagMark = k_DefaultFlagMark, bool withCommenting = true, string commentingPrefix = k_DefaultCommentingPrefix) { if (string.IsNullOrEmpty(line)) { return(false); } line = line.Trim(); if (withCommenting) { int commentingIndex = line.IndexOf(commentingPrefix); if (commentingIndex != -1) { line = line.Substring(0, commentingIndex).TrimEnd(); } if (string.IsNullOrEmpty(line)) { return(false); } } string[] lineValues = line.Split(separators, StringSplitOptions.RemoveEmptyEntries); if (args == null) { args = new List <string>(); } if (lineValues[0].StartsWith(flagMark) && args.Count == 0) { type = ScenarioContentType.Flag; } for (int vi = 0; vi < lineValues.Length; vi++) { string value = lineValues[vi].Trim(); if (!string.IsNullOrEmpty(value)) { args.Add(value); } } return(true); }
/// <summary> /// 按每行格式化剧本 /// </summary> /// <param name="script"></param> /// <returns></returns> protected virtual bool FormatScriptLines(string script) { string[] separators = new string[] { k_Space, k_Separator }; string[] newLineSeparator = new string[] { k_NewLine }; // 不要删除空行,因为要记录行号 string[] lineTexts = script.Split(newLineSeparator, StringSplitOptions.None); ScenarioContentType type = ScenarioContentType.Action; string commenting = string.Empty; List <string> arguments = new List <string>(); int li = 0; while (li < lineTexts.Length) { // 删除左右空格和左右各种特殊转义符 string line = lineTexts[li].Trim(); // 删除每行注释 int commentingIndex = line.IndexOf(commentingPrefix); if (commentingIndex != -1) { commenting += line.Substring(commentingIndex) + Environment.NewLine; line = line.Substring(0, commentingIndex).TrimEnd(); } // 格式化行 if (FormatLine(line, li, separators, ref commenting, ref type, ref arguments)) { li++; } else { return(false); } } // 如果还有参数,文本最后缺少 ";" if (arguments.Count > 0) { formatError = string.Format("TxtScript FormatError {0} -> syntactic error: missing `;`.", li); return(false); } return(true); }
public Command(ScenarioContentType type, string arguments) { m_Type = type; m_ContentText = arguments; }
/// <summary> /// 格式化每一条内容 /// </summary> /// <param name="index">下标,不是行号</param> /// <param name="commandText"></param> /// <param name="separators"></param> /// <param name="newLineSeparator"></param> /// <param name="command"></param> /// <returns></returns> protected virtual FormatContentResult FormatCommand( int index, string commandText, string[] separators, string[] newLineSeparator, out Command command) { ScenarioContentType type = ScenarioContentType.Action; List <string> arguments = new List <string>(); // 按 ["\n"] 分割每一条内容 string[] lines = commandText.Split(newLineSeparator, StringSplitOptions.RemoveEmptyEntries); for (int li = 0; li < lines.Length; li++) { string line = lines[li].Trim(); // 删除每行注释 int commentingIndex = line.IndexOf(commentingPrefix); if (commentingIndex != -1) { line = line.Substring(0, commentingIndex).TrimEnd(); } // 如果每行为空,则下一行 if (string.IsNullOrEmpty(line)) { continue; } // 按 [" ","\t"] 分割每行 string[] lineValues = line.Split(separators, StringSplitOptions.RemoveEmptyEntries); // 如果是标识,如果arguments.Count不是0,则不是第一个参数 if (lineValues[0].StartsWith(flagMark) && arguments.Count == 0) { type = ScenarioContentType.Flag; } // 添加内容 for (int vi = 0; vi < lineValues.Length; vi++) { string value = lineValues[vi].Trim(); if (!string.IsNullOrEmpty(value)) { arguments.Add(value); } } } // 只有注释 if (arguments.Count == 0) { command = null; return(FormatContentResult.Commenting); } //// 如果标识参数大于1,则语法错误。 //// 也可以不在这里判断,而在具体运行代码时判断。 //if (type == ScenarioContentType.Flag && arguments.Count > 1) //{ // command = null; // formatError = string.Format("TxtScript FormatError -> syntactic error: {0}", commandText); // return FormatContentResult.Failure; //} command = new Command(index, type, arguments.ToArray()); return(FormatContentResult.Succeed); }
/// <summary> /// 格式化行, /// true: 下一行, /// false: 有错误。 /// </summary> /// <param name="line"></param> /// <param name="lineNo"></param> /// <param name="separators"></param> /// <param name="commenting"></param> /// <param name="type"></param> /// <param name="arguments"></param> /// <returns></returns> protected virtual bool FormatLine( string line, int lineNo, string[] separators, ref string commenting, ref ScenarioContentType type, ref List <string> arguments) { // 如果为空或注释行,下一行 if (string.IsNullOrEmpty(line)) { return(true); } // 搜索第一个 ";" 的下标 // 以防止这种写法: // var aaa = 1; var bbb = 2; // 或者这种: // var aaa = 1; var // bbb = 2; int separatorIndex = line.IndexOf(k_CommandSeparator); // 如果没有找到 ";" if (separatorIndex == -1) { // 直接格式化内容 FormatLineContent(line, separators, ref type, ref arguments); line = string.Empty; } // 如果找到了 ";" else { // 取 ";" 之前的内容,并格式化内容 string contentText = line.Substring(0, separatorIndex).TrimEnd(); // 取 ";" 之后的内容 line = line.Remove(0, separatorIndex + 1); // 如果只有 ";",后半截 if (string.IsNullOrEmpty(contentText)) { return(FormatLine(line, lineNo, separators, ref commenting, ref type, ref arguments)); } else { FormatLineContent(contentText, separators, ref type, ref arguments); // 如果是标识,且内容超过1个,则语法错误 if (type == ScenarioContentType.Flag && arguments.Count > 1) { formatError = string.Format("TxtScript FormatCode {0} -> syntactic error: flag has no param.", lineNo); return(false); } Command command = new Command(lineNo, commenting, type, arguments.ToArray()); commands.Add(command); // 重置参数,继续下一条内容 commenting = string.Empty; type = ScenarioContentType.Action; arguments.Clear(); } } return(FormatLine(line, lineNo, separators, ref commenting, ref type, ref arguments)); }
public Command(int lineNo, string commenting, ScenarioContentType type, string[] arguments) : this(type, arguments) { m_LineNo = lineNo; m_Commenting = commenting; }
public Command(ScenarioContentType type, string[] arguments) { m_Type = type; m_Arguments = arguments; }
/// <summary> /// Format the text of content. /// </summary> /// <param name="contentText"></param> /// <param name="flagMark"></param> /// <param name="separators"></param> /// <param name="type"></param> /// <param name="arguments"></param> /// <param name="error"></param> /// <param name="multiline"></param> /// <param name="withCommenting"></param> /// <param name="commentingPrefix"></param> /// <returns></returns> public static FormatContentResult FormatContent( string contentText, string[] separators, out ScenarioContentType type, out string[] arguments, out string error, bool multiline = true, bool useFlagMark = true, string flagMark = k_DefaultFlagMark, bool withCommenting = true, string commentingPrefix = k_DefaultCommentingPrefix) { type = ScenarioContentType.Action; arguments = null; error = null; if (string.IsNullOrEmpty(contentText)) { error = "FormatContent -> `argumentsStr` is null or empty"; return(FormatContentResult.Failure); } contentText = contentText.Trim(); if (string.IsNullOrEmpty(contentText)) { error = "FormatContent -> `argumentsStr` is null or empty"; return(FormatContentResult.Failure); } List <string> args = new List <string>(); if (multiline) { string[] lineSeparator = new string[] { k_NewLine }; string[] lines = contentText.Split(lineSeparator, StringSplitOptions.RemoveEmptyEntries); for (int li = 0; li < lines.Length; li++) { FormatLineInContent( lines[li], separators, ref type, ref args, useFlagMark, flagMark, withCommenting, commentingPrefix); } } else { FormatLineInContent( contentText, separators, ref type, ref args, useFlagMark, flagMark, withCommenting, commentingPrefix); } if (args.Count == 0) { return(FormatContentResult.Commenting); } //if (type == ScenarioContentType.Flag && args.Count > 1) //{ // error = "FormatContent -> syntactic error: flag has some params."; // return FormatContentResult.Failure; //} arguments = args.ToArray(); return(FormatContentResult.Succeed); }