diff --git a/MLEM/Formatting/TokenizedString.cs b/MLEM/Formatting/TokenizedString.cs index 9c7c29b..df3e590 100644 --- a/MLEM/Formatting/TokenizedString.cs +++ b/MLEM/Formatting/TokenizedString.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using MLEM.Font; @@ -18,11 +19,27 @@ namespace MLEM.Formatting { } public void Split(GenericFont font, float width, float scale) { + // a split string has the same character count as the input string + // but with newline characters added var split = font.SplitString(this.String, width, scale); - // remove spaces at the end of new lines since we want the same character count - split = split.Replace(" \n", "\n"); - foreach (var token in this.Tokens) - token.Substring = split.Substring(token.Index, token.Substring.Length); + foreach (var token in this.Tokens) { + var index = 0; + var length = 0; + var ret = new StringBuilder(); + // this is basically a substring function that ignores newlines for indexing + for (var i = 0; i < split.Length; i++) { + // if we're within the bounds of the token's substring, append to the new substring + if (index >= token.Index && length < token.Substring.Length) + ret.Append(split[i]); + // if the current char is not a newline, we simulate length increase + if (split[i] != '\n') { + if (index >= token.Index) + length++; + index++; + } + } + token.Substring = ret.ToString(); + } } public void Draw(GameTime time, SpriteBatch batch, Vector2 pos, GenericFont font, Color color, float scale, float depth) { diff --git a/Sandbox/GameImpl.cs b/Sandbox/GameImpl.cs index aaf627f..bc47c87 100644 --- a/Sandbox/GameImpl.cs +++ b/Sandbox/GameImpl.cs @@ -113,7 +113,7 @@ namespace Sandbox { };*/ var formatter = new TextFormatter(); - var strg = "This is a formatted string with two bits of formatting!"; + var strg = "This is a formatted string with two bits of formatting! It also includesaverylongwordthatisformattedaswell."; this.tokenized = formatter.Tokenize(strg); this.tokenized.Split(font, 400, 1);