1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-11-22 12:58:33 +01:00

Added TextFormatter.StripAllFormatting

This commit is contained in:
Ell 2023-05-19 19:30:45 +02:00
parent 0766220a8e
commit f1740b7b32
3 changed files with 26 additions and 5 deletions

View file

@ -17,6 +17,7 @@ Additions
- Added a simple outline formatting code - Added a simple outline formatting code
- Added the ability to add inverse modifiers to a Keybind - Added the ability to add inverse modifiers to a Keybind
- Added GenericInput collections AllKeys, AllMouseButtons, AllButtons and AllInputs - Added GenericInput collections AllKeys, AllMouseButtons, AllButtons and AllInputs
- Added TextFormatter.StripAllFormatting
Improvements Improvements
- Increased TextFormatter macro recursion limit to 64 - Increased TextFormatter macro recursion limit to 64

View file

@ -214,18 +214,32 @@ namespace MLEM.Formatting {
return ret; return ret;
} }
/// <summary>
/// Strips all formatting codes from the given string, causing a string without any formatting codes to be returned.
/// Note that, if a <see cref="TokenizedString"/> has already been created using <see cref="Tokenize"/>, it is more efficient to use <see cref="TokenizedString.String"/> or <see cref="TokenizedString.DisplayString"/>.
/// </summary>
/// <param name="s">The string to strip formatting codes from.</param>
/// <returns>The stripped string.</returns>
public string StripAllFormatting(string s) {
foreach (var regex in this.Codes.Keys)
s = regex.Replace(s, string.Empty);
return s;
}
private Code GetNextCode(string s, int index, int maxIndex = int.MaxValue) { private Code GetNextCode(string s, int index, int maxIndex = int.MaxValue) {
var (c, m, r) = this.Codes var (constructor, match, regex) = this.Codes
.Select(kv => (c: kv.Value, m: kv.Key.Match(s, index), r: kv.Key)) .Select(kv => (Constructor: kv.Value, Match: kv.Key.Match(s, index), Regex: kv.Key))
.Where(kv => kv.m.Success && kv.m.Index <= maxIndex) .Where(kv => kv.Match.Success && kv.Match.Index <= maxIndex)
.OrderBy(kv => kv.m.Index) .OrderBy(kv => kv.Match.Index)
.FirstOrDefault(); .FirstOrDefault();
return c?.Invoke(this, m, r); return constructor?.Invoke(this, match, regex);
} }
private static string StripFormatting(GenericFont font, string s, IEnumerable<Code> codes) { private static string StripFormatting(GenericFont font, string s, IEnumerable<Code> codes) {
foreach (var code in codes) { foreach (var code in codes) {
#pragma warning disable CS0618 #pragma warning disable CS0618
// this can be combined with StripAllFormatting (which was added after GetReplacementString was deprecated) once GetReplacementString is removed
// (just make this method accept a set of regular expressions, and then call it with all code keys in StripAllFormatting, and the applied codes' regexes in Tokenize)
s = code.Regex.Replace(s, code.GetReplacementString(font)); s = code.Regex.Replace(s, code.GetReplacementString(font));
#pragma warning restore CS0618 #pragma warning restore CS0618
} }

View file

@ -125,6 +125,12 @@ public class FontTests {
Assert.AreEqual(ret.AllCodes.Length, 12); Assert.AreEqual(ret.AllCodes.Length, 12);
} }
[Test]
public void TestStripping() {
var stripped = this.formatter.StripAllFormatting("This is a <b>test string</b></b><b></b> <i>with a lot of</i>content</b><i></b></i> and an <k> invalid code</b> as well<ü>.");
Assert.AreEqual("This is a test string with a lot ofcontent and an <k> invalid code as well<ü>.", stripped);
}
[Test] [Test]
public void TestConsistency() { public void TestConsistency() {
void CompareSizes(string s) { void CompareSizes(string s) {