--!strict local Constants = require(script.Parent.Constants) local Types = require(script.Parent.Types) local Tokenizer = {} function Tokenizer.ResolveImage(Name: string): string? return Constants.Images[Name] end function Tokenizer.Tokenize(Text: string): { Types.Segment } local Segments: { Types.Segment } = {} local Cursor = 1 local Length = #Text while Cursor <= Length do local TokenStart, TokenEnd, Name = string.find(Text, Constants.TokenPattern, Cursor) if not TokenStart or not TokenEnd or not Name then table.insert(Segments, { Kind = "Text", Value = string.sub(Text, Cursor) }) break end if Tokenizer.ResolveImage(Name) then if TokenStart > Cursor then table.insert(Segments, { Kind = "Text", Value = string.sub(Text, Cursor, TokenStart - 1) }) end table.insert(Segments, { Kind = "Image", Value = Name }) else table.insert(Segments, { Kind = "Text", Value = string.sub(Text, Cursor, TokenEnd) }) end Cursor = TokenEnd + 1 end return Segments end function Tokenizer.ContainsImage(Segments: { Types.Segment }): boolean for _, Segment in Segments do if Segment.Kind == "Image" then return true end end return false end function Tokenizer.JoinText(Segments: { Types.Segment }): string local Pieces: { string } = {} for _, Segment in Segments do if Segment.Kind == "Text" then table.insert(Pieces, Segment.Value) end end return table.concat(Pieces) end return Tokenizer