//打开文件
        private void menuOpenFile_Click(object sender, RoutedEventArgs e)
        {
            CommonOpenFileDialog cofd = new CommonOpenFileDialog();

            cofd.IsFolderPicker = false;
            if (cofd.ShowDialog() == CommonFileDialogResult.Ok)
            {
                projectRootPath = "";

                fileTree.Items.Clear();
                listItems.Clear();
                editorManager.Clear();

                try
                {
                    // 后缀名匹配则解析,否则直接载入
                    if (Util.IsExtensionName(Path.GetExtension(cofd.FileName)))
                    {
                        //解析代码并格式化
                        new CodeForm(cofd.FileName, this, editorManager);
                    }
                    else
                    {
                        editorManager.LoadDataFromFile(cofd.FileName);
                    }
                }
                catch (Exception ex)
                {
                    //解析错误,直接载入
                    editorManager.LoadDataFromFile(cofd.FileName);
                    OperationInterface.SetStatusText(ex.Message, OperationInterface.StatusText.Warning);
                }
            }
        }
예제 #2
0
        public CodeForm(string codePath, MainWindow mainWindow, EditorManager editorManager)
        {
            this.mainWindow    = mainWindow;
            this.editorManager = editorManager;

            FileStream   fs = new FileStream(codePath, FileMode.Open);
            StreamReader sr = new StreamReader(fs, new UTF8Encoding(false));

            codeContent = sr.ReadToEnd();
            sr.Close();
            fs.Close();
            int pe = ParsingCode(codePath);

            if (pe == -1)
            {
                //OperationInterface.SetStatusText(LocalizedLangExtension.GetString("CodeFormatSuccessful"));
            }
            if (pe > -1)
            {
                OperationInterface.SetStatusText(string.Format("{0}: {1} {2}, {3}", LocalizedLangExtension.GetString("Error"), pe, LocalizedLangExtension.GetString("Line"), LocalizedLangExtension.GetString("MissingBraces")), OperationInterface.StatusText.Warning);
            }
            else if (pe == -2)
            {
                OperationInterface.SetStatusText(string.Format("{0}: {1}", LocalizedLangExtension.GetString("Error"), LocalizedLangExtension.GetString("MissingBraces")), OperationInterface.StatusText.Warning);
            }
        }
예제 #3
0
        /// <summary>
        /// 解析代码并格式化,返回出错行,返回-1则为无错
        /// </summary>
        int ParsingCode(string codeFilePath)
        {
            Regex  regex        = new Regex(@"\r*\n* *#+.*\r*\n");
            string noCommentStr = regex.Replace(codeContent, "\n");

            string[] lineStr = Regex.Split(noCommentStr, @"\n");
            for (int i = 0; i < lineStr.Length; i++)
            {
                lineStr[i] = new Regex(@"\s*#+.*\r*\n*").Replace(lineStr[i], "\n");
                Console.WriteLine(lineStr[i]);
            }
            //删除空字符串数组
            lineStr = lineStr.Where(s => !string.IsNullOrEmpty(s.Trim())).ToArray();

            Stack <char> stack = new Stack <char>();

            for (int i = 0; i < lineStr.Length; i++)
            {
                //去掉尾部空行
                lineStr[i] = lineStr[i].TrimEnd();
                lineStr[i] = Regex.Replace(lineStr[i], @" *= *{ *\n*", " = {\n");
                lineStr[i] = Regex.Replace(lineStr[i], @" *\n*} *\n*", "\n}\n");
                //获取匹配字符串数组,复制下来加上回车,删除之前的旧字符串不就好了

                for (int stackIndex = 0; stackIndex < lineStr[i].Length; stackIndex++)
                {
                    switch (lineStr[i][stackIndex])
                    {
                    case '{':
                        stack.Push(lineStr[i][stackIndex]);
                        //找到括号且无开始行,设置开始行
                        if (codeStartLine == -1)
                        {
                            codeStartLine = i;
                        }
                        break;

                    case '}':
                        if (stack.Count > 0 && stack.Pop() == '{')
                        {
                            //完全匹配,且有开始行
                            if (stack.Count == 0 && codeStartLine > -1)
                            {
                                codeEndLine = i;
                                string ec = "";
                                while (codeStartLine <= codeEndLine)
                                {
                                    ec += lineStr[codeStartLine] + "\n";
                                    codeStartLine++;
                                }
                                countryEvent.Add(ec);
                                codeStartLine = -1;
                                codeEndLine   = -1;
                            }
                            break;
                        }
                        else
                        {
                            return(i);
                        }

                    default:
                        continue;
                    }
                }

                //当前行没有括号且正在匹配括号为0
                if (!Regex.IsMatch(lineStr[i], @"{+") && !Regex.IsMatch(lineStr[i], @"}+"))
                {
                    //该行没有括号且正在匹配括号为0
                    if (stack.Count == 0)
                    {
                        countryEvent.Add(lineStr[i] + "\n");
                    }
                }
            }

            if (stack.Count == 0)
            {
                editorManager.Clear();
                string str = "";
                foreach (var item in countryEvent)
                {
                    str += item + "\n";
                }
                editorManager.LoadDataString(str, codeFilePath);

                //解析为YAML
                OperationInterface.SetStatusText("解析代码中,请稍后……");
                var yaml = TxtResolveToYaml(codeFilePath);
                //editorManager.LoadDataString(yaml, codeFilePath);
                OperationInterface.SetStatusText("解码为YAML成功!");

                mainWindow.modClassTree.Items.Clear();
                new YAMLForm(Path.GetDirectoryName(codeFilePath) + "\\" + Path.GetFileNameWithoutExtension(codeFilePath) + Util.extension, mainWindow, editorManager);

                return(-1);
            }
            else
            {
                //缺少右括号
                return(-2);
            }
        }