Module:Data to Table: Difference between revisions

ReisuDesign (talk | contribs)
No edit summary
ReisuDesign (talk | contribs)
No edit summary
 
(One intermediate revision by the same user not shown)
Line 56: Line 56:
end
end


if ne(groupName) and groupInfo then
if ne(groupName) and groupInfo ~= nil then
 
local info = parseInfo(groupInfo, frame)
local info = parseInfo(groupInfo, frame)
local entries = {}
local entries = {}


-- Collect entries
for _, entry in lib.spairs(
for _, entry in lib.spairs(
info,
info,
function(tVal, a, b)
function(tVal, a, b)
return (tVal[a].page or a) < (tVal[b].page or b)
local aPage = tostring(tVal[a].page or a)
local bPage = tostring(tVal[b].page or b)
 
return aPage < bPage
end
end
) do
) do
if ne(entry.page) then
if ne(entry.page) then
entries[#entries + 1] = entry.page
entries[#entries + 1] = entry.page
end
end
end
end


groups[groupName] = entries
-- Only add the group if it actually contains entries.
if #entries > 0 then
groups[groupName] = entries
end
end
end


Line 78: Line 88:


return groups
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 91: Line 154:


if tostring(frame.args.json) == '1' then
if tostring(frame.args.json) == '1' then
-- --------------------------------------------------------
-- Grouped JSON mode
-- --------------------------------------------------------


local groups = getJsonGroups(frame)
local groups = getJsonGroups(frame)


-- If groups were supplied, output the complete grouped object.
-- If groups were supplied, output the complete JSON object.
if next(groups) ~= nil then
if next(groups) ~= nil then


local jsonText = mw.text.jsonEncode(groups)
local jsonText = p.FormatJSONGroups(groups)


local output = frame:extensionTag(
return frame:extensionTag(
'syntaxhighlight',
'syntaxhighlight',
jsonText,
jsonText,
Line 107: Line 174:
}
}
)
)
end


-- Copy button
if frame.args.copy then
output = require('Module:CopyText')._main({
output,
frame.args.copy,
'Copy JSON'
})
end


return output
-- --------------------------------------------------------
end
-- Simple JSON array mode
-- --------------------------------------------------------


-- Otherwise, retain simple JSON-array mode.
if frame.args.info then
if frame.args.info then


Line 130: Line 190:
info,
info,
function(tVal, a, b)
function(tVal, a, b)
return (tVal[a].page or a) < (tVal[b].page or b)
local aPage = tostring(tVal[a].page or a)
local bPage = tostring(tVal[b].page or b)
 
return aPage < bPage
end
end
) do
) do
if ne(entry.page) then
if ne(entry.page) then
jsonEntries[#jsonEntries + 1] = entry.page
jsonEntries[#jsonEntries + 1] = entry.page
end
end
end
end


local jsonText = mw.text.jsonEncode(jsonEntries)
local jsonText = mw.text.jsonEncode(jsonEntries)


local output = frame:extensionTag(
return frame:extensionTag(
'syntaxhighlight',
'syntaxhighlight',
jsonText,
jsonText,
Line 148: Line 213:
}
}
)
)
-- Copy button
if frame.args.copy then
output = require('Module:CopyText')._main({
output,
frame.args.copy,
'Copy JSON'
})
end
return output
end
end


Line 171: Line 225:
-- Parse DPL data
-- Parse DPL data
if frame.args.info then
if frame.args.info then
info = parseInfo(frame.args.info, frame)
info = parseInfo(frame.args.info, frame)
else
else
return ''
return ''
end
end


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


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


-- Block formatting
-- Block formatting
Line 190: Line 249:
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
-- Constant value mode
Line 200: Line 261:


if constantValue ~= nil then
if constantValue ~= nil then
for _, rawKey in ipairs(rawKeys) do
for _, rawKey in ipairs(rawKeys) do
if rawKey == 'value' then
if rawKey == 'value' then
valueUnquoted = true
valueUnquoted = true
break
break
end
end
end
end
end
end


Line 211: Line 276:
-- 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 229: Line 297:
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 '') < (tVal[b][sortkey] or '')
return (tVal[a][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)


-- Constant value mode:
 
-- |value=day produces ['Page'] = 'day'
-- ----------------------------------------------------
-- Constant value mode
-- ----------------------------------------------------
 
if constantValue ~= nil and #dataKeys == 0 then
if constantValue ~= nil and #dataKeys == 0 then


Line 249: Line 324:
value = clean(constantValue)
value = clean(constantValue)
else
else
value = '\'' .. clean(constantValue) .. '\''
value = '\'' ..
clean(constantValue) ..
'\''
end
end


Line 260: Line 337:
)
)


-- No data keys: output page as a simple string
 
-- ----------------------------------------------------
-- No data keys
-- ----------------------------------------------------
 
elseif #dataKeys == 0 then
elseif #dataKeys == 0 then


Line 268: Line 349:
'\',\n'
'\',\n'
)
)
-- ----------------------------------------------------
-- Normal nested table mode
-- ----------------------------------------------------


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


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


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


Line 304: Line 393:
)
)
)
)


elseif type(K) == 'table' then
elseif type(K) == 'table' then
Line 318: Line 408:
'},'
'},'
)
)
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 333: Line 429:
'\',\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)
local luaText = tostring(result)


-- Decode HTML entities introduced by mw.html
-- Decode HTML entities introduced by mw.html
luaText = mw.text.decode(luaText)
luaText = mw.text.decode(luaText)


local output = frame:extensionTag(
local output = frame:extensionTag(
Line 357: Line 459:




-- 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 364: Line 471:
'Copy Table'
'Copy Table'
})
})
end
end


return output
return output
Line 375: Line 484:


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 383: Line 494:


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 403: Line 518:
table.concat(value, '\', \'') ..
table.concat(value, '\', \'') ..
' }'
' }'


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


else
else
Line 437: Line 554:


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 462: Line 581:


end
end


return container
return container
Line 472: Line 592:


function p.ParseKeys(keys)
function p.ParseKeys(keys)
keys = lib.split(keys, ';;')
keys = lib.split(keys, ';;')