vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[

Sea Print (Sea.io)

A Mini-Library for standardized print functions.

Compiler:
        AnduinLothar (karlkfi@cosmosui.org)

==Installation/Utilization==

Embedding:
- Drop the SeaPrint folder into your Interface\AddOns\YourAddon\ folder
- Add Sea and SeaPrint as optional dependancies
- Add the following line to the end of your TOC file, before your addon files:
SeaPrint\ SeaPrint.lua

Standard:
- Drop the SeaPrint folder into your Interface\AddOns\ directory
- Add SeaPrint a required dependancy


Change Log:
v0.2
- Added makeHyperlink
- Changed lua file name
v0.1 (Alpha)
- SeaPrint Forked into Mini-Library from the main Sea. Still backwards compatible.


        $LastChangedBy: karlkfi $
        $Rev: 2577 $
        $Date: 2005-10-10 14:44:01 -0700 (Mon, 10 Oct 2005) $
]]--

local SEA_PRINT_VERSION = 0.20;
local loadThisEmbeddedInstance;

------------------------------------------------------------------------------
--[[ Embedded Sub-Library Load Algorithm ]]--
------------------------------------------------------------------------------

if(not Sea) then
        Sea = {};
        Sea.versions = {};
        Sea.versions.SeaPrint = SEA_PRINT_VERSION;
        loadThisEmbeddedInstance = true;
        Sea.io = {};
else
        if(not Sea.versions) then
                Sea.versions = {};
        end
        if (not Sea.versions.SeaPrint) or (Sea.versions.SeaPrint < SEA_PRINT_VERSION) then
                Sea.versions.SeaPrint = SEA_PRINT_VERSION;
                loadThisEmbeddedInstance = true;
        end
        if(not Sea.io) then
                Sea.io = {};
        end
end


if (loadThisEmbeddedInstance) then
        loadThisEmbeddedInstance = nil;

------------------------------------------------------------------------------
        --[[ Variables ]]--
------------------------------------------------------------------------------
        
        SEA_DEBUG = false;
        SEA_ERROR = false;

        -- Default chat frame set to ChatFrame1
        Sea.io.DEFAULT_PRINT_FRAME = ChatFrame1;
        
        -- Default error frame set to ChatFrame1
        Sea.io.DEFAULT_ERROR_FRAME = ChatFrame1;

                -- Default banner frame
        Sea.io.DEFAULT_BANNER_FRAME = UIErrorsFrame;

        -- Default color scheme
        Sea.io.DEFAULT_ERROR_COLOR = RED_FONT_COLOR;
        Sea.io.DEFAULT_PRINT_COLOR = NORMAL_FONT_COLOR;

        -- Default Debug Tag
        Sea.io.debugKey = "SEA_DEBUG";

        -- Default Error Tag
        Sea.io.errorKey = "SEA_ERROR";
        
        -- Recursive check
        Sea.io.recursed = false;
        
------------------------------------------------------------------------------
        --[[ Helper Functions ]]--
------------------------------------------------------------------------------
        
        --local func from SeaString
        local byteString;
        if (Sea.string and Sea.string.byte) then
                byteString = Sea.string.byte;
        else
                byteString = function(c) return format("<%02X>",string.byte(c)) end;
        end
        
        -- 
        -- join(list, separator)
        --
        -- Arguments: 
        --      (table list, String separator)
        --      list    - table of things to join
        --      separator       - the separator to place between objects
        --
        -- Returns:
        --      (string joinedstring)
        --      joinedstring - the list.toString() joined by separator(s)
        -- 
        -- Written by Thott (thott@thottbot.com)
        Sea.io.join = function (list, separator)
                -- Type check
                if ( not list or type(list) ~= "table" ) then 
                        ChatFrame1:AddMessage("Non-table passed to Sea.io.join");
                        return;
                end
                if ( separator == nil ) then separator = ""; end
                
                local i;
                local c = "";
                local msg = "";
                local currType;
                for i,v in list do
                        if ( tonumber(i) ) then
                                currType = type(v);
                                if( currType == "string" and currType == "number") then
                                        msg = msg .. c .. v;
                                else
                                        msg = msg .. c .. "(" .. tostring(v) .. ")";
                                end
                                c = separator;
                        end
                end
                return msg;             
        end
        
        --Alias
        if (not Sea.util) then
                Sea.util = {};
        end
        Sea.util.join = Sea.io.join;
        if (not Sea.string) then
                Sea.string = {};
        end
        Sea.string.join = Sea.io.join;

------------------------------------------------------------------------------
        --[[ Standard Prints ]]--
------------------------------------------------------------------------------  
        
        --
        -- print ( ... )
        --
        -- Arguments
        --      () arg
        --      arg - the values to be printed
        --
        -- Returns
        --      (nil)
        --
        Sea.io.print = function(...) 
                Sea.io.printf(nil, unpack(arg));
        end

        --
        -- banner ( ... )
        --
        -- Arguments
        --      () arg
        --      arg - the values to be printed
        --
        -- Returns
        --      (nil)
        --
        Sea.io.banner = function(...) 
                Sea.io.printf(Sea.io.DEFAULT_BANNER_FRAME, unpack(arg));
        end     

        --
        -- error (...)
        --
        --      prints just like Sea.io.print, except as an error
        --
        -- Arguments:
        --      ()  arg
        --      arg - contains all error output
        --
        Sea.io.error = function(...)
                Sea.io.errorfc(nil, nil, unpack(arg) );
        end

        --
        -- dprint (string debugkey, ...)
        --
        --      prints a message when getglobal(debugkey) is true
        --
        -- Arguments:
        --      (string debugkey) arg
        --
        Sea.io.dprint = function ( debugKey, ... )
                Sea.io.dprintf(debugKey, Sea.io.DEFAULT_PRINT_FRAME, unpack(arg));
        end


        --
        -- dprintc (string debugkey, Table[r,g,b] color, ...)
        --
        --      prints a message when getglobal(debugkey) is true
        --      in the color specified by color
        --
        -- Arguments:
        --      (string debugkey, Table[r,g,b] color) arg
        --
        Sea.io.dprintc = function ( debugKey, color, ... )
                Sea.io.dprintfc(debugKey, Sea.io.DEFAULT_PRINT_FRAME, color,  unpack(arg));
        end

        --
        -- derror (string errorKey, ...)
        --
        --      prints an error when getglobal(errorKey) is true
        --
        -- Arguments:
        --      (string errorKey) arg
        --
        Sea.io.derror = function ( errorKey, ... )
                Sea.io.derrorf(errorKey, Sea.io.DEFAULT_ERROR_FRAME, unpack(arg));
        end

        --
        -- derrorf (string errorKey, MessageFrame frame, ...)
        --
        --      prints an error when getglobal(errorKey) is true
        --
        -- Arguments:
        --      (string errorKey, MessageFrame frame) arg
        --
        Sea.io.derrorf = function ( errorKey, frame, ... )
                Sea.io.derrorfc(errorKey, frame, Sea.io.DEFAULT_ERROR_COLOR, unpack(arg));
        end
        
        --
        -- derrorc (string errorKey, Table[r,g,b] color, ...)
        --
        --      prints an error when getglobal(errorKey) is true
        --      in the color specified by color
        --
        -- Arguments:
        --      (string errorKey, Table[r,g,b] color) arg
        --
        Sea.io.derrorc = function ( errorKey, color, ... )
                Sea.io.derrorfc(errorKey, Sea.io.DEFAULT_ERROR_FRAME, color, unpack(arg));
        end

        --
        -- derrorfc (string errorKey, MessageFrame frame, Table[r,g,b] color, ...)
        --
        --      prints an error when getglobal(errorKey) is true
        --      in the frame specified, in the color specified
        --
        -- Arguments:
        --      (string errorKey, MessageFrame frame, Table[r,g,b] color) arg
        --      
        --
        Sea.io.derrorfc = function ( errorKey, frame, color, ... )
                if ( type(errorKey) ~= "string" ) then
                        if ( type(errorKey) == "nil" ) then 
                                errorKey = Sea.io.errorKey;
                        else
                                --Sea.io.error("Invalid error key. Type: ", type(errorKey));
                        end
                end
                if ( getglobal(errorKey) == true ) then 
                        Sea.io.errorfc(frame, color, unpack(arg));
                end
        end
        
        
        --
        -- dbanner (string debugkey, ...)
        --
        --      prints a banner when getglobal(debugkey) is true
        --
        -- Arguments:
        --      (string debugkey) arg
        --
        Sea.io.dbanner = function ( debugKey, ... )
                Sea.io.dprintf(debugKey, Sea.io.DEFAULT_BANNER_FRAME, unpack(arg));
        end
        
        --
        -- dbannerc (string debugkey, Table[r,g,b] ...)
        --
        --      prints a banner when getglobal(debugkey) is true
        --      in the color specified by color
        --
        -- Arguments:
        --      (string debugkey, Table[r,g,b] color) arg
        --
        Sea.io.dbannerc = function ( debugKey, color, ... )
                Sea.io.dprintfc(debugKey, Sea.io.DEFAULT_BANNER_FRAME, color, unpack(arg));
        end     

        --
        -- printf (MessageFrame frame, ...)
        --      
        --      prints a message in a message frame
        --
        -- Arguments:
        --      (MessageFrame frame) arg
        --
        --      frame - the object with AddMessage(self, string)
        --      arg - the string to be composed
        --
        -- Returns
        --      (nil)
        --
        Sea.io.printf = function (frame, ... )
                Sea.io.printfc(frame, nil, unpack(arg));
        end

        --
        -- dprintf (string debugkey, MessageFrame frame, ...)
        --
        --      prints a message when getglobal(debugkey) is true
        --      also decodes | and characters
        --
        -- Arguments:
        --      (string debugkey, MessageFrame frame) arg
        --      debugkey - string debug key
        --      frame - debug target frame
        --
        Sea.io.dprintf = function ( debugKey, frame, ... )
                Sea.io.dprintfc(debugKey, frame, nil, unpack(arg));
        end     
        
        --
        -- dprintfc (string debugkey, MessageFrame frame, Table[r,g,b] color, ...)
        --
        --      prints a message when getglobal(debugkey) is true
        --      also decodes | and characters, using the specified color
        --      
        -- Arguments:
        --      (string debugkey, MessageFrame frame) arg
        --      debugkey - string/boolean debug key
        --       if nil, then "getglobal(Sea.io.debugKey)" is used;
        --       if string, then "getglobal(debugKey)" is used;
        --       if boolean or non-string it is evaluated to print using "if (debugKey) then";
        --      frame - debug target frame
        --      color - table of colors
        --
        Sea.io.dprintfc = function ( debugKey, frame, color, ... )
                if ( type(debugKey) == "string" ) then
                        debugKey = getglobal(debugKey);
                elseif ( debugKey == nil ) then 
                        debugKey = getglobal(Sea.io.debugKey);
                end

                local msg = Sea.io.join(arg,"");
                msg = gsub(msg,"|","<pipe>");
                msg = gsub(msg,"([^%w%s%a%p])", byteString);
                
                if ( debugKey ) then 
                        Sea.io.printfc(frame, color, unpack(arg));
                end
        end
        

        --
        -- errorc (Table[r,g,b] color, ...)
        --
        --      prints just like Sea.io.print, except as an error with the color
        --
        -- Arguments:
        --      (Table[r,g,b] color)  arg
        --      color - the specified color
        --      arg - contains all error output
        --
        Sea.io.errorc = function(color, ...)
                Sea.io.errorfc(Sea.io.DEFAULT_ERROR_FRAME, color, unpack(arg) );
        end

        --
        -- errorf (MessageFrame frame, ...)
        --      
        --      prints a message in an error message frame
        --
        -- Arguments:
        --      (MessageFrame frame) arg
        --
        --      frame - the object with AddMessage(self, string)
        --      arg - the string to be composed
        --
        -- Returns
        --      (nil)
        --
        
        Sea.io.errorf = function (frame, ... )
                Sea.io.errorfc(frame, nil, unpack(arg));
        end

        --
        -- errorfc (MessageFrame frame, Table[r,g,b] color, ...)
        --      
        --      prints a message in an error message frame with the color
        --
        -- Arguments:
        --      (MessageFrame frame, Table[r,g,b] color) arg
        --
        --      frame - the object with AddMessage(self, string)
        --      color - table containing the colors
        --      arg - the string to be composed
        --
        -- Returns
        --      (nil)
        --
        Sea.io.errorfc = function (frame, color, ... )
                if ( frame == nil ) then
                        frame = Sea.io.DEFAULT_ERROR_FRAME;
                end
                if ( color == nil ) then
                        color = Sea.io.DEFAULT_ERROR_COLOR;
                end
                
                Sea.io.printfc(frame, color, unpack(arg));              
        end
        --
        -- printc ( ColorTable[r,g,b] color, ... )
        --      
        --      prints a message in the default frame with a 
        --      specified color
        --
        -- Arguments:
        --      color - the color
        --      arg - the message
        -- 
        Sea.io.printc = function ( color, ... ) 
                Sea.io.printfc(nil, color, unpack(arg));
        end
        
        --
        -- bannerc ( ColorTable[r,g,b] color, ... )
        --      
        --      prints a banner message with a 
        --      specified color
        --
        -- Arguments:
        --      color - the color
        --      arg - the message
        -- 
        Sea.io.bannerc = function ( color, ... ) 
                if ( color == nil ) then 
                        color = Sea.io.DEFAULT_PRINT_COLOR;
                end

                Sea.io.printfc(Sea.io.DEFAULT_BANNER_FRAME, color, unpack(arg));
        end
                
        --
        -- printfc (MessageFrame frame, ColorTable[r,g,b] color, ... )
        --
        --      prints a message in a frame with a specified color
        --
        -- Arguments
        --      frame - the frame
        --      color - a table with .r .g and .b values
        --      arg - the message objects
        --
        Sea.io.printfc = function (frame, color, ... ) 
                if ( frame == nil ) then 
                        frame = Sea.io.DEFAULT_PRINT_FRAME;
                end
                if ( color == nil ) then 
                        color = Sea.io.DEFAULT_PRINT_COLOR;
                end

                if ( Sea.io.recursed == false ) then 
                        Sea.io.recursed = true;
                        if ( frame == Sea.io.DEFAULT_BANNER_FRAME ) then
                                frame:AddMessage(Sea.io.join(arg,""), color.r, color.g, color.b, 1.0, UIERRORS_HOLD_TIME);
                        else
                                frame:AddMessage(Sea.io.join(arg,""), color.r, color.g, color.b);
                        end
                        Sea.io.recursed = false;
                else
                        if ( frame == Sea.io.DEFAULT_BANNER_FRAME ) then
                                frame:AddMessage(arg[1], color.r, color.g, color.b, 1.0, UIERRORS_HOLD_TIME);
                        else
                                frame:AddMessage(arg[1], color.r, color.g, color.b);
                        end
                end                     
        end

        --[[ End of Standard Prints ]]--
        
        --[[ Beginning of Special Prints ]]--
        
        --
        -- printComma (...)
        --
        --      Prints the arguments separated by commas
        --
        Sea.io.printComma = function(...)
                Sea.io.print(Sea.io.join(arg,","));
        end;
        
        --
        -- printTable (table, [rowname, level])
        --
        --      Recursively prints a table
        --
        -- Args:
        --      table - table to be printed
        --      rowname - row's name
        --      level - level of depth
        --
        Sea.io.printTable = function (table, rowname, level) 
                if ( level == nil ) then level = 1; end

                if ( type(rowname) == "nil" ) then rowname = "ROOT"; 
                elseif ( type(rowname) == "string" ) then 
                        rowname = "\""..rowname.."\"";
                elseif ( type(rowname) ~= "number" ) then
                        rowname = "*"..type(rowname).."*";
                end

                local msg = "";
                for i=1,level, 1 do 
                        msg = msg .. "  ";      
                end

                if ( table == nil ) then 
                        Sea.io.print(msg,"[",rowname,"] := nil "); return 
                end
                if ( type(table) == "table" ) then
                        Sea.io.print (msg,rowname," { ");
                        for k,v in table do
                                Sea.io.printTable(v,k,level+1);
                        end
                        Sea.io.print(msg,"}");
                elseif (type(table) == "function" ) then 
                        Sea.io.print(msg,"[",rowname,"] => {{FunctionPtr*}}");
                elseif (type(table) == "userdata" ) then 
                        Sea.io.print(msg,"[",rowname,"] => {{UserData}}");
                elseif (type(table) == "boolean" ) then 
                        local value = "true";
                        if ( not table ) then
                                value = "false";
                        end
                        Sea.io.print(msg,"[",rowname,"] => ",value);
                else    
                        Sea.io.print(msg,"[",rowname,"] => ",table);
                end
        end
        
        --[[ Hyperlinks ]] --
        --
        -- makeHyperlink(string type, string linkText, Table[r,g,b] color)
        --
        --      Creates a hyperlink string which is returned to you.
        --
        -- Args:
        --   (string type, string linkText, Table[r,g,b] color, boolean braces, table[left,right] braceString)
        --   linkType - the Hyperlink type.
        --   linkText - the text shown in the link
        --   color - color of the link
        --   braces - if true, add braces
        --   braceString - table with .left for left brace and .right for right brace
        --
        Sea.io.makeHyperlink = function (linkType, linkText, color, braces, braceString)
                local link = linkText;
                if ( braces ) then 
                        if ( braceString == nil ) then braceString = {}; end
                        if ( braceString.left == nil ) then braceString.left="["; end
                        if ( braceString.right == nil ) then braceString.right="]"; end

                        link = braceString.left..link..braceString.right;
                end
                if (color) then
                        link = "|cFF"..color..link.."|r";
                end
                return "|H"..linkType.."|h"..link.."|h";
        end
        
        -- Aliasing
        if (not Sea.util) then
                Sea.util = {};
        end
        Sea.util.makeHyperlink = Sea.io.makeHyperlink;
        
        -- Aliases:
        Sea.IO = Sea.io;
        
end