Jump to content

Module:SimpleDebug: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
No edit summary
No edit summary
Line 3: Line 3:
p.s = ''
p.s = ''
p.tab = {
p.tab = {
oneline = true,
oneline = true,
allidx = false,
allidx = false,
}
}
p.dec = -1
p.dec = -1
p.maxlines = {
p.maxlines = {
num = 100,
num = 100,
doerror = true,
doerror = true,
}
}
p.enabled = true
p.enabled = true
p.nowiki = false
p.nowiki = false
Line 20: Line 20:


local function arrow()
local function arrow()
return ' => '
return ' => '
end
end


function p.breakline ()
function p.breakline ()
if p.s ~= '' then
if p.s ~= '' then
LinCount = LinCount + 1
LinCount = LinCount + 1
end
end
p.s = p.s..'\n\n'
p.s = p.s..'\n\n'
if (LinCount > p.maxlines.num) and p.maxlines.doerror then
if (LinCount > p.maxlines.num) and p.maxlines.doerror then
error (p.s,0)
error (p.s,0)
end
end
end --breakline
end --breakline


function CheckWhere (where)
function CheckWhereName (wn, what)
if where == nil then
if wn == nil then
return '"where" == nil'
return '"'..what..'" == nil'
elseif (type(wn) == "table") then
else
return 'Table as "'..what..'"!'
return where
else
end
return wn
end --CheckWhere
end
end --CheckWhereName


function plain (text) --Modified from "Module:Plain text"
function plain (text) --Modified from "Module:Plain text"
if not text then return end
if not text then return end
text = mw.text.killMarkers(text)
text = mw.text.killMarkers(text)
:gsub(' ', ' ') --replace nbsp spaces with regular spaces
:gsub(' ', ' ') --replace nbsp spaces with regular spaces
:gsub('<br ?/?>', ', ') --replace br with commas
:gsub('<br ?/?>', ', ') --replace br with commas
:gsub('<span.->(.-)</span>', '%1') --remove spans while keeping text inside
:gsub('<span.->(.-)</span>', '%1') --remove spans while keeping text inside
:gsub('<b>(.-)</b>', '%1') --remove bold while keeping text inside
:gsub('<b>(.-)</b>', '%1') --remove bold while keeping text inside
:gsub('<i>(.-)</i>', '%1') --remove italic while keeping text inside
:gsub('<i>(.-)</i>', '%1') --remove italic while keeping text inside
:gsub('<sub>(.-)</sub>', '%1') --remove bold while keeping text inside
:gsub('<sub>(.-)</sub>', '%1') --remove bold while keeping text inside
:gsub('<sup>(.-)</sup>', '%1') --remove bold while keeping text inside
:gsub('<sup>(.-)</sup>', '%1') --remove bold while keeping text inside
:gsub('<.->.-<.->', '') --strip out remaining tags and the text inside
:gsub('<.->.-<.->', '') --strip out remaining tags and the text inside
:gsub('<.->', '') --remove any other tag markup
:gsub('<.->', '') --remove any other tag markup
:gsub('%[%[%s*[Ff]ile%s*:.-%]%]', '') --strip out files
:gsub('%[%[%s*[Ff]ile%s*:.-%]%]', '') --strip out files
:gsub('%[%[%s*[Ii]mage%s*:.-%]%]', '') --strip out use of image:
:gsub('%[%[%s*[Ii]mage%s*:.-%]%]', '') --strip out use of image:
:gsub('%[%[%s*[Cc]ategory%s*:.-%]%]', '') --strip out categories
:gsub('%[%[%s*[Cc]ategory%s*:.-%]%]', '') --strip out categories
:gsub('%[%[[^%]]-|', '') --strip out piped link text
:gsub('%[%[[^%]]-|', '') --strip out piped link text
:gsub('[%[%]]', '') --then strip out remaining [ and ]
:gsub('[%[%]]', '') --then strip out remaining [ and ]
:gsub("'''''", "") --strip out bold italic markup
:gsub("'''''", "") --strip out bold italic markup
:gsub("'''?", "") --not stripping out '''' gives correct output for bolded text in quotes
:gsub("'''?", "") --not stripping out '''' gives correct output for bolded text in quotes
:gsub('----', '') --remove ---- lines
:gsub('----', '') --remove ---- lines
:gsub("^%s+", "") --strip leading
:gsub("^%s+", "") --strip leading
:gsub("%s+$", "") --and trailing spaces
:gsub("%s+$", "") --and trailing spaces
:gsub("%s+", " ") --strip redundant spaces
:gsub("%s+", " ") --strip redundant spaces
return text
return text
end --plain
end --plain


function totext (text)
function totext (text)
if p.plaintext then
if p.plaintext then
return plain (text)
return plain (text)
else
else
return text
return text
end
end
end --totext
end --totext


function NumToStr (N)
function NumToStr (N)
if (p.dec == -1) or (N == math.floor(N)) then
if (p.dec == -1) or (N == math.floor(N)) then
return tostring(N)
return tostring(N)
else
else
return tostring (math.floor ((N*10^p.dec)+0.5) / (10^p.dec))
return tostring (math.floor ((N*10^p.dec)+0.5) / (10^p.dec))
end
end
end --NumToStr
end --NumToStr

local iniTab1Line = true
function p.containsTab (avar)
result = false
for k,v in pairs(avar) do
if type(v) == 'table' then
result = true
break
end
end
return result
end --containsTab


function DumTab (tbl, indent)
function DumTab (tbl, indent)
if not indent then indent = 0 end
if not indent then indent = 1 end
local toprint = "{\r\n"
local toprint = " {\r\n"
indent = indent + 2
indent = indent + 2
for k, v in pairs(tbl) do
for k, v in pairs(tbl) do
toprint = toprint..string.rep(" ", indent)
toprint = toprint..string.rep(" ", indent)
local id = k
local id = k
if (type(k) == "string") then
if (type(k) == "string") then
k = '"'..k..'"'
k = '"'..k..'"'
end
end
toprint = toprint.."["..k.."] = "
toprint = toprint.."["..k.."] = "
if (type(v) == "number") then
if (type(v) == "number") then
toprint = toprint..NumToStr(v)..",\r\n"
toprint = toprint..NumToStr(v)..",\r\n"
elseif (type(v) == "string") then
elseif (type(v) == "string") then
toprint = toprint.."\""..totext(v).."\",\r\n"
toprint = toprint.."\""..totext(v).."\",\r\n"
elseif (type(v) == "table") then
elseif (type(v) == "table") then
if iniTab1Line and (not p.containsTab (v)) then
toprint = toprint..DumTab(v, indent + 2)..",\r\n"
local wds = '{'
else
for kk,vv in pairs(v) do
toprint = toprint.."\""..tostring(v).."\",\r\n"
if (p.tab.allidx == true) or (type(kk) ~= 'number') then
end
wds = wds..'['..kk..']='..var(vv)..', '
end
else
toprint = toprint..string.rep(" ", indent-2).."}"
wds = wds..var(vv)..', '
return toprint
end
end
toprint = toprint..wds.."},\r\n"
else
toprint = toprint..DumTab(v, indent + 2)..",\r\n"
end
else
toprint = toprint.."\""..tostring(v).."\",\r\n"
end
end
toprint = toprint..string.rep(" ", indent-2).."}"
return toprint
end --DumTab
end --DumTab


function var (avar)
function var (avar)
local EndStr = ''
if type(avar) == 'table' then
if p.tab.oneline then
if type(avar) == 'table' then
if #avar > 0 then
local wds = '{ '
p.s = p.s..'\r\n'
for k,v in pairs(avar) do
end
if (p.tab.allidx == true) or (type(k) ~= 'number') then
if p.tab.oneline then
wds = wds..'['..k..']='..var(v)..', '
local wds = '{ '
else
for k,v in pairs(avar) do
wds = wds..var(v)..', '
if (p.tab.allidx == true) or (type(k) ~= 'number') then
end
wds = wds..'['..k..']='..var(v)..', '
end
else
EndStr = wds .. '} '
wds = wds..var(v)..', '
else
end
EndStr = DumTab (avar)
end
end
EndStr = wds .. '} '
elseif type(avar) == 'number' then
else
EndStr = NumToStr (avar)
EndStr = DumTab (avar)
elseif type(avar) == 'boolean' then
end
if avar == true then
elseif type(avar) == 'number' then
EndStr = 'true'
EndStr = NumToStr (avar)
else
elseif type(avar) == 'boolean' then
EndStr = 'false'
if avar == true then
end
EndStr = 'true'
elseif avar == nil then
else
EndStr = 'nil'
EndStr = 'false'
else
end
avar = totext (tostring(avar))
elseif avar == nil then
if p.nohtml then
EndStr = 'nil'
avar = string.gsub (avar, "<", "⪡")
else
avar = string.gsub (avar, ">", "⪢")
avar = totext (tostring(avar))
end
if p.nohtml then
EndStr = '"'..avar..'"'
avar = string.gsub (avar, "<", "⪡")
end
avar = string.gsub (avar, ">", "⪢")
return EndStr
end
EndStr = '"'..avar..'"'
end
return EndStr
end --var
end --var


function p.w (where)
function p.w (where)
if p.enabled then
if p.enabled then
return CheckWhere (where)
return CheckWhereName (where, 'w')
end
end
end --w
end --w

function varx (avar)
iniTab1Line = p.tab.oneline
if p.tab.oneline and (type(avar) == 'table') then
p.tab.oneline = not p.containsTab(avar)
end
local ss = var(avar)
p.tab.oneline = iniTab1Line
return ss
end --varx


function p.v (...)
function p.v (...)
if p.enabled then
if p.enabled then
local str = ''
local str = ''
for i = 1, #arg do
for i = 1, #arg do
if str ~= '' then
if str ~= '' then
str = str..vep
str = str..vep
end
end
str = str..var(arg[i])
str = str..varx(arg[i])
end
end
return str
return str
end
end
end --v
end --v


function p.wv (where, ...)
function p.wv (where, ...)
if p.enabled then
if p.enabled then
return CheckWhere(where)..arrow()..p.v(unpack(arg))
return CheckWhereName(where,'w')..arrow()..p.v(unpack(arg))
end
end
end --wv
end --wv


function p.nv (...)
function p.nv (...)
if p.enabled then
if p.enabled then
if math.mod(#arg,2) ~= 0 then
if math.mod(#arg,2) ~= 0 then
EndStr = 'Any parameter has not a name or variable'
EndStr = 'Any parameter has not a name or variable'
else
else
local s = ''
local s = ''
local IsName = true
local IsName = true
function Concat(wds)
function Concat(wds)
if s ~= '' then
if s ~= '' then
if IsName then
if IsName then
s = s..vep
s = s..vep
else
else
s = s..': '
s = s..': '
end
end
end
end
s = s..wds
s = s..wds
end
end
for i = 1, #arg do
for i = 1, #arg do
if IsName then
if IsName then
Concat (CheckWhere(arg[i]))
Concat (CheckWhereName(arg[i],'n'))
IsName = false
IsName = false
else
else
Concat (var(arg[i]))
Concat (varx(arg[i]))
IsName = true
IsName = true
end
end
end
end
EndStr = s
EndStr = s
end
end
return EndStr
return EndStr
end
end
end --nv
end --nv


function p.wnv (where, ...)
function p.wnv (where, ...)
if p.enabled then
if p.enabled then
return CheckWhere(where)..arrow()..p.nv (unpack(arg))
return CheckWhereName(where,'w')..arrow()..p.nv (unpack(arg))
end
end
end
end


Line 210: Line 250:


local function EnabAndBl ()
local function EnabAndBl ()
if p.enabled and (LinCount < p.maxlines.num) then
if p.enabled and (LinCount < p.maxlines.num) then
if p.s ~= '' then
if p.s ~= '' then
p.breakline ()
p.breakline ()
end
end
return true
return true
else
else
return false
return false
end
end
end --EnabAndBl
end --EnabAndBl


function p.wtos (where)
function p.wtos (where)
if EnabAndBl () then
if EnabAndBl () then
p.s = p.s..p.w (where)
p.s = p.s..p.w (where)
end
end
end --wtos
end --wtos


function p.vtos (...)
function p.vtos (...)
if EnabAndBl () then
if EnabAndBl () then
p.s = p.s..p.v (unpack(arg))
p.s = p.s..p.v (unpack(arg))
end
end
end --vtos
end --vtos


function p.wvtos (where, ...)
function p.wvtos (where, ...)
if EnabAndBl () then
if EnabAndBl () then
p.s = p.s..p.wv (where,unpack(arg))
p.s = p.s..p.wv (where,unpack(arg))
end
end
end --wvtos
end --wvtos


function p.nvtos (...)
function p.nvtos (...)
if EnabAndBl () then
if EnabAndBl () then
p.s = p.s..p.nv (unpack(arg))
p.s = p.s..p.nv (unpack(arg))
end
end
end --nvtos
end --nvtos


function p.wnvtos (where, ...)
function p.wnvtos (where, ...)
if EnabAndBl () then
if EnabAndBl () then
p.s = p.s..p.wnv (where, unpack(arg))
p.s = p.s..p.wnv (where, unpack(arg))
end
end
end --wnvtos
end --wnvtos



Revision as of 16:01, 7 December 2019

local p = {}

p.s = ''
p.tab = {
    oneline = true,
    allidx = false,
    }
p.dec = -1
p.maxlines = {
    num = 100,
    doerror = true,
    }
p.enabled = true
p.nowiki = false
p.nohtml = false
p.plaintext = false

local LinCount = 0
local vep = '  •  '

local function arrow()
    return ' => '
end

function p.breakline ()
    if p.s ~= '' then
        LinCount = LinCount + 1
    end    
    p.s = p.s..'\n\n'
    if (LinCount > p.maxlines.num) and p.maxlines.doerror then
        error (p.s,0)
    end    
end    --breakline

function CheckWhereName (wn, what)
    if wn == nil then
        return '"'..what..'" == nil'
    elseif (type(wn) == "table") then
        return 'Table as "'..what..'"!'
    else
        return wn    
    end    
end --CheckWhereName

function plain (text) --Modified from "Module:Plain text"
    if not text then return end
    text = mw.text.killMarkers(text)
        :gsub('&nbsp;', ' ') --replace nbsp spaces with regular spaces
        :gsub('<br ?/?>', ', ') --replace br with commas
        :gsub('<span.->(.-)</span>', '%1') --remove spans while keeping text inside
        :gsub('<b>(.-)</b>', '%1') --remove bold while keeping text inside
        :gsub('<i>(.-)</i>', '%1') --remove italic while keeping text inside
        :gsub('<sub>(.-)</sub>', '%1') --remove bold while keeping text inside
        :gsub('<sup>(.-)</sup>', '%1') --remove bold while keeping text inside
        :gsub('<.->.-<.->', '') --strip out remaining tags and the text inside
        :gsub('<.->', '') --remove any other tag markup
        :gsub('%[%[%s*[Ff]ile%s*:.-%]%]', '') --strip out files
        :gsub('%[%[%s*[Ii]mage%s*:.-%]%]', '') --strip out use of image:
        :gsub('%[%[%s*[Cc]ategory%s*:.-%]%]', '') --strip out categories
        :gsub('%[%[[^%]]-|', '') --strip out piped link text
        :gsub('[%[%]]', '') --then strip out remaining [ and ]
        :gsub("'''''", "") --strip out bold italic markup
        :gsub("'''?", "") --not stripping out '''' gives correct output for bolded text in quotes
        :gsub('----', '') --remove ---- lines
        :gsub("^%s+", "") --strip leading
        :gsub("%s+$", "") --and trailing spaces
        :gsub("%s+", " ") --strip redundant spaces
    return text
end --plain

function totext (text)
    if p.plaintext then
        return plain (text)
    else
        return text
    end    
end --totext

function NumToStr (N)        
    if (p.dec == -1) or (N == math.floor(N)) then
        return tostring(N)
    else
        return tostring (math.floor ((N*10^p.dec)+0.5) / (10^p.dec))
    end    
end    --NumToStr

local iniTab1Line = true
function p.containsTab (avar)
    result = false
    for k,v in pairs(avar) do
        if type(v) == 'table' then
            result = true
            break
        end    
    end
    return result
end --containsTab

function DumTab (tbl, indent)
    if not indent then indent = 1 end
    local toprint = " {\r\n"
    indent = indent + 2
    for k, v in pairs(tbl) do
        toprint = toprint..string.rep(" ", indent)
        local id = k
        if (type(k) == "string") then
            k = '"'..k..'"'
        end
        toprint = toprint.."["..k.."] = "
        if (type(v) == "number") then
            toprint = toprint..NumToStr(v)..",\r\n"
        elseif (type(v) == "string") then
            toprint = toprint.."\""..totext(v).."\",\r\n"
        elseif (type(v) == "table") then
            if iniTab1Line and (not p.containsTab (v)) then
                local wds = '{'
                for kk,vv in pairs(v) do
                    if (p.tab.allidx == true) or (type(kk) ~= 'number')  then
                        wds = wds..'['..kk..']='..var(vv)..', '
                    else    
                        wds = wds..var(vv)..', '
                    end
                end
                toprint = toprint..wds.."},\r\n"
            else    
                toprint = toprint..DumTab(v, indent + 2)..",\r\n"
            end
        else
            toprint = toprint.."\""..tostring(v).."\",\r\n"
        end
    end
    toprint = toprint..string.rep(" ", indent-2).."}"
    return toprint
end --DumTab

function var (avar)
    local EndStr = ''
    if type(avar) == 'table' then
        if #avar > 0 then
            p.s = p.s..'\r\n'
        end    
        if p.tab.oneline then
            local wds = '{ '
            for k,v in pairs(avar) do
                if (p.tab.allidx == true) or (type(k) ~= 'number')  then
                    wds = wds..'['..k..']='..var(v)..', '
                else    
                    wds = wds..var(v)..', '
                end
            end
            EndStr = wds .. '} '
        else
            EndStr = DumTab (avar)
        end    
    elseif type(avar) == 'number' then
        EndStr = NumToStr (avar)
    elseif type(avar) == 'boolean' then
        if avar == true then
            EndStr = 'true'
        else
            EndStr = 'false'
        end    
    elseif avar == nil then    
        EndStr = 'nil'
    else
        avar = totext (tostring(avar))
        if p.nohtml then
            avar = string.gsub (avar, "<", "⪡")
            avar = string.gsub (avar, ">", "⪢")
        end    
        EndStr = '"'..avar..'"'
    end
    return EndStr
end --var

function p.w (where)
    if p.enabled then
        return CheckWhereName (where, 'w')
    end    
end --w

function varx (avar)
    iniTab1Line = p.tab.oneline
    if p.tab.oneline and (type(avar) == 'table') then
        p.tab.oneline = not p.containsTab(avar)
    end
    local ss = var(avar)
    p.tab.oneline = iniTab1Line
    return ss
end --varx

function p.v (...)
    if p.enabled then
        local str = ''
        for i = 1, #arg do
            if str ~= '' then
                str = str..vep
            end    
            str = str..varx(arg[i])
        end    
        return str
    end    
end    --v

function p.wv (where, ...)
    if p.enabled then
        return CheckWhereName(where,'w')..arrow()..p.v(unpack(arg))
    end    
end    --wv

function p.nv (...)
    if p.enabled then
        if math.mod(#arg,2) ~= 0 then    
            EndStr = 'Any parameter has not a name or variable'
        else
            local s = ''
            local IsName = true
            function Concat(wds)
                if s ~= '' then
                    if IsName then
                        s = s..vep
                    else    
                        s = s..': '
                    end    
                end
                s = s..wds
            end
            for i = 1, #arg do
                if IsName then
                    Concat (CheckWhereName(arg[i],'n'))
                    IsName = false
                else    
                    Concat (varx(arg[i]))
                    IsName = true
                end    
            end
            EndStr = s
        end
        return EndStr
    end    
end --nv

function p.wnv (where, ...)
    if p.enabled then
        return CheckWhereName(where,'w')..arrow()..p.nv (unpack(arg))
    end    
end

----------

local function EnabAndBl ()
    if p.enabled and (LinCount < p.maxlines.num) then
        if p.s ~= '' then
            p.breakline ()
        end    
        return true
    else
        return false
    end
end --EnabAndBl

function p.wtos (where)
    if EnabAndBl () then
        p.s = p.s..p.w (where)
    end    
end --wtos

function p.vtos (...)
    if EnabAndBl () then
        p.s = p.s..p.v (unpack(arg))
    end    
end --vtos

function p.wvtos (where, ...)
    if EnabAndBl () then
        p.s = p.s..p.wv (where,unpack(arg))
    end    
end --wvtos

function p.nvtos (...)
    if EnabAndBl () then
        p.s = p.s..p.nv (unpack(arg))
    end    
end --nvtos

function p.wnvtos (where, ...)
    if EnabAndBl () then
        p.s = p.s..p.wnv (where, unpack(arg))
    end    
end --wnvtos

return p