Module:Data to Table: Difference between revisions
ReisuDesign (talk | contribs) No edit summary |
ReisuDesign (talk | contribs) No edit summary |
||
| 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, | ||
| Line 69: | Line 71: | ||
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 81: | 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 94: | 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 | -- If groups were supplied, output the complete JSON object. | ||
if next(groups) ~= nil then | if next(groups) ~= nil then | ||
local jsonText = | local jsonText = p.FormatJSONGroups(groups) | ||
return frame:extensionTag( | |||
'syntaxhighlight', | 'syntaxhighlight', | ||
jsonText, | jsonText, | ||
| Line 110: | Line 174: | ||
} | } | ||
) | ) | ||
end | |||
-- -------------------------------------------------------- | |||
-- Simple JSON array mode | |||
-- -------------------------------------------------------- | |||
if frame.args.info then | if frame.args.info then | ||
| Line 133: | Line 190: | ||
info, | info, | ||
function(tVal, a, b) | function(tVal, a, 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) | ||
return frame:extensionTag( | |||
'syntaxhighlight', | 'syntaxhighlight', | ||
jsonText, | jsonText, | ||
| Line 151: | Line 213: | ||
} | } | ||
) | ) | ||
end | end | ||
| Line 174: | 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 183: | 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 188: | Line 243: | ||
rawKeys = p.ParseKeys(frame.args.unquoted) | rawKeys = p.ParseKeys(frame.args.unquoted) | ||
end | end | ||
-- Block formatting | -- Block formatting | ||
| Line 193: | 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 203: | 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 214: | 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 232: | 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 | |||
-- | -- ---------------------------------------------------- | ||
-- Constant value mode | |||
-- ---------------------------------------------------- | |||
if constantValue ~= nil and #dataKeys == 0 then | if constantValue ~= nil and #dataKeys == 0 then | ||
| Line 252: | Line 324: | ||
value = clean(constantValue) | value = clean(constantValue) | ||
else | else | ||
value = '\'' .. clean(constantValue) .. '\'' | value = '\'' .. | ||
clean(constantValue) .. | |||
'\'' | |||
end | end | ||
| Line 263: | Line 337: | ||
) | ) | ||
-- No data keys | |||
-- ---------------------------------------------------- | |||
-- No data keys | |||
-- ---------------------------------------------------- | |||
elseif #dataKeys == 0 then | elseif #dataKeys == 0 then | ||
| Line 271: | Line 349: | ||
'\',\n' | '\',\n' | ||
) | ) | ||
-- ---------------------------------------------------- | |||
-- Normal nested table mode | |||
-- ---------------------------------------------------- | |||
else | else | ||
| Line 280: | Line 363: | ||
local valid = false | local valid = false | ||
local values = mw.html.create() | local values = mw.html.create() | ||
-- Entry name | -- Entry name | ||
| Line 287: | 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 307: | Line 393: | ||
) | ) | ||
) | ) | ||
elseif type(K) == 'table' then | elseif type(K) == 'table' then | ||
| Line 321: | 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 336: | Line 429: | ||
'\',\n' | '\',\n' | ||
) | ) | ||
end | end | ||
end | end | ||
end | end | ||
end | end | ||
result:wikitext('}') | result:wikitext('}') | ||
-- | -- ============================================================ | ||
-- 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 360: | Line 459: | ||
-- | -- ============================================================ | ||
-- 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 367: | Line 471: | ||
'Copy Table' | 'Copy Table' | ||
}) | }) | ||
end | end | ||
return output | return output | ||
| Line 378: | 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 386: | 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 406: | Line 518: | ||
table.concat(value, '\', \'') .. | table.concat(value, '\', \'') .. | ||
' }' | ' }' | ||
elseif unquoted and value ~= '' then | elseif unquoted and value ~= '' then | ||
| Line 411: | Line 524: | ||
-- Raw Lua value | -- Raw Lua value | ||
value = clean(value) | value = clean(value) | ||
else | else | ||
| Line 440: | 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 465: | Line 581: | ||
end | end | ||
return container | return container | ||
| Line 475: | Line 592: | ||
function p.ParseKeys(keys) | function p.ParseKeys(keys) | ||
keys = lib.split(keys, ';;') | keys = lib.split(keys, ';;') | ||