feat: support emphasis

This commit is contained in:
Anna 2024-06-19 10:20:18 -04:00
parent 6f9c96c174
commit f93beb4133
Signed by: anna
GPG Key ID: D0943384CD9F87D1
2 changed files with 54 additions and 9 deletions

View File

@ -1,4 +1,6 @@
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Hooking;
@ -12,7 +14,7 @@ using YamlDotNet.Serialization.NamingConventions;
namespace TimePasses;
public class Plugin : IDalamudPlugin {
public sealed class Plugin : IDalamudPlugin {
[PluginService]
internal static IPluginLog Log { get; set; }
@ -61,7 +63,7 @@ public class Plugin : IDalamudPlugin {
await this.Mutex.WaitAsync();
try {
this.Data = Plugin.Deserializer.Deserialize<DataFile>(yaml);
this.ReplacementPointers.Clear();
this.ResetReplacementPointers();
} finally {
this.Mutex.Release();
}
@ -72,11 +74,7 @@ public class Plugin : IDalamudPlugin {
this.GetBalloonRowHook?.Dispose();
this.Client.Dispose();
this.Mutex.Dispose();
foreach (var (_, ptr) in this.ReplacementPointers) {
Marshal.FreeHGlobal(ptr);
}
this.ReplacementPointers.Clear();
this.ResetReplacementPointers();
}
private nint GetBalloonRowDetour(uint rowId) {
@ -121,13 +119,47 @@ public class Plugin : IDalamudPlugin {
var lines = text
.ReplaceLineEndings("\n")
.Split('\n');
var sb = new StringBuilder();
var seStringBuilder = new SeStringBuilder();
for (var i = 0; i < lines.Length; i++) {
if (i != 0) {
seStringBuilder.Add(NewLinePayload.Payload);
}
seStringBuilder.AddText(lines[i].TrimEnd());
var line = lines[i]
.TrimEnd()
.Replace("<em>", Markers.EmphasisOn.ToString())
.Replace("</em>", Markers.EmphasisOff.ToString());
void Append() {
if (sb.Length == 0) {
return;
}
seStringBuilder.AddText(sb.ToString());
sb.Clear();
}
foreach (var ch in lines[i].TrimEnd()) {
switch (ch) {
case Markers.EmphasisOn: {
Append();
seStringBuilder.AddItalicsOn();
break;
}
case Markers.EmphasisOff: {
Append();
seStringBuilder.AddItalicsOff();
break;
}
default: {
sb.Append(ch);
break;
}
}
}
Append();
}
var textBytes = seStringBuilder.Encode();
@ -150,6 +182,14 @@ public class Plugin : IDalamudPlugin {
}
}
}
private void ResetReplacementPointers() {
foreach (var (_, ptr) in this.ReplacementPointers) {
Marshal.FreeHGlobal(ptr);
}
this.ReplacementPointers.Clear();
}
}
[Serializable]
@ -162,3 +202,8 @@ internal class DataFile {
public class Definitions {
public uint[] Quests { get; init; }
}
internal static class Markers {
internal const char EmphasisOn = '\uf000';
internal const char EmphasisOff = '\uf001';
}

View File

@ -86,7 +86,7 @@ replacements:
greaterThan: 49
text: |-
Bet beasties never
give you any trouble.
give <em>you</em> any trouble.
- level:
greaterThan: 29
text: |-