Editing Module:TNT

Jump to navigation Jump to search
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 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.
--
-- SEE:  https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules
--
--
-- 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'
-- Forward declaration of the local functions
local sanitizeDataset, loadData, link, formatMessage


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 = mw.text.trim(v)
dataset = v
elseif k == 2 then
elseif k == 2 then
id = mw.text.trim(v)
id = v
elseif type(k) == 'number' then
elseif type(k) == 'number' then
params[k - 2] = mw.text.trim(v)
table.insert(params, v)
elseif k == 'lang' and v ~= '_' then
elseif k == 'lang' and v ~= '_' then
lang = mw.text.trim(v)
lang = v
end
end
end
end
Line 58: Line 53:
end
end


-- Identical to p.msg() above, but used from other lua modules
-- Converts first parameter to a interwiki-ready link. For example, it converts
-- Parameters:  name of dataset, message key, optional arguments
-- "Sandbox/Sample.tab" -> 'commons:Data:Sandbox/Sample.tab'
-- Example with 2 params:  format('I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
function p.format(dataset, key, ...)
local checkType = require('libraryUtil').checkType
checkType('format', 1, dataset, 'string')
checkType('format', 2, key, 'string')
return formatMessage(dataset, key, {...})
end
 
 
-- Identical to p.msg() above, but used from other lua modules with the language param
-- Parameters:  language code, name of dataset, message key, optional arguments
-- Example with 2 params:  formatInLanguage('es', I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
function p.formatInLanguage(lang, dataset, key, ...)
local checkType = require('libraryUtil').checkType
checkType('formatInLanguage', 1, lang, 'string')
checkType('formatInLanguage', 2, dataset, 'string')
checkType('formatInLanguage', 3, key, 'string')
return formatMessage(dataset, key, {...}, lang)
end
 
-- Obsolete function that adds a 'c:' prefix to the first param.
-- "Sandbox/Sample.tab" -> 'c:Data:Sandbox/Sample.tab'
function p.link(frame)
function p.link(frame)
return link(frame.args[1])
return link(frame.args[1])
end
end


function p.doc(frame)
-- Given a dataset name, convert it to a title with the 'commons:data:' prefix
local dataset = 'Templatedata/' .. sanitizeDataset(frame.args[1])
function link(dataset)
return frame:extensionTag('templatedata', p.getTemplateData(dataset)) ..
dataset = 'Data:' .. (dataset or '')
  formatMessage(i18nDataset, 'edit_doc', {link(dataset)})
if mw.site.siteName == 'Wikimedia Commons' then
return dataset
else
return 'commons:' .. dataset
end
end
end


function p.getTemplateData(dataset)
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 ipairs(data.schema.fields) do
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 ipairs(data.data) do
    for _, row in pairs(data.data) do
local newVal = {}
    local newVal = {}
local name = nil
    local name = nil
for pos, columnName in ipairs(names) do
    for pos, val in pairs(row) do
if columnName == 'name' then
    local columnName = names[pos]
name = row[pos]
    if columnName == 'name' then
else
    name = val
newVal[columnName] = row[pos]
    else
end
    newVal[columnName] = val
end
    end
if name then
    end
params[name] = newVal
    if name then
table.insert(paramOrder, name)
    params[name] = newVal
end
    table.insert(paramOrder, name)
end
    end
 
    end
-- Work around json encoding treating {"1":{...}} as an [{...}]
params['zzz123']=''
local templateData = {
 
local json = mw.text.jsonEncode({
params=params,
params=params,
paramOrder=paramOrder,
paramOrder=paramOrder,
description=data.description
description=data.description
})
}
templateData = mw.text.jsonEncode(templateData)


json = string.gsub(json,'"zzz123":"",?', "")
return frame:extensionTag('templatedata', templateData) .. tntMessage('edit_doc', {link(dataset)})
 
return json
end
end


-- Local functions
function formatMessage(dataset, key, params, lang)
 
    for _, row in pairs(loadData(dataset, lang).data) do
sanitizeDataset = function(dataset)
    local id, msg = unpack(row)
if not dataset then
    if id == key then
return nil
    local result = mw.message.newRawMessage(msg, unpack(params))
end
    return result:plain()
dataset = mw.text.trim(dataset)
    end
if dataset == '' then
    end
return nil
if dataset == i18nDataset then
elseif string.sub(dataset,-4) ~= '.tab' then
-- Prevent cyclical calls
return dataset .. '.tab'
error('Invalid message key "' .. key .. '"')
else
else
return dataset
error(tntMessage('error_bad_msgkey', {key, link(dataset)}))
end
end
end
end


loadData = function(dataset, lang)
function tntMessage(key, params)
dataset = sanitizeDataset(dataset)
return formatMessage(i18nDataset, key, params)
if not dataset then
end
error(formatMessage(i18nDataset, 'error_no_dataset', {}))
 
function normalizeDataset(dataset)
if not dataset or dataset == '' then
error(tntMessage('error_no_dataset', {}))
end
end
 
if string.sub(dataset,-4) ~= '.tab' then
-- Give helpful error to thirdparties who try and copy this module.
dataset = dataset .. '.tab'
if not mw.ext or not mw.ext.data or not mw.ext.data.get then
error(string.format([['''Missing JsonConfig extension, or not properly configured;
Cannot load https://commons.wikimedia.org/wiki/Data:%s. Please properly enable the JSONConfig extension at Special:ManageWiki/extensions#mw-prefsection-other
See https://www.mediawiki.org/wiki/Extension:JsonConfig#Supporting_Wikimedia_templates''']], dataset))
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(formatMessage(i18nDataset, 'error_bad_dataset', {link(dataset)}))
error(tntMessage('error_bad_dataset', {link(dataset)}))
end
end
end
end
return data
return data
end
-- Given a dataset name, convert it to a title with the 'commons:data:' prefix
link = function(dataset)
return 'c:Data:' .. mw.text.trim(dataset or '')
end
formatMessage = function(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 or {}))
return result:plain()
end
end
if dataset == i18nDataset then
-- Prevent cyclical calls
error('Invalid message key "' .. key .. '"')
else
error(formatMessage(i18nDataset, 'error_bad_msgkey', {key, link(dataset)}))
end
end
end


return p
return p
Please note that all contributions to Meta Wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, 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 (see Meta Wiki:Copyrights for details). Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)

Template used on this page: