summaryrefslogtreecommitdiff
path: root/examples/resources/lib/rune.lua
diff options
context:
space:
mode:
Diffstat (limited to 'examples/resources/lib/rune.lua')
-rw-r--r--examples/resources/lib/rune.lua97
1 files changed, 97 insertions, 0 deletions
diff --git a/examples/resources/lib/rune.lua b/examples/resources/lib/rune.lua
new file mode 100644
index 0000000..5809da3
--- /dev/null
+++ b/examples/resources/lib/rune.lua
@@ -0,0 +1,97 @@
+-- For luaJit compatibility.
+if table.unpack == nil then
+ table.unpack = unpack
+end
+
+local Rune = {}
+Rune.meta = {
+ __index = Rune,
+ __tostring = function( r )
+ return r.string
+ end,
+ __len = function( r )
+ return RL.GetCodepointCount( r.string )
+ end,
+ __eq = function( r1, r2 )
+ return r1.string == r2.string
+ end,
+ __concat = function( a, b )
+ return tostring( a )..tostring( b )
+ end,
+}
+
+function Rune:new( string )
+ if type( string ) == "table" then
+ string = RL.LoadUTF8( string )
+ elseif type( string ) == "nil" then
+ string = ""
+ end
+
+ local object = setmetatable( {}, Rune.meta )
+
+ object.string = string
+
+ return object
+end
+
+function Rune:set( string )
+ if type( string ) == "table" then
+ string = RL.LoadUTF8( string )
+ elseif type( string ) == "nil" then
+ string = ""
+ end
+
+ self.string = string
+end
+
+function Rune:clone()
+ return Rune:new( self.string )
+end
+
+function Rune:len()
+ return RL.GetCodepointCount( self.string )
+end
+
+function Rune:getCodepoints()
+ return RL.LoadCodepoints( self.string )
+end
+
+function Rune:getCodepoint( index )
+ local codepoint = RL.GetCodepoint( self:sub( index, index ) )
+ return codepoint
+end
+
+function Rune:getCodepointSize( index )
+ local _, codepointSize = RL.GetCodepoint( self:sub( index, index ) )
+ return codepointSize
+end
+
+function Rune:insert( pos, string )
+ local codepoints = self:getCodepoints()
+
+ for i, codepoint in ipairs( RL.LoadCodepoints( string ) ) do
+ table.insert( codepoints, pos + i - 1, codepoint )
+ end
+ self.string = RL.LoadUTF8( codepoints )
+end
+
+function Rune:sub( i, j )
+ local codepoints = self:getCodepoints()
+ return RL.LoadUTF8( { table.unpack( codepoints, i, j ) } )
+end
+
+function Rune:gsub( pattern, repl )
+ return string.gsub( self.string, pattern, repl )
+end
+
+function Rune:split( delimiter )
+ local splits = {}
+
+ for str in string.gmatch( self.string, "([^"..delimiter.."]+)" ) do
+ table.insert( splits, str )
+ end
+
+ return splits
+end
+
+return Rune