1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-07-02 17:06:36 +02:00
MLEM/MLEM/Formatting/Obsolete/TextFormatting.cs

141 lines
6.7 KiB
C#
Raw Normal View History

2019-09-06 15:49:59 +02:00
using System;
2019-08-24 00:07:54 +02:00
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MLEM.Extensions;
using MLEM.Font;
using MLEM.Misc;
using MLEM.Textures;
2019-08-24 00:07:54 +02:00
2019-09-06 12:20:53 +02:00
namespace MLEM.Formatting {
2020-05-15 00:34:04 +02:00
[Obsolete("Use the new text formatting system in MLEM.Formatting instead")]
2019-08-24 00:07:54 +02:00
public static class TextFormatting {
2020-04-06 02:20:57 +02:00
public static readonly Dictionary<string, FormattingCode> FormattingCodes = new Dictionary<string, FormattingCode>(StringComparer.OrdinalIgnoreCase);
private static Regex formatRegex;
2019-08-24 00:07:54 +02:00
static TextFormatting() {
SetFormatIndicators('[', ']');
2019-09-06 15:49:59 +02:00
// style codes
FormattingCodes["regular"] = new FormattingCode(TextStyle.Regular);
FormattingCodes["italic"] = new FormattingCode(TextStyle.Italic);
FormattingCodes["bold"] = new FormattingCode(TextStyle.Bold);
FormattingCodes["shadow"] = new FormattingCode(TextStyle.Shadow);
2019-08-24 00:07:54 +02:00
2019-09-06 15:49:59 +02:00
// color codes
2019-08-24 00:07:54 +02:00
var colors = typeof(Color).GetProperties();
foreach (var color in colors) {
if (color.GetGetMethod().IsStatic)
2020-04-06 02:20:57 +02:00
FormattingCodes[color.Name] = new FormattingCode((Color) color.GetValue(null));
2019-08-24 00:07:54 +02:00
}
2019-09-06 15:49:59 +02:00
// animations
FormattingCodes["unanimated"] = new FormattingCode(TextAnimation.Default);
FormattingCodes["wobbly"] = new FormattingCode(TextAnimation.Wobbly);
FormattingCodes["typing"] = new FormattingCode(TextAnimation.Typing);
2019-08-24 00:07:54 +02:00
}
public static void SetFormatIndicators(char opener, char closer) {
// escape the opener and closer so that any character can be used
var op = "\\" + opener;
var cl = "\\" + closer;
// find any text that is surrounded by the opener and closer
formatRegex = new Regex($"{op}[^{op}{cl}]*{cl}");
}
2020-03-28 22:25:06 +01:00
public static string RemoveFormatting(this string s, GenericFont font) {
2019-09-06 15:49:59 +02:00
return formatRegex.Replace(s, match => {
var code = FromMatch(match);
return code != null ? code.GetReplacementString(font) : match.Value;
2019-09-06 15:49:59 +02:00
});
2019-08-24 00:07:54 +02:00
}
2020-03-28 22:25:06 +01:00
public static FormattingCodeCollection GetFormattingCodes(this string s, GenericFont font) {
var codes = new FormattingCodeCollection();
2019-08-24 00:07:54 +02:00
var codeLengths = 0;
foreach (Match match in formatRegex.Matches(s)) {
var code = FromMatch(match);
2019-09-06 15:49:59 +02:00
if (code == null)
continue;
var index = match.Index - codeLengths;
var data = new FormattingCodeData(code, match, index);
if (codes.TryGetValue(index, out var curr)) {
curr.Add(data);
} else {
codes.Add(index, new List<FormattingCodeData> {data});
}
codeLengths += match.Length - code.GetReplacementString(font).Length;
2019-08-24 00:07:54 +02:00
}
return codes;
}
2020-03-28 22:25:06 +01:00
public static void DrawFormattedString(this GenericFont regularFont, SpriteBatch batch, Vector2 pos, string unformattedText, FormattingCodeCollection formatting, Color color, float scale, GenericFont boldFont = null, GenericFont italicFont = null, float depth = 0, TimeSpan timeIntoAnimation = default, FormatSettings formatSettings = null) {
var settings = formatSettings ?? FormatSettings.Default;
var currColor = color;
var currFont = regularFont;
var currStyle = TextStyle.Regular;
var currAnim = TextAnimation.Default;
var animStart = 0;
var innerOffset = new Vector2();
var formatIndex = 0;
2020-02-08 18:29:07 +01:00
foreach (var c in unformattedText) {
// check if the current character's index has a formatting code
if (formatting.TryGetValue(formatIndex, out var codes)) {
foreach (var data in codes) {
var code = data.Code;
// if so, apply it
switch (code.CodeType) {
case FormattingCode.Type.Color:
currColor = code.Color.CopyAlpha(color);
break;
case FormattingCode.Type.Style:
switch (code.Style) {
case TextStyle.Regular:
currFont = regularFont;
break;
case TextStyle.Bold:
currFont = boldFont ?? regularFont;
break;
case TextStyle.Italic:
currFont = italicFont ?? regularFont;
break;
}
currStyle = code.Style;
break;
case FormattingCode.Type.Icon:
code.Icon.SetTime(timeIntoAnimation.TotalSeconds * code.Icon.SpeedMultiplier % code.Icon.TotalTime);
batch.Draw(code.Icon.CurrentRegion, new RectangleF(pos + innerOffset, new Vector2(regularFont.LineHeight * scale)), color, 0, Vector2.Zero, SpriteEffects.None, depth);
break;
case FormattingCode.Type.Animation:
currAnim = code.Animation;
2020-02-08 18:29:07 +01:00
animStart = formatIndex;
break;
}
}
}
var cSt = c.ToString();
if (c == '\n') {
innerOffset.X = 0;
innerOffset.Y += regularFont.LineHeight * scale;
} else {
if (currStyle == TextStyle.Shadow)
2020-02-08 18:29:07 +01:00
currAnim(settings, currFont, batch, unformattedText, formatIndex, animStart, cSt, pos + innerOffset + settings.DropShadowOffset * scale, settings.DropShadowColor, scale, depth, timeIntoAnimation);
currAnim(settings, currFont, batch, unformattedText, formatIndex, animStart, cSt, pos + innerOffset, currColor, scale, depth, timeIntoAnimation);
innerOffset.X += regularFont.MeasureString(cSt).X * scale;
formatIndex++;
}
}
}
private static FormattingCode FromMatch(Capture match) {
2020-04-06 02:20:57 +02:00
var rawCode = match.Value.Substring(1, match.Value.Length - 2);
FormattingCodes.TryGetValue(rawCode, out var val);
return val;
}
2019-08-24 00:07:54 +02:00
}
}