vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
local MAJOR_VERSION = "Core 1.1"
local MINOR_VERSION = tonumber(string.sub("$Revision: 2023 $", 12, -3))

if BabbleLib and BabbleLib.versions[MAJOR_VERSION] and BabbleLib.versions[MAJOR_VERSION].minor >= MINOR_VERSION then
        return
end

local locale = GetLocale and GetLocale() or "enUS"
if locale ~= "frFR" and locale ~= "deDE" and locale ~= "zhCN" then
        locale = "enUS"
end

-------------IRIEL'S-STUB-CODE--------------
local stub = {};

-- Instance replacement method, replace contents of old with that of new
function stub:ReplaceInstance(old, new)
   for k,v in pairs(old) do old[k]=nil; end
   for k,v in pairs(new) do old[k]=v; end
end

-- Get a new copy of the stub
function stub:NewStub()
  local newStub = {};
  self:ReplaceInstance(newStub, self);
  newStub.lastVersion = '';
  newStub.versions = {};
  return newStub;
end

-- Get instance version
function stub:GetInstance(version)
   if (not version) then version = self.lastVersion; end
   local versionData = self.versions[version];
   if (not versionData) then
      message("Cannot find library instance with version '" 
              .. version .. "'");
      return;
   end
   return versionData.instance;
end

-- Register new instance
function stub:Register(newInstance)
   local version,minor = newInstance:GetLibraryVersion();
   self.lastVersion = version;
   local versionData = self.versions[version];
   if (not versionData) then
      -- This one is new!
      versionData = { instance = newInstance,
         minor = minor,
         old = {} 
      };
      self.versions[version] = versionData;
      newInstance:LibActivate(self);
      return newInstance;
   end
   if (minor <= versionData.minor) then
      -- This one is already obsolete
      if (newInstance.LibDiscard) then
         newInstance:LibDiscard();
      end
      return versionData.instance;
   end
   -- This is an update
   local oldInstance = versionData.instance;
   local oldList = versionData.old;
   versionData.instance = newInstance;
   versionData.minor = minor;
   local skipCopy = newInstance:LibActivate(self, oldInstance, oldList);
   table.insert(oldList, oldInstance);
   if (not skipCopy) then
      for i, old in ipairs(oldList) do
         self:ReplaceInstance(old, newInstance);
      end
   end
   return newInstance;
end

-- Bind stub to global scope if it's not already there
if (not BabbleLib) then
   BabbleLib = stub:NewStub();
end

-- Nil stub for garbage collection
stub = nil;
-----------END-IRIEL'S-STUB-CODE------------

local function assert(condition, message)
        if not condition then
                local stack = debugstack()
                local first = string.gsub(stack, "\n.*", "")
                local file = string.gsub(first, "^(.*\\.*).lua:%d+: .*", "%1")
                file = string.gsub(file, "([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
                if not message then
                        local _,_,second = string.find(stack, "\n(.-)\n")
                        message = "assertion failed! " .. second
                end
                message = "BabbleLib-Core: " .. message
                local i = 1
                for s in string.gfind(stack, "\n(.-)\n") do
                        i = i + 1
                        if not string.find(s, file .. "%.lua:%d+:") then
                                error(message, i)
                                return
                        end
                end
                print('bravo')
                error(message, 2)
                return
        end
        return condition
end

local lib = {}

do
        local sequences = {
                ["%d*d"] = "%%d+",
                ["s"] = ".+",
                ["[fg]"] = "%%d+%%.%%d+",
                ["%.%d[fg]"] = "%%d+%%.%%d+",
                ["c"] = ".",
        }
        local curries = {}
        
        local function doNothing(item)
                return item
        end
        local v = {}
        
        local function concat(a1, a2, a3, a4)
                local left, right
                if not a2 then
                        return a1
                elseif not a3 then
                        left, right = a1, a2
                elseif not a4 then
                        return concat(concat(a1, a2), a3)
                else
                        return concat(concat(concat(a1, a2), a3), a4)
                end
                if not string.find(left, "%%1%$") and not string.find(right, "%%1%$") then
                        return left .. right
                elseif not string.find(right, "%%1%$") then
                        local i
                        for j = 9, 1, -1 do
                                if string.find(left, "%%" .. j .. "%$") then
                                        i = j
                                        break
                                end
                        end
                        while true do
                                local first
                                local firstPat
                                for x, y in pairs(sequences) do
                                        local i = string.find(right, "%%" .. x)
                                        if not first or (i and i < first) then
                                                first = i
                                                firstPat = x
                                        end
                                end
                                if not first then
                                        break
                                end
                                i = i + 1
                                right = string.gsub(right, "%%(" .. firstPat .. ")", "%%" .. i .. "$%1")
                        end
                        return left .. right
                elseif not string.find(left, "%%1%$") then
                        local i = 1
                        while true do
                                local first
                                local firstPat
                                for x, y in pairs(sequences) do
                                        local i = string.find(left, "%%" .. x)
                                        if not first or (i and i < first) then
                                                first = i
                                                firstPat = x
                                        end
                                end
                                if not first then
                                        break
                                end
                                i = i + 1
                                left = string.gsub(left, "%%(" .. firstPat .. ")", "%%" .. i .. "$%1")
                        end
                        return concat(left, right)
                else
                        local i
                        for j = 9, 1, -1 do
                                if string.find(left, "%%" .. j .. "%$") then
                                        i = j
                                        break
                                end
                        end
                        local j
                        for k = 9, 1, -1 do
                                if string.find(right, "%%" .. k .. "%$") then
                                        j = k
                                        break
                                end
                        end
                        for k = j, 1, -1 do
                                right = string.gsub(right, "%%" .. k .. "%$", "%%" .. k + i .. "%$")
                        end
                        return left .. right
                end
        end
        
        local function Curry(a1, a2, a3, a4)
                local pattern = concat(a1, a2, a3, a4)
                assert(pattern, "No pattern given")
                if not string.find(pattern, "%%1%$") then
                        local unpattern = string.gsub(pattern, "([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
                        local f = {}
                        local i = 0
                        while true do
                                local first
                                local firstPat
                                for x, y in pairs(sequences) do
                                        local i = string.find(unpattern, "%%%%" .. x)
                                        if not first or (i and i < first) then
                                                first = i
                                                firstPat = x
                                        end
                                end
                                if not first then
                                        break
                                end
                                unpattern = string.gsub(unpattern, "%%%%" .. firstPat, "(" .. sequences[firstPat] .. ")", 1)
                                i = i + 1
                                if firstPat == "c" or firstPat == "s" then
                                        table.insert(f, doNothing)
                                else
                                        table.insert(f, tonumber)
                                end
                        end
                        unpattern = "^" .. unpattern .. "$"
                        local _,alpha, bravo, charlie, delta, echo, foxtrot, golf, hotel, india
                        if i == 0 then
                                return
                        elseif i == 1 then
                                return function(text)
                                        _,_,alpha = string.find(text, unpattern)
                                        if alpha then
                                                return f[1](alpha)
                                        end
                                end
                        elseif i == 2 then
                                return function(text)
                                        _,_,alpha, bravo = string.find(text, unpattern)
                                        if alpha then
                                                return f[1](alpha), f[2](bravo)
                                        end
                                end
                        elseif i == 3 then
                                return function(text)
                                        _,_,alpha, bravo, charlie = string.find(text, unpattern)
                                        if alpha then
                                                return f[1](alpha), f[2](bravo), f[3](charlie)
                                        end
                                end
                        elseif i == 4 then
                                return function(text)
                                        _,_,alpha, bravo, charlie, delta = string.find(text, unpattern)
                                        if alpha then
                                                return f[1](alpha), f[2](bravo), f[3](charlie), f[4](delta)
                                        end
                                end
                        elseif i == 5 then
                                return function(text)
                                        _,_,alpha, bravo, charlie, delta, echo = string.find(text, unpattern)
                                        if alpha then
                                                return f[1](alpha), f[2](bravo), f[3](charlie), f[4](delta), f[5](echo)
                                        end
                                end
                        elseif i == 6 then
                                return function(text)
                                        _,_,alpha, bravo, charlie, delta, echo, foxtrot = string.find(text, unpattern)
                                        if alpha then
                                                return f[1](alpha), f[2](bravo), f[3](charlie), f[4](delta), f[5](echo), f[6](foxtrot)
                                        end
                                end
                        elseif i == 7 then
                                return function(text)
                                        _,_,alpha, bravo, charlie, delta, echo, foxtrot, golf = string.find(text, unpattern)
                                        if alpha then
                                                return f[1](alpha), f[2](bravo), f[3](charlie), f[4](delta), f[5](echo), f[6](foxtrot), f[7](golf)
                                        end
                                end
                        elseif i == 8 then
                                return function(text)
                                        _,_,alpha, bravo, charlie, delta, echo, foxtrot, golf, hotel = string.find(text, unpattern)
                                        if alpha then
                                                return f[1](alpha), f[2](bravo), f[3](charlie), f[4](delta), f[5](echo), f[6](foxtrot), f[7](golf), f[8](hotel)
                                        end
                                end
                        else
                                return function(text)
                                        _,_,alpha, bravo, charlie, delta, echo, foxtrot, golf, hotel, india = string.find(text, unpattern)
                                        if alpha then
                                                return f[1](alpha), f[2](bravo), f[3](charlie), f[4](delta), f[5](echo), f[6](foxtrot), f[7](golf), f[8](hotel), f[9](india)
                                        end
                                end
                        end
                else
                        local o = {}
                        local f = {}
                        local unpattern = string.gsub(pattern, "([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
                        local i = 1
                        while true do
                                local pat
                                for x, y in pairs(sequences) do
                                        if not pat and string.find(unpattern, "%%%%" .. i .. "%%%$" .. x) then
                                                pat = x
                                                break
                                        end
                                end
                                if not pat then
                                        break
                                end
                                unpattern = string.gsub(unpattern, "%%%%" .. i .. "%%%$" .. pat, "(" .. sequences[pat] .. ")", 1)
                                if pat == "c" or pat  == "s" then
                                        table.insert(f, doNothing)
                                else
                                        table.insert(f, tonumber)
                                end
                                i = i + 1
                        end
                        i = 1
                        string.gsub(pattern, "%%(%d)%$", function(w) o[i] = tonumber(w); i = i + 1; end)
                        v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9] = nil
                        for x, y in pairs(f) do
                                v[x] = f[y]
                        end
                        for x, y in pairs(v) do
                                f[x] = v[x]
                        end
                        unpattern = "^" .. unpattern .. "$"
                        i = i - 1
                        if i == 0 then
                                return function(text)
                                        return
                                end
                        elseif i == 1 then
                                return function(text)
                                        _,_,v[1] = string.find(text, unpattern)
                                        if v[1] then
                                                return f[1](v[1])
                                        end
                                end
                        elseif i == 2 then
                                return function(text)
                                        _,_,v[1],v[2] = string.find(text, unpattern)
                                        if v[1] then
                                                return f[1](v[o[1]]), f[2](v[o[2]])
                                        end
                                end
                        elseif i == 3 then
                                return function(text)
                                        _,_,v[1],v[2],v[3] = string.find(text, unpattern)
                                        if v[1] then
                                                return f[1](v[o[1]]), f[2](v[o[2]]), f[3](v[o[3]])
                                        end
                                end
                        elseif i == 4 then
                                return function(text)
                                        _,_,v[1],v[2],v[3],v[4] = string.find(text, unpattern)
                                        if v[1] then
                                                return f[1](v[o[1]]), f[2](v[o[2]]), f[3](v[o[3]]), f[4](v[o[4]])
                                        end
                                end
                        elseif i == 5 then
                                return function(text)
                                        _,_,v[1],v[2],v[3],v[4],v[5] = string.find(text, unpattern)
                                        if v[1] then
                                                return f[1](v[o[1]]), f[2](v[o[2]]), f[3](v[o[3]]), f[4](v[o[4]]), f[5](v[o[5]])
                                        end
                                end
                        elseif i == 6 then
                                return function(text)
                                        _,_,v[1],v[2],v[3],v[4],v[5],v[6] = string.find(text, unpattern)
                                        if v[1] then
                                                return f[1](v[o[1]]), f[2](v[o[2]]), f[3](v[o[3]]), f[4](v[o[4]]), f[5](v[o[5]]), f[6](v[o[6]])
                                        end
                                end
                        elseif i == 7 then
                                return function(text)
                                        _,_,v[1],v[2],v[3],v[4],v[5],v[6],v[7] = string.find(text, unpattern)
                                        if v[1] then
                                                return f[1](v[o[1]]), f[2](v[o[2]]), f[3](v[o[3]]), f[4](v[o[4]]), f[5](v[o[5]]), f[6](v[o[6]]), f[7](v[o[7]])
                                        end
                                end
                        elseif i == 8 then
                                return function(text)
                                        _,_,v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8] = string.find(text, unpattern)
                                        if v[1] then
                                                return f[1](v[o[1]]), f[2](v[o[2]]), f[3](v[o[3]]), f[4](v[o[4]]), f[5](v[o[5]]), f[6](v[o[6]]), f[7](v[o[7]]), f[8](v[o[8]])
                                        end
                                end
                        else
                                return function(text)
                                        _,_,v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9] = string.find(text, unpattern)
                                        if v[1] then
                                                return f[1](v[o[1]]), f[2](v[o[2]]), f[3](v[o[3]]), f[4](v[o[4]]), f[5](v[o[5]]), f[6](v[o[6]]), f[7](v[o[7]]), f[8](v[o[8]]), f[9](v[o[9]])
                                        end
                                end
                        end
                end
        end
        
        function lib:Deformat(text, a1, a2, a3, a4)
                local pattern = a1
                if a4 then
                        pattern = string.format("%s%s%s%s", a1, a2, a3, a4)
                elseif a3 then
                        pattern = string.format("%s%s%s", a1, a2, a3)
                elseif a2 then
                        pattern = a1 .. a2
                end
                assert(pattern, "No pattern given")
                if curries[pattern] == nil then
                        curries[pattern] = Curry(a1, a2, a3, a4)
                end
                return curries[pattern](text)
        end
end

function lib:GetLibraryVersion()
        return MAJOR_VERSION, MINOR_VERSION
end

function lib:LibActivate(stub, oldLib, oldList)
end

function lib:LibDeactivate()
end

BabbleLib:Register(lib)
lib = nil