Lompat ke isi

Modul:TNT

Wikipedia Minangkabau - Lubuak aka tapian ilimu

Dokumentasi untuk modul ini dapat dibuat diModul:TNT/doc

--
-- INTRO: (!!! DO NOT RENAME THIS PAGE!!!)
-- This module allows any template or module to be copy/pasted between
-- wikis without any translation changes. All translation text is stored
-- in the global Data:*.tab pages on Commons, and used everywhere.
--
-- SEE: https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules
--
-- ATTENTION:
-- Please do NOT rename this module - it has to be identical on all wikis.
-- This code is maintained at https://www.mediawiki.org/wiki/Module:TNT
-- Please do not modify it anywhere else, as it may get copied and override your changes.
-- Suggestions can be made at https://www.mediawiki.org/wiki/Module_talk:TNT
--
-- DESCRIPTION:
-- The "msg" function uses a Commons dataset to translate a message
-- with a given key (e.g. source-table), plus optional arguments
-- to the wiki markup in the current content language.
-- Use lang=xx to set language. Example:
--
-- {{#invoke:TNT | msg
-- | I18n/Template:Graphs.tab <!-- https://commons.wikimedia.org/wiki/Data:I18n/Template:Graphs.tab -->
-- | source-table <!-- uses a translation message with id = "source-table" -->
-- | param1 }} <!-- optional parameter -->
--
--
-- 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.
-- NOTE: "doc" assumes that all documentation is located in Data:Templatedata/* on Commons.
--
-- {{#invoke:TNT | doc | Graph:Lines }}
-- uses https://commons.wikimedia.org/wiki/Data:Templatedata/Graph:Lines.tab
-- if the current page is Template:Graph:Lines/doc
--

localp={}
locali18nDataset='I18n/Module:TNT.tab'

-- Forward declaration of the local functions
localsanitizeDataset,loadData,link,formatMessage

functionp.msg(frame)
localdataset,id
localparams={}
locallang=nil
fork,vinpairs(frame.args)do
ifk==1then
dataset=mw.text.trim(v)
elseifk==2then
id=mw.text.trim(v)
elseiftype(k)=='number'then
params[k-2]=mw.text.trim(v)
elseifk=='lang'andv~='_'then
lang=mw.text.trim(v)
end
end
returnformatMessage(dataset,id,params,lang)
end

-- Identical to p.msg() above, but used from other lua modules
-- Parameters: name of dataset, message key, optional arguments
-- Example with 2 params: format('I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
functionp.format(dataset,key,...)
localcheckType=require('libraryUtil').checkType
checkType('format',1,dataset,'string')
checkType('format',2,key,'string')
returnformatMessage(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')
functionp.formatInLanguage(lang,dataset,key,...)
localcheckType=require('libraryUtil').checkType
checkType('formatInLanguage',1,lang,'string')
checkType('formatInLanguage',2,dataset,'string')
checkType('formatInLanguage',3,key,'string')
returnformatMessage(dataset,key,{...},lang)
end

-- Obsolete function that adds a 'c:' prefix to the first param.
-- "Sandbox/Sample.tab" -> 'c:Data:Sandbox/Sample.tab'
functionp.link(frame)
returnlink(frame.args[1])
end

functionp.doc(frame)
localdataset='Templatedata/'..sanitizeDataset(frame.args[1])
returnframe:extensionTag('templatedata',p.getTemplateData(dataset))..
formatMessage(i18nDataset,'edit_doc',{link(dataset)})
end

functionp.getTemplateData(dataset)
-- TODO: add '_' parameter once lua starts reindexing properly for "all" languages
localdata=loadData(dataset)
localnames={}
for_,fieldinipairs(data.schema.fields)do
table.insert(names,field.name)
end

localnumOnly=true
localparams={}
localparamOrder={}
for_,rowinipairs(data.data)do
localnewVal={}
localname=nil
forpos,columnNameinipairs(names)do
ifcolumnName=='name'then
name=row[pos]
else
newVal[columnName]=row[pos]
end
end
ifnamethen
if(
(type(name)~="number")
and(
(type(name)~="string")
ornotstring.match(name,"^%d+$")
)
)then
numOnly=false
end
params[name]=newVal
table.insert(paramOrder,name)
end
end

-- Work around json encoding treating { "1":{...}} as an [{...}]
ifnumOnlythen
params['zzz123']=''
end

localjson=mw.text.jsonEncode({
params=params,
paramOrder=paramOrder,
description=data.description,
})

ifnumOnlythen
json=string.gsub(json,' "zzz123": "",?',"")
end

returnjson
end

-- Local functions

sanitizeDataset=function(dataset)
ifnotdatasetthen
returnnil
end
dataset=mw.text.trim(dataset)
ifdataset==''then
returnnil
elseifstring.sub(dataset,-4)~='.tab'then
returndataset..'.tab'
else
returndataset
end
end

loadData=function(dataset,lang)
dataset=sanitizeDataset(dataset)
ifnotdatasetthen
error(formatMessage(i18nDataset,'error_no_dataset',{}))
end

-- Give helpful error to thirdparties who try and copy this module.
ifnotmw.extornotmw.ext.dataornotmw.ext.data.getthen
error(string.format([['''Missing JsonConfig extension, or not properly configured;
Cannot load https://commons.wikimedia.org/wiki/Data:%s.
See https://www.mediawiki.org/wiki/Extension:JsonConfig#Supporting_Wikimedia_templates''']],dataset))
end

localdata=mw.ext.data.get(dataset,lang)

ifdata==falsethen
ifdataset==i18nDatasetthen
-- Prevent cyclical calls
error('Missing Commons dataset '..i18nDataset)
else
error(formatMessage(i18nDataset,'error_bad_dataset',{link(dataset)}))
end
end
returndata
end

-- Given a dataset name, convert it to a title with the 'commons:data:' prefix
link=function(dataset)
return'c:Data:'..mw.text.trim(datasetor'')
end

formatMessage=function(dataset,key,params,lang)
for_,rowinpairs(loadData(dataset,lang).data)do
localid,msg=unpack(row)
ifid==keythen
localresult=mw.message.newRawMessage(msg,unpack(paramsor{}))
returnresult:plain()
end
end
ifdataset==i18nDatasetthen
-- Prevent cyclical calls
error('Invalid message key "'..key..' "')
else
error(formatMessage(i18nDataset,'error_bad_msgkey',{key,link(dataset)}))
end
end

returnp