Modul:Listtable
Tampilan
Modul ini dinilai siap digunakan secara umum. Modul ini sudah matang dan diperkirakan bebas dari bug dan siap digunakan pada tempat yang tepat di manapun. Modul ini siap disinggung di halaman-halaman bantuan dan sumber informasi Wikipedia lainnya sebagai pilihan untuk dipelajari para pengguna baru. Untuk mengurangi beban server dan output yang tidak diharapkan, modul ini harus diperlengkapi dengan halaman bak pasir dan kasus uji daripada harus melakukan suntingan coba-dan-salah berulang-ulang. |
Memperlihatkan isi tabel LUA.
--[===[
MODULE "LISTTABLE"
"eo.wiktionary.org/wiki/Modulo:listtable" <!--2024-Oct-18-->
Purpose: show all content of a table, even a metaized one,
even recursively up to 7 levels
Required submodules / Bezonataj submoduloj /
Submodul yang diperlukan / Behoevda submoduler:
* none
Incoming: * when called from a template or from a
wiki page (directly or via template):
* name of data module to be imported via "loadData",
with namespace prefix
* when called from a module:
* table to get analyzed packed in an extra table on key "xx"
Example of calling from wiki page:
{{#invoke:listtable|ek|Module:loaddata-tblalfabetoj}}
Example of calling from module:
qlisttable = require('Module:listtable')
strmyreport = qlisttable.ek { ['xx'] = tabdubious }
]===]
local exporttable = {}
------------------------------------------------------------------------
---- HIGH LEVEL STRING FUNCTIONS [I] ----
------------------------------------------------------------------------
-- Local function LFIFONTSIZETIT
-- called from "lfhtablstlev" (level 0...13) and
-- from "lfhtablist" (special level -1)
local function lfifontsizetit (strtexto, numlevel)
local strsize = '200' -- preASSume -- for special level -1
if (numlevel==0) then
strsize = '150'
end--if
if (numlevel==1) then
strsize = '130'
end--if
if (numlevel==2) then
strsize = '110'
end--if
if (numlevel>2) then
strsize = '90'
end--if
strtexto = '<b><span style="font-size:' .. strsize .. '%;">' .. strtexto .. '</span></b>'
return strtexto
end--function lfifontsizetit
------------------------------------------------------------------------
local function lfifont90nbsize (strtexxto)
strtexxto = '<span style="font-size:90%;">' .. strtexxto .. '</span>'
return strtexxto
end--function lfifont90nbsize
------------------------------------------------------------------------
local function lfileftlevel (numleewel)
local strlfandstars = string.char(10)
while true do
strlfandstars = strlfandstars .. '*' -- ONE star at level ZERO needed too
if (numleewel==0) then
break
end--if
numleewel = numleewel - 1
end--while
return strlfandstars
end--function lfileftlevel
------------------------------------------------------------------------
local function lfimini3ksani (strdangstring, booutf8keep)
-- no values $C0, $C1, $F5...$FF in a UTF8 stream
local strnowsafe = ''
local num39len = 0
local num39index = 1 -- ONE-based
local numsigno = 0
local numprevious = 0
local boohtmlenc = false
local boovisienc = false
local bookeepuni = false
if (type(strdangstring)~='string') then
strdangstring = '??'
end--if
booutf8keep = (booutf8keep==true)
num39len = string.len (strdangstring)
while true do
if (num39index>num39len) then -- ONE-based
break
end--if
numsigno = string.byte (strdangstring,num39index,num39index)
boohtmlenc = false -- reset on
boovisienc = false -- every iteration
bookeepuni = (booutf8keep and (numsigno>=128) and (numsigno<=245) and (numsigno~=192) and (numsigno~=193))
if (not bookeepuni) then
boohtmlenc = ((numsigno<=42) or (numsigno==58) or (numsigno==60) or (numsigno==62) or (numsigno==91) or (numsigno==93) or (numsigno>=123))
boovisienc = ((numsigno<=31) or (numsigno>=127)) -- overrides "boohtmlenc"
end--if
if ((numsigno==32) and ((numprevious==32) or (num39index==1) or (num39index==num39len))) then
boovisienc = true -- overrides "boohtmlenc"
end--if
if (boovisienc) then
strnowsafe = strnowsafe .. '{' .. tostring (numsigno) .. '}'
else
if (boohtmlenc) then
strnowsafe = strnowsafe .. '&#' .. tostring (numsigno) .. ';'
else
strnowsafe = strnowsafe .. string.char (numsigno)
end--if
end--if
if ((num39len>3000) and (num39index==1000)) then
num39index = num39len - 1000
strnowsafe = strnowsafe .. '" ... "'
else
num39index = num39index + 1 -- ONE-based
end--if
numprevious = numsigno
end--while
return strnowsafe
end--function lfimini3ksani
------------------------------------------------------------------------
---- HIGH LEVEL FUNCTIONS [H] ----
------------------------------------------------------------------------
-- Local function LFHREPORTVARI
-- Input : * booutfg8keep -- true to keep UTF8 intact, else dec-encoded
-- Called from 3 places in "lfhtablstlev".
local function lfhreportvari (varanytype, booutfg8keep)
local strtypeofit = ''
local strdescription = ''
strtypeofit = type(varanytype)
strdescription = 'type ' .. strtypeofit
if ((strtypeofit=='boolean') or (strtypeofit=='number')) then
strdescription = strdescription .. ' and value ' .. tostring (varanytype)
end--if
if (strtypeofit=='string') then
strdescription = strdescription .. ' and value "' .. lfimini3ksani(varanytype,booutfg8keep) .. '"'
end--if (strtypeofit=='string') then
return strdescription
end--function lfhreportvari
------------------------------------------------------------------------
-- Local function LFHALLTOSTRING
-- Called only from "lfhcompareidiotsafe".
local function lfhalltostring (varwhatever)
local strtypeofstuff = ''
strtypeofstuff = type(varwhatever)
if (strtypeofstuff=='number') then
strtypeofstuff = '0'
end--if
if (strtypeofstuff=='string') then
strtypeofstuff = '1'
end--if
strtypeofstuff = strtypeofstuff .. tostring(varwhatever)
return strtypeofstuff
end--function lfhalltostring
------------------------------------------------------------------------
-- Local function LFHCOMPAREIDIOTSAFE
-- The sortorder is:
-- * number
-- * string
-- * everything else (boolean -> function -> table)
-- For example 5 will be less than "4".
-- Only for one of two uses of "table.sort" in "lfhtableanal".
local function lfhcompareidiotsafe (varaa, varbb)
local booaaisless = false
booaaisless = (lfhalltostring(varaa)<lfhalltostring(varbb))
return booaaisless
end--function lfhcompareidiotsafe
------------------------------------------------------------------------
-- Local function LFHTABLEANAL
-- we must use "in pairs" since the incoming table could be metaized
-- numeric keys out of range or non-integer as well as string keys out
-- of range land among other keys
local function lfhtableanal (tabnko)
local taballkeystring = {} -- ONE-based
local taballcetvalues = {} -- ONE-based
local numkatrol = 0
local numkeynumber = 0 -- count of numeric keys only integer and in range
local numkeystring = 0 -- count of string keys only in range
local numkeycetera = 0 -- count of other keys
local numkey77min = 999999
local numkey77max = -999999
local boodone = false
for k9k,v9v in pairs(tabnko) do
boodone = false
if (type(k9k)=='number') then
if ((k9k==math.floor(k9k)) and (k9k>=-999000) and (k9k<=999000)) then -- protect against insanity
numkey77min = math.min (numkey77min,k9k)
numkey77max = math.max (numkey77max,k9k)
numkeynumber = numkeynumber + 1
boodone = true
end--if
end--if
if (type(k9k)=='string') then
numkatrol = string.len(k9k)
if ((numkatrol~=0) and (numkatrol<=50)) then -- protect against insanity
taballkeystring [numkeystring+1] = k9k -- ONE-based for "table.sort"
numkeystring = numkeystring + 1
boodone = true
end--if
end--if
if (not boodone) then
taballcetvalues [numkeycetera+1] = v9v -- ONE-based for "table.sort"
numkeycetera = numkeycetera + 1 -- here we directly store the value !!!
end--if
end--for
table.sort(taballkeystring) -- all are strings -- otherwise the sortorder is messy
table.sort(taballcetvalues,lfhcompareidiotsafe) -- various types -- otherwise the sortorder is messy
return numkeynumber, numkey77min, numkey77max, numkeystring, numkeycetera, taballkeystring, taballcetvalues
end--function lfhtableanal
------------------------------------------------------------------------
local function lfhtablstlev (tabobscure, numincomlevel, booutf8preserve)
-- numeric keys -> string keys -> other keys
local varta3mp = 0
local tablisto = {}
local tabvaluo = {}
local strte7mp = ''
local strgg = ''
local strkeystring = ''
local strli7mit = ' <b>limit of 7 nesting levels reached, deeper content is written in the stars</b>' -- begins with space
local numtitlevel = 0
local numindax = 0
local numjumlahnum = 0
local numqqmin = 0
local numqqmax = 0
local numjumlahstr = 0
local numjumlahcet = 0
numtitlevel = numincomlevel * 2 -- consuming 2 star levels per table level
numjumlahnum, numqqmin, numqqmax, numjumlahstr, numjumlahcet, tablisto, tabvaluo = lfhtableanal(tabobscure)
strte7mp = 'The table (level ' .. tostring(numincomlevel) .. ')'
if ((numjumlahnum==0) and (numjumlahstr==0) and (numjumlahcet==0)) then
strte7mp = strte7mp .. ' is empty'
else
strte7mp = strte7mp .. ' contains '
if (numjumlahnum==0) then
strte7mp = strte7mp .. 'NO numeric keys'
end--if
if (numjumlahnum==1) then
strte7mp = strte7mp .. 'a single numeric key equal ' .. tostring (numqqmin)
end--if
if (numjumlahnum>=2) then
strte7mp = strte7mp .. tostring (numjumlahnum) .. ' numeric keys ranging from ' .. tostring (numqqmin) .. ' to ' .. tostring (numqqmax)
end--if
strte7mp = strte7mp .. ' and ' .. tostring (numjumlahstr) .. ' string keys and ' .. tostring (numjumlahcet) .. ' other keys'
end--if
strgg = lfileftlevel(numtitlevel) .. lfifontsizetit((strte7mp .. '.'),numtitlevel)
if (numjumlahnum~=0) then
strgg = strgg .. lfileftlevel(numtitlevel) .. lfifontsizetit('Numeric keys:',numtitlevel)
numindax = numqqmin
while true do
if (numindax>numqqmax) then
break
end--if
varta3mp = tabobscure[numindax]
if (varta3mp~=nil) then -- holes well possible
strte7mp = tostring (numindax) .. ' -> ' .. lfhreportvari(varta3mp,booutf8preserve) -- no quot for key
strgg = strgg .. lfileftlevel(numtitlevel+1) .. lfifont90nbsize(strte7mp)
if (type(varta3mp)=='table') then
if (numincomlevel<=6) then
strgg = strgg .. lfhtablstlev (varta3mp,(numincomlevel+1),booutf8preserve) -- REKURSI
else
strgg = strgg .. strli7mit
end--if
end--if
end--if (varta3mp~=nil) then
numindax = numindax + 1
end--while
end--if (numjumlahnum~=0) then
if (numjumlahstr~=0) then
strgg = strgg .. lfileftlevel(numtitlevel) .. lfifontsizetit('String keys:',numtitlevel)
numindax = 0
while true do
if (numindax>=numjumlahstr) then -- index is ZERO-based
break
end--if
strkeystring = tablisto [numindax+1] -- ONE-based for "table.sort"
if (type(strkeystring)=='string') then -- always true ??
varta3mp = tabobscure[strkeystring]
if (varta3mp~=nil) then -- always true ??
strte7mp = '"' .. lfimini3ksani(strkeystring,booutf8preserve) .. '" -> ' .. lfhreportvari(varta3mp,booutf8preserve)
strgg = strgg .. lfileftlevel(numtitlevel+1) .. lfifont90nbsize(strte7mp)
if (type(varta3mp)=='table') then
if (numincomlevel<=6) then
strgg = strgg .. lfhtablstlev (varta3mp,(numincomlevel+1),booutf8preserve) -- REKURSI
else
strgg = strgg .. strli7mit
end--if
end--if
end--if (varta3mp~=nil) then
end--if
numindax = numindax + 1
end--while
end--if (numjumlahstr~=0) then
if (numjumlahcet~=0) then -- no recursion here, all keys reported as "??"
strgg = strgg .. lfileftlevel(numtitlevel) .. lfifontsizetit('Other keys:',numtitlevel)
numindax = 0
while true do
if (numindax>=numjumlahcet) then -- index is ZERO-based
break
end--if
varta3mp = tabvaluo [numindax+1] -- ONE-based for "table.sort"
if (varta3mp~=nil) then -- always true ??
strte7mp = '?? -> ' .. lfhreportvari(varta3mp,booutf8preserve)
strgg = strgg .. lfileftlevel(numtitlevel+1) .. lfifont90nbsize(strte7mp)
end--if (varta3mp~=nil) then
numindax = numindax + 1
end--while
end--if (numjumlahcet~=0) then
if (numincomlevel==0) then
strgg = strgg .. string.char(10) -- terminate very last line
end--if
return strgg
end--function lfhtablstlev
------------------------------------------------------------------------
-- Local function LFHTABLIST
-- List all content of a table in a structured layout.
-- Depends on functions :
-- [H] lfhreportvari lfhalltostring lfhcompareidiotsafe
-- [H] lfhtableanal lfhtablstlev
-- [I] lfifontsizetit lfifont90nbsize lfileftlevel lfimini3ksani
local function lfhtablist (tabveryobscure, strtitofreport)
local numlennel = 0
local strhh = ''
if (type(strtitofreport=='string')) then
numlennel = string.len(strtitofreport)
if ((numlennel~=0) and (numlennel<=100)) then -- got valid title
strhh = lfifontsizetit(strtitofreport,-1) .. '<br>' -- special level
end--if
end--if
strhh = strhh .. lfhtablstlev (tabveryobscure,0,false) -- HARDCODED here -- do NOT preserve UTF8
return strhh
end--function lfhtablist
------------------------------------------------------------------------
---- VARIABLES [R] ----
------------------------------------------------------------------------
function exporttable.ek (arxframent)
-- general unknown type and special type "args" AKA "arx"
local vartymp = 0
local arxsomons = 0 -- metaized "args" from our own or caller's "frame"
-- general str
local strimptarget = ''
local strimperror = ''
local strtajtlo = ''
local strreport = ''
-- general num
local numerr = 0
-- general boo
local boofrommodu = false
local boogotit = false
------------------------------------------------------------------------
---- MAIN [Z] ----
------------------------------------------------------------------------
---- MAYBE CALLED FROM A MODULE ----
vartymp = arxframent.xx
boofrommodu = (type(vartymp)=='table')
---- ARX FROM TEMPLATE ----
if (not boofrommodu) then
arxsomons = arxframent.args -- "args" from our own "frame"
if (type(arxsomons)~='table') then
arxsomons = {} -- guard against indexing error from our own
numerr = 1 -- #E01 internal
end--if
if (arxsomons['caller']=='true') then
arxsomons = arxframent:getParent().args -- "args" from caller's "frame"
end--if
if (type(arxsomons)~='table') then
arxsomons = {} -- guard against indexing error again
numerr = 1 -- #E01 internal
end--if
end--if
---- IMPORT VIA LOADDATA ----
if ((not boofrommodu) and (numerr==0)) then
strimptarget = arxsomons[1]
if (type(strimptarget)=='string') then
boogotit,vartymp = pcall(mw.loadData,strimptarget) -- could crash here
if (boogotit) then
boogotit = (type(vartymp)=='table') -- unlikely to fail here
else
strimperror = tostring(vartymp) -- seize error message
end--if
end--if
if (not boogotit) then
numerr = 2 -- #E02
end--if
end--if
---- LIST ----
-- just calling big function "lfhtablist"
if (numerr==0) then
if (boofrommodu) then
strtajtlo = 'Table coming from calling module'
else
strtajtlo = 'Table imported from data module "' .. strimptarget .. '"'
end--if
strreport = lfhtablist(vartymp, strtajtlo)
else
strreport = 'ERR: ' .. tostring(numerr)
if (strimperror~='') then
strreport = strreport .. ' import error: "' .. strimperror .. '"'
end--if
end--if
---- RETURN THE JUNK STRING ----
return strreport
end--function exporttable.ek
---- RETURN THE JUNK LUA TABLE ----
return exporttable