/// <summary> /// Breaks the specified field value into lines that /// do not exceeding the field width, and aligns the text /// on each line according to the specified alignment rules. /// </summary> private static Queue <string> MakeFieldLines( string text, FieldRule fieldRule) { List <string> resultingLines = new List <string>(); // Account for top padding // - resultingLines.AddRange( Enumerable.Repeat(EmptyLine(fieldRule), fieldRule.PaddingTop)); if (fieldRule.LineBreaking == LineBreaking.Anywhere) { resultingLines.AddRange(text .Split(fieldRule.Width) .Select(characters => new string(characters.ToArray()))); } else if (fieldRule.LineBreaking == LineBreaking.Whitespace) { resultingLines.AddRange(text.MakeLinesByWhitespace(fieldRule.Width)); } // Account for bottom padding // - resultingLines.AddRange( Enumerable.Repeat(EmptyLine(fieldRule), fieldRule.PaddingBottom)); return(new Queue <string>(resultingLines.Select(line => { // Account for alignment // - if (fieldRule.Align == Align.Left) { return line.PadRight(fieldRule.Width); } else if (fieldRule.Align == Align.Right) { return line.PadLeft(fieldRule.Width); } else if (fieldRule.Align == Align.Center) { int remainingSpace = fieldRule.Width - line.Length; return " ".Replicate(remainingSpace / 2) + line + " ".Replicate((remainingSpace + 1) / 2); } else { throw new Exception(); } }).Select(line => { // Account for left and right padding // - return line .PadLeft(fieldRule.Width + fieldRule.PaddingLeft) .PadRight(fieldRule.FullWidth); }))); }
/// <summary> /// Gets an empty line with whose width /// is equal to the provided field rule's /// width (excluding any left or right padding). /// </summary> private static string EmptyLine(FieldRule fieldRule) { return(" ".Replicate(fieldRule.Width)); }