Ejemplo n.º 1
0
        /// <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);
                }
            }
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
 public Command(ScenarioContentType type, string arguments)
 {
     m_Type        = type;
     m_ContentText = arguments;
 }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        /// <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));
        }
Ejemplo n.º 7
0
 public Command(int lineNo, string commenting, ScenarioContentType type, string[] arguments) : this(type, arguments)
 {
     m_LineNo     = lineNo;
     m_Commenting = commenting;
 }
Ejemplo n.º 8
0
 public Command(ScenarioContentType type, string[] arguments)
 {
     m_Type      = type;
     m_Arguments = arguments;
 }
Ejemplo n.º 9
0
        /// <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);
        }