summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.ustring.lua
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.ustring.lua')
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.ustring.lua108
1 files changed, 108 insertions, 0 deletions
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.ustring.lua b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.ustring.lua
new file mode 100644
index 00000000..0825a738
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.ustring.lua
@@ -0,0 +1,108 @@
+-- Get a fresh copy of the basic ustring
+local old_ustring = package.loaded.ustring
+package.loaded.ustring = nil
+local ustring = require( 'ustring' )
+package.loaded.ustring = old_ustring
+old_ustring = nil
+
+local util = require 'libraryUtil'
+local checkType = util.checkType
+
+local gmatch_init = nil
+local gmatch_callback = nil
+local function php_gmatch( s, pattern )
+ checkType( 'gmatch', 1, s, 'string' )
+ checkType( 'gmatch', 2, pattern, 'string' )
+
+ local re, capt = gmatch_init( s, pattern )
+ local pos = 0
+ return function()
+ local ret
+ pos, ret = gmatch_callback( s, re, capt, pos )
+ return unpack( ret )
+ end, nil, nil
+end
+
+local gcodepoint_init = nil
+local function php_gcodepoint( s, i, j )
+ checkType( 'gcodepoint', 1, s, 'string' )
+ checkType( 'gcodepoint', 2, i, 'number', true )
+ checkType( 'gcodepoint', 3, j, 'number', true )
+ local cp = gcodepoint_init( s, i, j or -1 )
+ local pos, len = 1, #cp
+ return function ()
+ if pos <= len then
+ local tmp = cp[pos]
+ pos = pos + 1
+ return tmp
+ end
+ end
+end
+
+function ustring.setupInterface( opt )
+ -- Boilerplate
+ ustring.setupInterface = nil
+
+ -- Set string limits
+ ustring.maxStringLength = opt.stringLengthLimit
+ ustring.maxPatternLength = opt.patternLengthLimit
+
+ -- Gmatch
+ if mw_interface.gmatch_callback and mw_interface.gmatch_init then
+ gmatch_init = mw_interface.gmatch_init
+ gmatch_callback = mw_interface.gmatch_callback
+ ustring.gmatch = php_gmatch
+ end
+ mw_interface.gmatch_init = nil
+ mw_interface.gmatch_callback = nil
+
+ -- codepoint and gcodepoint
+ if mw_interface.gcodepoint_init then
+ gcodepoint_init = mw_interface.gcodepoint_init
+ ustring.gcodepoint = php_gcodepoint
+ end
+ mw_interface.gcodepoint_init = nil
+
+ -- Replace pure-lua implementation with php callbacks
+ local nargs = {
+ char = 0,
+ find = 2,
+ match = 2,
+ gsub = 3,
+ }
+ for k, v in pairs( mw_interface ) do
+ local n = nargs[k] or 1
+ if n == 0 then
+ ustring[k] = v
+ else
+ -- Avoid PHP warnings for missing arguments by checking before
+ -- calling PHP.
+ ustring[k] = function ( ... )
+ if select( '#', ... ) < n then
+ error( "too few arguments to mw.ustring." .. k, 2 )
+ end
+ return v( ... )
+ end
+ end
+ end
+ mw_interface = nil
+
+ -- Replace upper/lower with mw.language versions if available
+ if mw and mw.language then
+ local lang = mw.language.getContentLanguage()
+ ustring.upper = function ( s )
+ return lang:uc( s )
+ end
+ ustring.lower = function ( s )
+ return lang:lc( s )
+ end
+ end
+
+ -- Register this library in the "mw" global
+ mw = mw or {}
+ mw.ustring = ustring
+
+ package.loaded['mw.ustring'] = ustring
+end
+
+return ustring