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 4: | Line 4: | ||
-- wikis without any translation changes. All translation text is stored | -- wikis without any translation changes. All translation text is stored | ||
-- in the global Data:*.tab pages on Commons, and used everywhere. | -- in the global Data:*.tab pages on Commons, and used everywhere. | ||
-- | -- | ||
-- ATTENTION: | -- ATTENTION: | ||
Line 23: | Line 21: | ||
-- | 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 34: | ||
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 46: | Line 41: | ||
for k, v in pairs(frame.args) do | for k, v in pairs(frame.args) do | ||
if k == 1 then | if k == 1 then | ||
dataset = | dataset = v | ||
elseif k == 2 then | elseif k == 2 then | ||
id = | id = 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 = | lang = v | ||
end | end | ||
end | end | ||
Line 58: | Line 53: | ||
end | end | ||
-- | -- Converts first parameter to a interwiki-ready link. For example, it converts | ||
-- "Sandbox/Sample.tab" -> 'commons:Data:Sandbox/Sample.tab' | |||
-- "Sandbox/Sample.tab" -> ' | |||
function p.link(frame) | function p.link(frame) | ||
return link(frame.args[1]) | return link(frame.args[1]) | ||
end | end | ||
function | -- Given a dataset name, convert it to a title with the 'commons:data:' prefix | ||
function link(dataset) | |||
dataset = 'Data:' .. (dataset or '') | |||
if mw.site.siteName == 'Wikimedia Commons' then | |||
return dataset | |||
else | |||
return 'commons:' .. dataset | |||
end | |||
end | end | ||
function p. | function p.doc(frame) | ||
dataset = 'Templatedata/' .. normalizeDataset(frame.args[1]) | |||
-- 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 80: | ||
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 | |||
local templateData = { | |||
local | |||
params=params, | params=params, | ||
paramOrder=paramOrder, | paramOrder=paramOrder, | ||
description=data.description | description=data.description | ||
}) | } | ||
templateData = mw.text.jsonEncode(templateData) | |||
return frame:extensionTag('templatedata', templateData) .. tntMessage('edit_doc', {link(dataset)}) | |||
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 145: | ||
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 |