예제 #1
0
        public static string ParseRegions(string cfModuleFileText, List <RegionContainer> linesNew, int startIndex, int endIndex)
        {
            string subStringRegion    = "#Область";
            string subStringEndRegion = "#КонецОбласти";

            int lastListRegionIndex = -1;

            while (true)
            {
                int indexOfSubStringRegion    = cfModuleFileText.IndexOf(subStringRegion, startIndex, StringComparison.CurrentCultureIgnoreCase);
                int indexOfSubStringEndRegion = cfModuleFileText.IndexOf(subStringEndRegion, startIndex, StringComparison.CurrentCultureIgnoreCase);

                int    startIndexNameRegion;
                int    endIndexNameRegion;
                string subStringSpace;

                if (indexOfSubStringRegion >= 0 && indexOfSubStringEndRegion >= 0)
                {
                    if (indexOfSubStringRegion < indexOfSubStringEndRegion)
                    {
                        //Получаем индекс первого символа имени области
                        startIndexNameRegion = indexOfSubStringRegion + 7;
                        do
                        {
                            startIndexNameRegion++;
                            subStringSpace = cfModuleFileText.Substring(startIndexNameRegion, 1);
                            subStringSpace = subStringSpace.Trim(new char[] { ' ', '\r', '\n', '\t' });
                        }while (subStringSpace.Length == 0);

                        //Получаем индекс последнего символа имени области
                        endIndexNameRegion = startIndexNameRegion;
                        while (subStringSpace.Length != 0)
                        {
                            endIndexNameRegion++;
                            subStringSpace = cfModuleFileText.Substring(endIndexNameRegion, 1);
                            subStringSpace = subStringSpace.Trim(new char[] { ' ', '\r', '\n', '\t' });
                        }

                        RegionContainer lineNew = new RegionContainer();
                        lineNew.Name       = cfModuleFileText.Substring(startIndexNameRegion, endIndexNameRegion - startIndexNameRegion);
                        lineNew.StartIndex = indexOfSubStringRegion;
                        linesNew.Add(lineNew);

                        lastListRegionIndex++;

                        startIndex = endIndexNameRegion + 1;
                    }
                    else
                    {
                        for (int listRegionIndex = lastListRegionIndex; listRegionIndex >= 0; listRegionIndex--)
                        {
                            RegionContainer lineNew = linesNew[listRegionIndex];
                            if (lineNew.EndIndex == 0)
                            {
                                lineNew.EndIndex = indexOfSubStringEndRegion;
                                startIndex       = indexOfSubStringEndRegion + 13;
                                break;
                            }
                        }
                    }
                }
                else if (indexOfSubStringRegion >= 0)
                {
                    //Такого быть не может.
                    //Начало области не может быть без конца области, потому что строку мы обрезаем слева.
                    break;
                }
                else if (indexOfSubStringEndRegion >= 0)
                {
                    for (int listRegionIndex = lastListRegionIndex; listRegionIndex >= 0; listRegionIndex--)
                    {
                        RegionContainer lineNew = linesNew[listRegionIndex];
                        if (lineNew.EndIndex == 0)
                        {
                            lineNew.EndIndex = indexOfSubStringEndRegion;
                            startIndex       = indexOfSubStringEndRegion + 13;
                            break;
                        }
                    }
                }
                else//Либо ничего не нашли, либо дошли до конца - прерываем цикл
                {
                    break;
                }
            }

            return("fff");
        }
예제 #2
0
        public static string ChangeModuleFile(string cfFileDir, string moduleName)
        {
            string cfModuleFilePathNew = $@"{cfFileDir}\ОбщийМодуль.{moduleName}1.Модуль.txt";
            string cfModuleFilePath    = $@"{cfFileDir}\ОбщийМодуль.{moduleName}.Модуль.txt";
            string cfModuleFileText;

            //Читаем текст файла общего модуля конфигурации
            using (StreamReader srCfModuleFile = new StreamReader(cfModuleFilePath, System.Text.Encoding.UTF8))
            {
                cfModuleFileText = srCfModuleFile.ReadToEnd();
            }

            int endIndex = cfModuleFileText.Length - 1;

            //Отбираем области экспортных процедур и функций
            List <RegionContainer> Regionlines = new List <RegionContainer>();

            ParseRegions(cfModuleFileText, Regionlines, 0, endIndex);

            //Отбираем эксортные процедуры и функции
            List <PFContainer> PFlines = new List <PFContainer>();

            ParseCFModuleFileText(cfModuleFileText, PFlines, 0, endIndex);

            //Заисываем данные в новый модуль
            using (StreamWriter srCfModuleFileNew = new StreamWriter(cfModuleFilePath, false, System.Text.Encoding.UTF8))
            {
                //Здесь будем хранить список областей записанных в файл
                List <RegionContainer> writeRegionlines = new List <RegionContainer>();

                //Здесь будем хранить список закрытых областей записанных в файл
                List <RegionContainer> writeEndRegionlines = new List <RegionContainer>();

                foreach (PFContainer line in PFlines)
                {
                    string subStringParameters = "";
                    if (line.Parameters != null)
                    {
                        foreach (string parameter in line.Parameters)
                        {
                            subStringParameters = subStringParameters + ((subStringParameters == "") ? subStringParameters : ", ") + parameter;
                        }
                    }

                    //вставляем области
                    if (Regionlines.Count != 0)
                    {
                        //Найдем список областей до текущей процедуры/функции, их нужно закрыть
                        List <RegionContainer> findEndRegionlines = Regionlines.FindAll(x => x.EndIndex < line.Index);
                        foreach (RegionContainer findEndRegionline in findEndRegionlines)
                        {
                            //Поищем в списке записанных областей текущую найденную закрытую область
                            //Ее может не быть, потому что в ней могло не оказаться экспортных процедур/функций, тогда закрыать нечего
                            RegionContainer writeRegionline = writeRegionlines.Find(x => x.StartIndex == findEndRegionline.StartIndex && x.EndIndex == findEndRegionline.EndIndex);

                            if (writeRegionline != null)//Область, которую нужно закрыть, должна быть записана в файл
                            {
                                //Поищем в списке записанных закрытых областей текущую найденную закрытую область, может оказаться уже закрытой
                                RegionContainer writeEndRegionline = writeEndRegionlines.Find(x => x.StartIndex == findEndRegionline.StartIndex && x.EndIndex == findEndRegionline.EndIndex);
                                if (writeEndRegionline == null)
                                {
                                    srCfModuleFileNew.WriteLine();
                                    srCfModuleFileNew.WriteLine($"#КонецОбласти");
                                    writeEndRegionlines.Add(findEndRegionline);
                                }
                            }
                        }

                        //Найдем список областей для текущей процедуры/функции
                        List <RegionContainer> findRegionlines = Regionlines.FindAll(x => x.StartIndex <line.Index && x.EndIndex> line.Index);
                        foreach (RegionContainer findRegionline in findRegionlines)
                        {
                            //Поищем в списке записанных областей текущую найденную область
                            RegionContainer writeRegionline = writeRegionlines.Find(x => x.StartIndex == findRegionline.StartIndex && x.EndIndex == findRegionline.EndIndex);
                            if (writeRegionline == null)
                            {
                                srCfModuleFileNew.WriteLine();
                                srCfModuleFileNew.WriteLine($"#Область {findRegionline.Name}");
                                writeRegionlines.Add(findRegionline);
                            }
                        }
                    }

                    if (line.Type == TypePF.Function)
                    {
                        srCfModuleFileNew.WriteLine();
                        srCfModuleFileNew.WriteLine(line.Text);
                        srCfModuleFileNew.WriteLine();
                        srCfModuleFileNew.WriteLine($"\tОбъектСЛК = ОбщегоНазначенияУВССервер.СоздатьОбъектСЛК(\"{moduleName}\");");
                        srCfModuleFileNew.WriteLine();
                        srCfModuleFileNew.WriteLine($"\tЕсли Не ОбъектСЛК = Неопределено Тогда");
                        srCfModuleFileNew.WriteLine($"\t\tВозврат ОбъектСЛК.{line.Name}({subStringParameters});");
                        srCfModuleFileNew.WriteLine($"\tИначе");
                        srCfModuleFileNew.WriteLine($"\t\tВозврат Неопределено;");
                        srCfModuleFileNew.WriteLine($"\tКонецЕсли;");
                        srCfModuleFileNew.WriteLine();
                        srCfModuleFileNew.WriteLine($"КонецФункции");
                    }
                    else if (line.Type == TypePF.Procedure)
                    {
                        srCfModuleFileNew.WriteLine();
                        srCfModuleFileNew.WriteLine(line.Text);
                        srCfModuleFileNew.WriteLine();
                        srCfModuleFileNew.WriteLine($"\tОбъектСЛК = ОбщегоНазначенияУВССервер.СоздатьОбъектСЛК(\"{moduleName}\");");
                        srCfModuleFileNew.WriteLine();
                        srCfModuleFileNew.WriteLine($"\tЕсли Не ОбъектСЛК = Неопределено Тогда");
                        srCfModuleFileNew.WriteLine($"\t\tОбъектСЛК.{line.Name}({subStringParameters});");
                        srCfModuleFileNew.WriteLine($"\tКонецЕсли;");
                        srCfModuleFileNew.WriteLine();
                        srCfModuleFileNew.WriteLine($"КонецПроцедуры");
                    }
                }

                if (Regionlines.Count != 0)
                {
                    int countWriteNotEndRegionlines = writeRegionlines.Count - writeEndRegionlines.Count;
                    while (countWriteNotEndRegionlines != 0)
                    {
                        srCfModuleFileNew.WriteLine();
                        srCfModuleFileNew.WriteLine($"#КонецОбласти");
                        countWriteNotEndRegionlines--;
                    }
                }
            }

            return("fff");
        }