//======Закрытые методы private string _FormatArticle(int width, LoTVDiv Article) { string Out = " "; Out = __FormatText(Out + Article.LoTVDivReturnData(), width); return Out; }
private string _FormatColumns(int width, LoTVDiv Columns) { string Out = ""; string[] Arr = (string[])Columns.LoTVDivReturnData(); int Cols = Arr.Length; //Количество колонок int MaxLength = 0; //Макс длина колонки int MaxCol = 0; if (Cols != 1) for (int i = 0; i < Cols; i++) { int Length = Arr[i].Length; if (Length >= MaxLength) { MaxLength = Length; MaxCol = i; } } switch (Cols) { case 1: return __FormatText(Arr[0], width); case 2: case 3: int Text1 = 0, SpaceCount = 0, Text2 = 0; __GetTextSpaceRatio(out Text1, out Text2, out SpaceCount, width, Cols); //Получение соотношения текста и пробелов int Mult; //Кол-во строк string Arr0, Arr1; string Spaces = ""; for (int i = 0; i < SpaceCount; i++) Spaces += ' '; Arr0 = Arr[0]; Arr1 = Arr[1]; if (Cols == 2) { int Text2Length = 0; int MinCol = 1 - MaxCol; bool Flag = MaxCol == 0; if (Flag) while (Arr0.Length % Text1 != 0) //Добиваем с самой большой длиной до кратного TextN Arr0 += ' '; else while (Arr1.Length % Text2 != 0) Arr1 += ' '; MaxLength = (Flag ? Arr0 : Arr1).Length; Mult = MaxLength / (MaxCol == 0 ? Text1 : Text2); //Получает мультипликатор кратности Text2Length = Mult * (MaxCol == 0 ? Text2 : Text1); //Получаем кратную длину для второго текста, зависящую от ширины формата if (Flag) while (Arr1.Length != Text2Length) //Добиваем в другую сторону Arr1 += ' '; else while (Arr0.Length != Text2Length) Arr0 += ' '; for (int i = 0; i < Mult; i++) Out += Arr0.Substring(i * Text1, Text1) + Spaces + Arr1.Substring(i * Text2, Text2) + '\n'; } else { string[] NewArr = new string[] { Arr0, Arr1, Arr[2] }; while (NewArr[MaxCol].Length % ((MaxCol == 0 || MaxCol == 2) ? Text1 : Text2) != 0) { NewArr[MaxCol] += ' '; MaxLength++; } Mult = MaxLength / ((MaxCol == 0 || MaxCol == 2) ? Text1 : Text2); //Получает мультипликатор кратности int Text2Length = Mult * ((MaxCol == 0 || MaxCol == 2) ? Text2 : Text1); if (MaxCol == 1) { while (NewArr[0].Length != Text2Length) NewArr[0] += ' '; while (NewArr[2].Length != Text2Length) NewArr[2] += ' '; } else { while (NewArr[1].Length != Text2Length) NewArr[1] += ' '; if (MaxCol == 0) while (NewArr[2].Length != MaxLength) NewArr[2] += ' '; else while (NewArr[0].Length != MaxLength) NewArr[0] += ' '; } for (int i = 0; i < Mult; i++) Out += NewArr[0].Substring(i * Text1, Text1) + Spaces + NewArr[1].Substring(i * Text2, Text2) + Spaces + NewArr[2].Substring(i * Text1, Text1) + '\n'; } return Out; } return Out; }
private string _FormatList(int width, LoTVDiv List) { string Out = ""; string[] Arr = (string[])List.LoTVDivReturnData(); int Cols = Arr.Length; for (int i = 0; i < Cols; i++) { if (Arr[i].Length + 3 < width) Out += i + 1 + ". " + Arr[i] + '\n'; else { string Row = i + 1 + ". " + Arr[i]; int Mult = Row.Length / width + 1; for (int k = 1; k < Mult; k++) { Row = Row.Insert(width * k + k - 1, "\n"); //k добавляется как дополнительные \n, поэтому -1 Mult = Row.Length / width + 1; } Out += Row + '\n'; } } return Out + '\n'; }
public void LoTVDocAddText() { bool GoodToGo = false; char Sw = ' '; do { LoTVLogics.ColorText("1. Добавить заголовок\n2. Добавить абзац.\n3. Добавить колонку.\n4. Добавить список.", 'a'); try { Console.Write(">> "); Sw = Console.ReadLine().ToLower()[0]; LoTVDiv Div; switch (Sw) { case '1': case '2': LoTVLogics.ColorText("Введите текст: ", 'i'); Div = new LoTVDiv(Console.ReadLine(), (Sw == 1 ? 1 : 2)); Divs.Add(Div); GoodToGo = !AnotherDiv(); break; case '3': case '4': GetInMultiple(Sw, out Div); GoodToGo = !AnotherDiv(); break; default: LoTVLogics.ColorText("Введен недопустимый символ: " + Sw, 'e'); break; } } catch { LoTVLogics.ColorText("Введен недопустимый символ.", 'e'); } } while (!GoodToGo); }
private string _FormatColumns(int width, LoTVDiv Columns) { string Out = ""; string[] Arr = (string[])Columns.LoTVDivReturnData(); int Cols = Arr.Length; //Количество колонок int MaxLength = 0; //Макс длина колонки int MaxCol = 0; if (Cols != 1) for (int i = 0; i < Cols; i++) { int Length = Arr[i].Length; if (Length >= MaxLength) //Так сложно чтобы обращаться к методу N раз, а не 2N { MaxLength = Length; MaxCol = i; } } switch (Cols) { case 1: return __FormatText(Arr[0], width); case 2: case 3: int Text1 = 0, SpaceCount = 0, Text2 = 0; __GetTextSpaceRatio(out Text1, out Text2, out SpaceCount, width, Cols); //========================Здесь творится самая главная магия int Mult; //Кол-во строк string Arr0, Arr1; string Spaces = ""; for (int i = 0; i < SpaceCount; i++) Spaces += ' '; Arr0 = Arr[0]; Arr1 = Arr[1]; //Тут чорная магия для неизменения блоков данных //MaxCol = Arr0.Length >= Arr1.Length ? 0 : 1; if (Cols == 2) { int Text2Length = 0; int MinCol = 1 - MaxCol; bool Flag = MaxCol == 0; if (Flag) while (Arr0.Length % Text1 != 0) //Добиваем с самой большой длиной до кратного TextN Arr0 += ' '; else while (Arr1.Length % Text2 != 0) Arr1 += ' '; MaxLength = (Flag ? Arr0 : Arr1).Length; //Чорная магия Mult = MaxLength / (MaxCol == 0 ? Text1 : Text2); //Получает мультипликатор кратности Text2Length = Mult * (MaxCol == 0 ? Text2 : Text1); //Путем хитрых вычислений получаем кратную длину для второго текста, зависящую от ширины формата if (Flag) while (Arr1.Length != Text2Length) //Добиваем в другую сторону Arr1 += ' '; else while (Arr0.Length != Text2Length) Arr0 += ' '; for (int i = 0; i < Mult; i++) Out += Arr0.Substring(i * Text1, Text1) + Spaces + Arr1.Substring(i * Text2, Text2) + '\n'; //Ну тутай опять же магия } else { string[] NewArr = new string[] {Arr0, Arr1, Arr[2] }; while (NewArr[MaxCol].Length % ((MaxCol == 0 || MaxCol == 2) ? Text1 : Text2) != 0) //Брррррррррр { NewArr[MaxCol] += ' '; MaxLength++; } Mult = MaxLength / ((MaxCol == 0 || MaxCol == 2) ? Text1 : Text2); //Получает мультипликатор кратности int Text2Length = Mult * ((MaxCol == 0 || MaxCol == 2) ? Text2 : Text1); if (MaxCol == 1) { while (NewArr[0].Length != Text2Length) NewArr[0] += ' '; while (NewArr[2].Length != Text2Length) NewArr[2] += ' '; } else { while (NewArr[1].Length != Text2Length) NewArr[1] += ' '; if (MaxCol == 0) while (NewArr[2].Length != MaxLength) NewArr[2] += ' '; else while (NewArr[0].Length != MaxLength) NewArr[0] += ' '; } for (int i = 0; i < Mult; i++) Out += NewArr[0].Substring(i * Text1, Text1) + Spaces + NewArr[1].Substring(i * Text2, Text2) + Spaces + NewArr[2].Substring(i * Text1, Text1) + '\n'; //Ну тутай опять же магия } return Out; } return Out; }
private void GetInMultiple(char Type, out LoTVDiv Div) { LoTVLogics.ColorText((Type == '3') ? "Введите количество колонок (от 1 до 3): " : "Введите количество строк списка: ", 'i'); Div = null; int Num = 0; //Количество строк списка или количество колонок if (Type == '3') { if (Num > 1) _HasMultipleColumns = true; if (Num > _ColumnsCount) _ColumnsCount = Num; //У документа максимальное число колонок должно быть прописано } Console.Write(">> "); if (int.TryParse(Console.ReadLine(), out Num)) { if (Num < 1 || (Type == '3' && Num > 3)) //Обобщение интервала LoTVLogics.ColorText("Неподходящее количество элементов: " + Num, 'e'); else { string[] Arr = new string[Num]; for (int i = 0; i < Num; i++) { LoTVLogics.ColorText("Введите " + (i + 1) + (Type == '3' ? " колонку: " : " элемент списка: "), 'i'); Console.Write(">> "); Arr[i] = Console.ReadLine(); } Div = new LoTVDiv(Arr, Type == '3' ? 3 : 4); Divs.Add(Div); } } else LoTVLogics.ColorText("Введен недопустимый символ", 'e'); }
private string _FormatList(LoTVDiv List) { string Out = " "; string[] Arr = (string[])List.LoTVDivReturnData(); int Cols = Arr.Length; for (int i = 0; i < Cols; i++) Out += i + 1 + ". " + Arr[i] + " "; //!!!!! return Out; }