Editing Module:TNT
Jump to navigation
Jump to search
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 23: | Line 23: | ||
-- | source-table <!-- uses a translation message with id = "source-table" --> | -- | source-table <!-- uses a translation message with id = "source-table" --> | ||
-- | param1 }} <!-- optional parameter --> | -- | param1 }} <!-- optional parameter --> | ||
-- | -- | ||
-- | -- | ||
-- The "doc" function will generate the <templatedata> parameter documentation for templates. | -- The "doc" function will generate the <templatedata> parameter documentation for templates. | ||
-- This way all template parameters can be stored and localized in a single Commons dataset. | -- This way all template parameters can be stored and localized in a single Commons dataset. | ||
Line 36: | Line 36: | ||
local p = {} | local p = {} | ||
local i18nDataset = 'I18n/Module:TNT.tab' | local i18nDataset = 'I18n/Module:TNT.tab' | ||
function p.msg(frame) | function p.msg(frame) | ||
Line 50: | Line 47: | ||
id = mw.text.trim(v) | id = mw.text.trim(v) | ||
elseif type(k) == 'number' then | elseif type(k) == 'number' then | ||
table.insert(params, v) | |||
elseif k == 'lang' and v ~= '_' then | elseif k == 'lang' and v ~= '_' then | ||
lang = mw.text.trim(v) | lang = mw.text.trim(v) | ||
Line 58: | Line 55: | ||
end | end | ||
-- | -- Converts first parameter to a interwiki-ready link. For example, it converts | ||
-- | -- "Sandbox/Sample.tab" -> 'commons:Data:Sandbox/Sample.tab' | ||
function p.link(frame) | |||
function p. | return link(frame.args[1]) | ||
end | end | ||
-- Given a dataset name, convert it to a title with the 'commons:data:' prefix | |||
-- | function link(dataset) | ||
dataset = 'Data:' .. mw.text.trim(dataset or '') | |||
if mw.site.siteName == 'Wikimedia Commons' then | |||
function | return dataset | ||
else | |||
return 'commons:' .. dataset | |||
end | |||
end | end | ||
function p.doc(frame) | function p.doc(frame) | ||
return frame:extensionTag( | |||
return frame:extensionTag('templatedata', p.getTemplateData( | 'templatedata', | ||
p.getTemplateData(frame.args[1]) | |||
) .. tntMessage('edit_doc', {link(dataset)}) | |||
end | end | ||
function p.getTemplateData(dataset) | function p.getTemplateData(page) | ||
dataset = 'Templatedata/' .. normalizeDataset(page) | |||
-- TODO: add '_' parameter once lua starts reindexing properly for "all" languages | -- TODO: add '_' parameter once lua starts reindexing properly for "all" languages | ||
local data = loadData(dataset) | local data = loadData(dataset) | ||
local names = {} | local names = {} | ||
for _, field in | for _, field in pairs(data.schema.fields) do | ||
table.insert(names, field.name) | table.insert(names, field.name) | ||
end | end | ||
Line 102: | Line 89: | ||
local params = {} | local params = {} | ||
local paramOrder = {} | local paramOrder = {} | ||
for _, row in pairs(data.data) do | |||
local newVal = {} | |||
local name = nil | |||
for pos, val in pairs(row) do | |||
local columnName = names[pos] | |||
if columnName == 'name' then | |||
name = val | |||
else | |||
newVal[columnName] = val | |||
end | |||
end | |||
if name then | |||
params[name] = newVal | |||
table.insert(paramOrder, name) | |||
end | |||
end | |||
-- Work around json encoding treating {"1":{...}} as an [{...}] | |||
params['zzz123']='' | |||
local json = mw.text.jsonEncode({ | local json = mw.text.jsonEncode({ | ||
params=params, | params=params, | ||
Line 132: | Line 120: | ||
end | end | ||
function formatMessage(dataset, key, params, lang) | |||
for _, row in pairs(loadData(dataset, lang).data) do | |||
local id, msg = unpack(row) | |||
if id == key then | |||
local result = mw.message.newRawMessage(msg, unpack(params)) | |||
return result:plain() | |||
end | |||
if dataset == | end | ||
if dataset == i18nDataset then | |||
-- Prevent cyclical calls | |||
error('Invalid message key "' .. key .. '"') | |||
else | else | ||
error(tntMessage('error_bad_msgkey', {key, link(dataset)})) | |||
end | end | ||
end | end | ||
function tntMessage(key, params) | |||
return formatMessage(i18nDataset, key, params) | |||
if not dataset then | end | ||
error( | |||
function normalizeDataset(dataset) | |||
if not dataset or dataset == '' then | |||
error(tntMessage('error_no_dataset', {})) | |||
end | end | ||
if string.sub(dataset,-4) ~= '.tab' then | |||
dataset = dataset .. '.tab' | |||
if | |||
end | end | ||
return dataset | |||
end | |||
function loadData(dataset, lang) | |||
local data = mw.ext.data.get(dataset, lang) | local data = mw.ext.data.get(dataset, lang) | ||
if data == false then | if data == false then | ||
if dataset == i18nDataset then | if dataset == i18nDataset then | ||
Line 168: | Line 157: | ||
error('Missing Commons dataset ' .. i18nDataset) | error('Missing Commons dataset ' .. i18nDataset) | ||
else | else | ||
error( | error(tntMessage('error_bad_dataset', {link(dataset)})) | ||
end | end | ||
end | end | ||
return data | return data | ||
end | end | ||
return p | return p |