Editing Module:Data to Table

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision Your text
Line 14: Line 14:




-- Escape characters for Lua strings
-- Escape characters
local function clean(txt)
local function clean(txt)
txt = txt:gsub('&(%a+;)', '&%1')
:gsub('\'', '\\'')
:gsub('<', '&lt;')
:gsub('\'', '\\\'')
return txt
return txt
:gsub('\\', '\\\\')
:gsub('\'', '\\\'')
end
-- Parse DPL data
local function parseInfo(info, frame)
if not info then
return {}
end
if ne(frame.args.cleanTT) then
info = CleanTT(info)
end
return lib.parseTemplateFormat(
info,
';;',
'$$$',
'=='
)
end
-- Get grouped JSON data
local function getJsonGroups(frame)
local groups = {}
local i = 1
while true do
local groupName = frame.args['group' .. i]
local groupInfo = frame.args['group' .. i .. '_info']
-- Stop when neither argument exists.
if groupName == nil and groupInfo == nil then
break
end
if ne(groupName) and groupInfo ~= nil then
local info = parseInfo(groupInfo, frame)
local entries = {}
-- Collect entries
for _, entry in lib.spairs(
info,
function(tVal, a, b)
local aPage = tostring(tVal[a].page or a)
local bPage = tostring(tVal[b].page or b)
return aPage < bPage
end
) do
if ne(entry.page) then
entries[#entries + 1] = entry.page
end
end
-- Only add the group if it actually contains entries.
if #entries > 0 then
groups[groupName] = entries
end
end
i = i + 1
end
return groups
end
-- Format grouped data as readable JSON
function p.FormatJSONGroups(groups)
local result = {}
table.insert(result, '{')
-- Get group names
local groupNames = {}
for name in pairs(groups) do
groupNames[#groupNames + 1] = name
end
table.sort(groupNames)
-- Build each group
for i, name in ipairs(groupNames) do
local entries = groups[name]
local groupComma = (i < #groupNames) and ',' or ''
table.insert(
result,
'\t' ..
mw.text.jsonEncode(name) ..
': ['
)
for j, entry in ipairs(entries) do
local entryComma = (j < #entries) and ',' or ''
table.insert(
result,
'\t\t' ..
mw.text.jsonEncode(entry) ..
entryComma
)
end
table.insert(
result,
'\t]' .. groupComma
)
end
table.insert(result, '}')
return table.concat(result, '\n')
end
end


Line 148: Line 28:
local dataKeys = {}
local dataKeys = {}
local rawKeys = {}
local rawKeys = {}
-- ============================================================
-- JSON MODE
-- ============================================================
if tostring(frame.args.json) == '1' then
-- --------------------------------------------------------
-- Grouped JSON mode
-- --------------------------------------------------------
local groups = getJsonGroups(frame)
-- If groups were supplied, output the complete JSON object.
if next(groups) ~= nil then
local jsonText = p.FormatJSONGroups(groups)
return frame:extensionTag(
'syntaxhighlight',
jsonText,
{
lang = 'json',
copy = ''
}
)
end
-- --------------------------------------------------------
-- Simple JSON array mode
-- --------------------------------------------------------
if frame.args.info then
info = parseInfo(frame.args.info, frame)
local jsonEntries = {}
for _, entry in lib.spairs(
info,
function(tVal, a, b)
local aPage = tostring(tVal[a].page or a)
local bPage = tostring(tVal[b].page or b)
return aPage < bPage
end
) do
if ne(entry.page) then
jsonEntries[#jsonEntries + 1] = entry.page
end
end
local jsonText = mw.text.jsonEncode(jsonEntries)
return frame:extensionTag(
'syntaxhighlight',
jsonText,
{
lang = 'json',
copy = ''
}
)
end
return ''
end
-- ============================================================
-- NORMAL LUA MODE
-- ============================================================


-- Parse DPL data
-- Parse DPL data
if frame.args.info then
if frame.args.info then
if ne(frame.args.cleanTT) then
frame.args.info = CleanTT(frame.args.info)
end


info = parseInfo(frame.args.info, frame)
info = lib.parseTemplateFormat(
 
frame.args.info,
';;',
'$$$',
'=='
)
else
else
return ''
return ''
end
end


-- Parse keys
-- Parse keys
Line 237: Line 49:
dataKeys = p.ParseKeys(frame.args.keys)
dataKeys = p.ParseKeys(frame.args.keys)
end
end


-- Parse unquoted/raw keys
-- Parse unquoted/raw keys
Line 243: Line 54:
rawKeys = p.ParseKeys(frame.args.unquoted)
rawKeys = p.ParseKeys(frame.args.unquoted)
end
end


-- Block formatting
-- Block formatting
Line 249: Line 59:
block = true
block = true
end
end


local sortkey = frame.args.sortkey or 'page'
local sortkey = frame.args.sortkey or 'page'
local subtable = frame.args.subtable
local subtable = frame.args.subtable
-- Constant value mode
-- If |value=day is supplied, every page gets that value.
local constantValue = frame.args.value
local valueUnquoted = false
if constantValue ~= nil then
for _, rawKey in ipairs(rawKeys) do
if rawKey == 'value' then
valueUnquoted = true
break
end
end
end




-- Check whether a key should be output as raw Lua
-- Check whether a key should be output as raw Lua
local function isUnquotedKey(key)
local function isUnquotedKey(key)
for _, rawKey in ipairs(rawKeys) do
for _, rawKey in ipairs(rawKeys) do
if rawKey == key then
if rawKey == key then
return true
return true
end
end
end
end


Line 297: Line 84:
info,
info,
function(tVal, a, b)
function(tVal, a, b)
if sortkey == 'INPUT' then
if sortkey == 'INPUT' then
return a < b
return a < b
else
else
return (tVal[a][sortkey] or '') <
return (tVal[a][sortkey] or '') < (tVal[b][sortkey] or '')
(tVal[b][sortkey] or '')
end
end
end
end
) do
) do


if ne(entry.page) then
if ne(entry.page) then
entry.page = clean(entry.page)
entry.page = clean(entry.page)


 
-- No data keys: output page as a simple string
-- ----------------------------------------------------
if #dataKeys == 0 then
-- Constant value mode
-- ----------------------------------------------------
 
if constantValue ~= nil and #dataKeys == 0 then
 
local value
 
if valueUnquoted then
value = clean(constantValue)
else
value = '\'' ..
clean(constantValue) ..
'\''
end
 
result:wikitext(
'\t[\'',
entry.page,
'\'] = ',
value,
',\n'
)
 
 
-- ----------------------------------------------------
-- No data keys
-- ----------------------------------------------------
 
elseif #dataKeys == 0 then


result:wikitext(
result:wikitext(
Line 349: Line 103:
'\',\n'
'\',\n'
)
)
-- ----------------------------------------------------
-- Normal nested table mode
-- ----------------------------------------------------


else
else
Line 363: Line 112:
local valid = false
local valid = false
local values = mw.html.create()
local values = mw.html.create()


-- Entry name
-- Entry name
Line 371: Line 119:
'\'] = {'
'\'] = {'
)
)


-- Build entry
-- Build entry
local function parseLevels(K, level)
local function parseLevels(K, level)
level = level or 1
level = level or 1


Line 393: Line 139:
)
)
)
)


elseif type(K) == 'table' then
elseif type(K) == 'table' then
Line 408: Line 153:
'},'
'},'
)
)
end
end
end
end


parseLevels(dataKeys, 1)
parseLevels(dataKeys, 1)


-- Return table if there is valid data
-- Return table if there is valid data
if valid then
if valid then
values:wikitext('\n')
values:wikitext('\n')
result:node(values)
result:node(values)
else
else
result:wikitext(
result:wikitext(
'\t\'',
'\t\'',
Line 429: Line 168:
'\',\n'
'\',\n'
)
)
end
end
end
end
end
end
end
end


result:wikitext('}')
result:wikitext('}')




-- ============================================================
-- Wrap output in syntaxhighlight
-- LUA SYNTAX HIGHLIGHT
-- ============================================================
 
local luaText = tostring(result)
 
-- Decode HTML entities introduced by mw.html
luaText = mw.text.decode(luaText)
 
 
local output = frame:extensionTag(
local output = frame:extensionTag(
'syntaxhighlight',
'syntaxhighlight',
luaText,
tostring(result),
{
{
lang = 'lua',
lang = 'lua',
Line 459: Line 187:




-- ============================================================
-- Copy button
-- COPY BUTTON
-- ============================================================
 
-- Keep Module:CopyText for normal Lua output.
if frame.args.copy then
if frame.args.copy then
output = require('Module:CopyText')._main({
output = require('Module:CopyText')._main({
output,
output,
Line 471: Line 194:
'Copy Table'
'Copy Table'
})
})
end
end


return output
return output
Line 479: Line 200:




-- ================================================================
-- Format data
-- FORMAT DATA
-- ================================================================
 
function p.BuildEntry(value, key, level, subtable, unquoted)
function p.BuildEntry(value, key, level, subtable, unquoted)
level = level or 1
level = level or 1


local container = mw.html.create()
local container = mw.html.create()


-- Default missing values
-- Default missing values
Line 494: Line 210:


if key == 'number' then
if key == 'number' then
value = '0'
value = '0'
unquoted = true
unquoted = true
else
else
value = ''
value = ''
unquoted = false
unquoted = false
end
end
end
end
Line 518: Line 230:
table.concat(value, '\', \'') ..
table.concat(value, '\', \'') ..
' }'
' }'


elseif unquoted and value ~= '' then
elseif unquoted and value ~= '' then
Line 524: Line 235:
-- Raw Lua value
-- Raw Lua value
value = clean(value)
value = clean(value)


else
else
Line 554: Line 264:


first[level] = false
first[level] = false


if level > 2 then
if level > 2 then
first[2] = false
first[2] = false
end
end


if level > 1 then
if level > 1 then
Line 581: Line 289:


end
end


return container
return container
Line 587: Line 294:




-- ================================================================
-- Parse data keys into specified levels
-- PARSE DATA KEYS INTO SPECIFIED LEVELS
-- ================================================================
 
function p.ParseKeys(keys)
function p.ParseKeys(keys)
keys = lib.split(keys, ';;')
keys = lib.split(keys, ';;')


Please note that all contributions to The Petit Planet Wiki are considered to be released under the Creative Commons Attribution-ShareAlike (see Petit Planet Wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)
Preview page with this template
Below are commonly used wikitext from MediaWiki:Edittools. Click on any to insert them in the edit box.
File Pages==Summary====Licensing=={{Fairuse}}{{File|}}
Dynamic Page List¦²«»²{¦}²«»«/»«!----»
Array in DPL¹^2{}^2^2{¹}^2
Parser Functions{{#if:||}}
{{#ifeq:|||}}
{{#expr:}}
{{#switch:||#default=}}
{{#replace:||}}
{{#titleparts:}}
{{#tag:|}}
Markup{{}}|[][[]][[Category:]]#REDIRECT [[]] [[Category:Redirect Pages]]<code></code><includeonly></includeonly><noinclude></noinclude><nowiki></nowiki><!----><br>§
Notices{{Stub|}}{{Stub Dialogue}}{{Upcoming}}{{Under Construction}}{{Placeholder|}}
Magic Words{{!}}{{formatnum:}}{{lc:}}{{uc:}}{{PAGENAME}}{{FULLPAGENAME}}{{ROOTPAGENAME}}{{BASEPAGENAME}}{{SUBPAGENAME}}{{DISPLAYTITLE:|noreplace}}__TOC____NOTOC____EXPECTUNUSEDCATEGORY____HIDDENCAT__
HTML Entities&mdash;&nbsp;&comma;&shy;