aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/notenoughupdates/util/textutil.kt
diff options
context:
space:
mode:
authornea <romangraef@gmail.com>2022-09-28 12:45:56 +0200
committernea <romangraef@gmail.com>2022-09-28 12:45:56 +0200
commit4d73331a449f0b0647066f7dde0628730fe0e178 (patch)
tree047f463e13d14ea6cf9c8b37602a756f6880f9a0 /src/main/kotlin/moe/nea/notenoughupdates/util/textutil.kt
parentec66c82198fe2d61d699d553c1254f08b43fcc65 (diff)
downloadfirmament-4d73331a449f0b0647066f7dde0628730fe0e178.tar.gz
firmament-4d73331a449f0b0647066f7dde0628730fe0e178.tar.bz2
firmament-4d73331a449f0b0647066f7dde0628730fe0e178.zip
Fairy souls
Diffstat (limited to 'src/main/kotlin/moe/nea/notenoughupdates/util/textutil.kt')
-rw-r--r--src/main/kotlin/moe/nea/notenoughupdates/util/textutil.kt70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/main/kotlin/moe/nea/notenoughupdates/util/textutil.kt b/src/main/kotlin/moe/nea/notenoughupdates/util/textutil.kt
new file mode 100644
index 0000000..ac640be
--- /dev/null
+++ b/src/main/kotlin/moe/nea/notenoughupdates/util/textutil.kt
@@ -0,0 +1,70 @@
+package moe.nea.notenoughupdates.util
+
+import net.minecraft.text.LiteralTextContent
+import net.minecraft.text.Text
+import net.minecraft.text.TextContent
+import moe.nea.notenoughupdates.NotEnoughUpdates
+
+
+class TextMatcher(text: Text) {
+ data class State(
+ var iterator: MutableList<Text>,
+ var currentText: Text?,
+ var offset: Int,
+ var textContent: String,
+ )
+
+ var state = State(
+ mutableListOf(text),
+ null,
+ 0,
+ ""
+ )
+
+ fun pollChunk(): Boolean {
+ val firstOrNull = state.iterator.removeFirstOrNull() ?: return false
+ state.offset = 0
+ state.currentText = firstOrNull
+ state.textContent = when (val content = firstOrNull.content) {
+ is LiteralTextContent -> content.string
+ TextContent.EMPTY -> ""
+ else -> {
+ NotEnoughUpdates.logger.warn("TextContent of type ${content.javaClass} not understood.")
+ return false
+ }
+ }
+ state.iterator.addAll(0, firstOrNull.siblings)
+ return true
+ }
+
+ fun pollChunks(): Boolean {
+ while (state.offset !in state.textContent.indices) {
+ if (!pollChunk()) {
+ return false
+ }
+ }
+ return true
+ }
+
+ fun pollChar(): Char? {
+ if (!pollChunks()) return null
+ return state.textContent[state.offset++]
+ }
+
+
+ fun expectString(string: String): Boolean {
+ var found = ""
+ while (found.length < string.length) {
+ if (!pollChunks()) return false
+ val takeable = state.textContent.drop(state.offset).take(string.length - found.length)
+ state.offset += takeable.length
+ found += takeable
+ }
+ return found == string
+ }
+}
+
+
+val Text.unformattedString
+ get() = string.replace("ยง.".toRegex(), "")
+