Aligning text
I needed to write some code in a console app to align what a user was saying, in case it was longer than a line (80 characters):
marcel: blah blah blah a lot of text that doesn't fit in 80 characters more blah
blah blah
long_username: Contrary to popular belief, Lorem Ipsum is not simply random text
. It has roots in a piece of classical Latin literature from 45 B
C, making it over 2000 years old. Richard McClintock, a Latin pro
fessor at Hampden-Sydney College in Virginia, looked up one of th
I wrote the code in two ways: an imperative, mutating style and a functional (recursive) style. I find the second one to be more elegant but since the entire project is something done as a hobby I don't much care about speed; your mileage might vary. I'm also quite certain the first method can be improved but… again, I don't need to do that so it doesn't get done.
As usual, use at your own risk, I don't care about copyrights, blah, blah. Oh, and the result will look bad if the text contains non-printable characters.
private static string Align(string prefix, string text, int length = 80)
{
Debug.Assert(prefix != null);
Debug.Assert(text != null);
Debug.Assert(length > prefix.Length);
var prefixLength = prefix.Length;
var sb = new StringBuilder();
do
{
var limit = Math.Min(text.Length, length - prefixLength);
var current = text.Substring(0, limit);
sb.Append(prefix + current);
prefix = new string(' ', prefixLength);
text = text.Substring(limit);
} while (text != "");
return sb.ToString();
}
private static string Align2(string prefix, string text, int length = 80)
{
Debug.Assert(prefix != null);
Debug.Assert(text != null);
Debug.Assert(length > prefix.Length);
var all = prefix + text;
return all.Length <= length
? all
: all.Substring(0, length) +
Align2(new string(' ', prefix.Length), all.Substring(length), length);
}
Hmm... I think this would be an interesting exercise if I wanted to hire programmers.
Comments