Module:StringCompare

local p = {}

-- compares arguments [1] and [2] -- returns -1, 0, 1 -- ci=1 		case-insensitive comparison -- versions=1	splits on whitespace and compares tokens alphabetically, -- 					except when tokens are all digits/periods, --					in which case it splits the token on the period and compares the numbers numerically.

function p.base( ... )

p.current_frame = mw.getCurrentFrame

local args = { ... }	if args[1] == p.current_frame then args = require( 'Module:ProcessArgs' ).merge( true ) else args = args[1] end if args[1] == nil then return 0 end if args[2] == nil then return 0 end

local a = ( args[1] .. '' ):lower local b = ( args[2] .. '' ):lower if args.ci ~= nil and args.ci ~= false then a = a:lower b = b:lower end

if args.versions ~= nil and args.versions ~= false then local a_tokens = {} local b_tokens = {} for t in string.gmatch(a,"%S+") do table.insert( a_tokens, t ) end for t in string.gmatch(b,"%S+") do table.insert( b_tokens, t ) end for i, a_token in pairs(a_tokens) do			if b_tokens[i] == nil then return 1 end local b_token = b_tokens[i] local a_token_is_ver = ( string.find(a_token,"^[%d%.]+$") ~= nil ) local b_token_is_ver = ( string.find(b_token,"^[%d%.]+$") ~= nil ) if a_token_is_ver and b_token_is_ver then local a_nums = {} local b_nums = {} for t in string.gmatch(a_token,"%d+") do table.insert( a_nums, t ) end for t in string.gmatch(b_token,"%d+") do table.insert( b_nums, t ) end for j, a_num in pairs(a_nums) do					if b_nums[j] == nil then return 1 end local b_num = b_nums[j] if tonumber(a_num) < tonumber(b_num) then return -1 end if tonumber(a_num) > tonumber(b_num) then return 1 end end if #a_nums < #b_nums then return -1 end else if a_token < b_token then return -1 end if a_token > b_token then return 1 end end end if #a_tokens < #b_tokens then return -1 end return 0 end

if a < b then return -1 end if a > b then return 1 end if a == b then return 0 end end

return p