diff options
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.lua | 108 |
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 |