コンテンツにスキップ

モジュール:Wikidata2

モジュール の giải thích[Tác thành]
--script that retrieves basic data stored in Wikidata, for the datamodel, see https:// mediawiki.org/wiki/Extension:Wikibase_Client/Lua

localp={}

locallinguistic=require('Module:Linguistic')
--local formatDate = require('Module:Complex date') only loaded when needed to save memory in large pages like Wikidata:List of properties/all
localfb=require('Module:Fallback')
locali18nmessages=mw.loadData('Module:i18n/wikidata')

-- Wiki-specific parameters
localdefaultlang=mw.getCurrentFrame():preprocess("{{int:lang}}")
localdefaultlink='wikidata'

localfunctioni18n(str,lang)
localmessage=i18nmessages[str]
iftype(message)=='string'then
returnmessage
end
returnfb._langSwitch(message,langordefaultlang)
end

localfunctionformatError(key,text)
returnerror(i18n(key)..(textor''))
end

localfunctionaddTrackingCat(prop,cat)
ifnotpropandnotcatthen
returnerror("no property provided")
end
ifnotcatthen
cat=i18nmessages.trackingcat..'/'..string.upper(prop)
end
return'[[Category:'..cat..']]'
end

localfunctionremoveBlanks(args)
fori,jinpairs(args)do-- does not work??
if(j=='')or(j=='-')thenargs[i]=nilend
end
returnargs
end

localfunctionformatTheUnknown()-- voir si on peut accorder/adapter l'usage de "inconnu"
returni18n('somevalue')
end

localfunctionisSpecial(snak)
returnsnak.snaktype~='value'
end

localfunctionsameValue(snak,target)
returnnotisSpecial(snak)andp.getRawvalue(snak)==target
end

localfunctionshowLang(statement,str)-- TODO (not yet in proper format)
--adds a lang indication at the start of the string, based on data in statement
localmainsnak=statement.mainsnak
ifisSpecial(mainsnak)then
returnstr
end

locallanglist={}
ifmainsnak.datavalue.type=='monolingualtext'then
langlist={mainsnak.datavalue.value.language}
elseifstatement.qualifiersandstatement.qualifiers.P407then
localconvertlangcode=mw.loadData('Module:Dictionary/lang codes')
fori,jinpairs(statement.qualifiers.P407)do
ifnotisSpecial(j)then
localval=convertlangcode[j.datavalue.value['numeric-id']]
table.insert(langlist,val)
end
end
end
if#langlist==0then
returnstr
else
return'('..table.concat(langlist)..')'..str
end
end

functionp.getEntity(val)
iftype(val)=='table'then
returnval
end
returnmw.wikibase.getEntityObject(val)
end

-- DATE FUNCTIONS
localfunctionsplitTimestamp(timestamp,calendar)
localpattern="(%W)(%d+)%-(%d+)%-(%d+)"
localera,year,month,day=timestamp:match(pattern)

ifcalendar=='julian'then
--todo year, month, day = formatdate.gregorianToJulian( era.. year, month, day )
end

return{day=day,month=month,year=year,era=era,timestamp=timestamp,type='dateobject'}
end

localfunctionrangeObject(begin,ending)
localtimestamp
ifbeginthen
timestamp=begin.timestamp
elseifendingthen
timestamp=ending.timestamp
end
return{begin=begin,ending=ending,timestamp=timestamp,type='rangeobject'}
end

localfunctiondateObject(orig,params)-- transforme un snak en un nouvel objet utilisable par Module:Date complexe
ifnotparamsthen
params={}
end

localnewobj=splitTimestamp(orig.time,orig.calendar)-- initalise l'object en mettant la valeur des dates

newobj.precision=params.precisionororig.precision
newobj.type='dateobject'
returnnewobj
end

localfunctionformatDatepoint(obj,params)-- TO IMPROVE
ifnotobjthen
returnnil
end
localformatDate=require('Module:Complex date')
locallang=params.langordefaultlang
localprecision=math.min(obj.precision,params.precisionor15)-- if we don't want to show the value to its full detail
ifprecision>=11then
returnformatDate.complex_date{args={date1=obj.year..'-'..obj.month..'-'..obj.day,lang=lang}}
elseifprecision==10then
returnformatDate.complex_date{args={date1=obj.year..'-'..obj.month,lang=lang}}
elseifprecision==9then
returnformatDate.complex_date{args={date1=tostring(obj.year),lang=lang}}
elseifprecision==8then
returnformatDate.complex_date{args={date1=string.sub(tostring(obj.year),1,3)..'0',lang=lang,precision='decade'}}
elseifprecision==7then
returnformatDate.complex_date{args={date1=string.sub(tostring(obj.year+100),1,2),lang=lang,precision='century'}}
end
returnnil
end

localfunctionformatDaterange(obj,params)--TODO
localbegin=formatDatepoint(obj.begin,params)or''
localending=formatDatepoint(obj.ending,params)or''
returnbegin..'-'..ending
end

localfunctionobjectToText(obj,params)
ifobj.type=='dateobject'then
returnformatDatepoint(obj,params)
elseifobj.type=='rangeobject'then
returnformatDaterange(obj,params)
end
returnnil
end

localfunctiontableToText(values,params)-- takes a list of already formatted values and make them a text
ifnotvaluesthen
returnnil
end
returnlinguistic.conj(values,params.langordefaultlang,params.conjtype)--linguistic.conj( values, params.lang, params.conjtype )
end

functionp.getDate(obj)
--[[
returns an object containing a timestamp for easy sorting, and other data
possible types of object:
dateobject
{timestamp = string, year = number, month = number, day = number, calendar = string}
rangeobject
{timestamp = string, begin = dateobject, ending = dateobject}
]]--
ifnotobjthen
returnnil
end
iftype(obj)=='string'then
obj=p.getEntity(obj)
end

-- if obj is a statement with date, get it
ifobj.mainsnakandnotisSpecial(obj.mainsnak)andobj.mainsnak.datatype=='time'then
returndateObject(obj.mainsnak.datavalue.value.time)
end

-- else preload relevant data
localqualifs=obj.qualifiers-- when obj is a statement, look in qualifiers
localclaims=obj.claims-- when obj is an item, look in claims

localpointprop={'P585','P571'}-- dates corresponding to a punctual fact
localbeginprop={'P580','P569'}-- start date, birth date == start of a date range
localendingprop={'P582','P570'}

localfunctiongetval(prop)
localval
ifclaimsandclaims[prop]andnotisSpecial(claims[prop][1].mainsnak)then
val=claims[prop][1].mainsnak.datavalue.value
elseifqualifsandqualifs[prop]andnotisSpecial(qualifs[prop][1])then
val=qualifs[prop][1].datavalue.value
end
ifvalthen
returndateObject(val)
end
returnnil
end

fori,propinpairs(pointprop)do
localval=getval(prop)
ifvalthenreturnvalend
end
--if no date has not been found, look for startdate or enddate
localbegin,ending
fori,propinpairs(beginprop)do
begin=getval(prop)
ifbeginthen
break
end
end
fori,propinpairs(endingprop)do
ending=getval(prop)
ifendingthen
break
end
end
ifbeginorendingthen
returnrangeObject(begin,ending)
end
returnnil
end

functionp.getFormattedDate(statement,params)
localdatetable=p.getDate(statement)
ifnotdatetablethen
returnnil
end
returnobjectToText(datetable,params)
end

localfunctionhasTargetValue(claim,target)
iftarget==nilthen
returntrue
end
returnsameValue(claim.mainsnak,target)
end

localfunctionhasRank(claim,target)
iftarget=='valid'then
returnhasRank(claim,'preferred')orhasRank(claim,'normal')
else
returnclaim.rank==target
end
end

localfunctionbestRanked(claims)
ifnotclaimsthen
returnnil
end
localpreferred,normal={},{}
fori,jinpairs(claims)do
ifj.rank=='preferred'then
table.insert(preferred,j)
elseifj.rank=='normal'then
table.insert(normal,j)
end
end
if#preferred>0then
returnpreferred
else
returnnormal
end
end

localfunctionhasQualifier(claim,qualifier,qualifiervalues)
ifnotqualifierthen-- si aucun qualificatif est demandé, ça passe
returntrue
end

qualifier=string.upper(qualifier)
ifnotclaim.qualifiersornotclaim.qualifiers[qualifier]then
returnfalse
end

iftype(qualifiervalues)=='string'then
qualifiervalues=mw.text.split(qualifiervalues,',')
end

if(notqualifiervalues)or(qualifiervalues=={})then
returntrue-- si aucune valeur spécifique n'est exigée
end

fori,jinpairs(claim.qualifiers[qualifier])do
fork,linpairs(qualifiervalues)do
ifp.getRawvalue(j)==lthen
returntrue
end
end
end
returnfalse
end

localfunctionhasSource(statement,source,sourceproperty)
ifnotstatement.referencesthen
returnfalse
end
sourceproperty=string.upper(sourcepropertyor'P248')
localsourcevalue=string.upper(sourceor'')
fori,refinpairs(statement.references)do
forprop,contentinpairs(ref.snaks)do
ifprop==sourcepropertythen
ifsourcevalue==''then
returntrue
else
forj,kinpairs(content)do
ifp.getRawvalue(k)==sourcethen
returntrue
end
end
end
end
end
end
returnfalse
end

localfunctionhasDate(statement)
ifnotstatement.qualifiersthen
returnfalse
end
localdateprops={'P580','P585','P582'}
fori,propinpairs(dateprops)do
ifstatement.qualifiers[prop]then
returntrue
end
end
returnfalse
end

localfunctionisInLanguage(snak,lang)-- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers?
returnnotisSpecial(snak)andsnak.datavalue.type=='monolingualtext'andsnak.datavalue.value.language==lang
end

localfunctionnumval(claims,numval)-- retourn les numval premières valeurs de la table claims
localnumval=tonumber(numval)or0-- raise a error if numval is not a positive integer?
if#claims<=numvalthen
returnclaims
end
localnewclaims={}
while#newclaims<numvaldo
table.insert(newclaims,claims[#newclaims+1])
end
returnnewclaims
end

functionp.comparedate(a,b)-- returns true if a is earlier than B or if a has a date but not b
ifaandbthen
returna.timestamp<b.timestamp
elseifathen
returntrue
end
returnfalse
end

functionp.chronosort(objs,inverted)
table.sort(objs,function(a,b)
localtimeA=p.getDate(a)
localtimeB=p.getDate(b)
ifinvertedthen
returnp.comparedate(timeB,timeA)
else
returnp.comparedate(timeA,timeB)
end
end)

returnobjs
end

functionp.sortclaims(claims,sorttype)
iftype(sorttype)=='function'then
table.sort(claims,sorttype)
elseifsorttype=='chronological'then
returnp.chronosort(claims)
elseifsorttype=='inverted'then
returnp.chronosort(claims,true)
end
returnclaims
end

functionp.getRawvalue(snak)
returnp.getDatavalue(snak,{displayformat='raw'})
end

functionp.showentity(entity,lang)
ifnotentitythen
returnnil
end
iftype(entity)=='string'then
entity=p.getEntity(entity)
end
ifnotentityornotentity.typethen
returnformatError('entity-not-found')
end

locallabel=p._getLabel(entity,lang)
localid=entity.id
locallink=id
ifentity.type=='property'then
link='Property:'..link
end

return'[['..link..'|'..label..']] <small>('..id..')</small>'
end

functionp.getDatavalue(snak,params)
ifisSpecial(snak)then
returnnil
end

ifnotparamsthen
params={}
end

localdisplayformat=params.displayformat
localdatatype=snak.datavalue.type
localvalue=snak.datavalue.value

ifdatatype=='wikibase-entityid'then
iftype(displayformat)=='function'then
returndisplayformat(snak,params)
end
localprefix='Q'
ifsnak.datavalue.value["entity-type"]=='property'then
prefix='P'
end
localid=prefix..tostring(value['numeric-id'])
ifdisplayformat=='raw'then
returnid
elseifdisplayformat=='wikidatastyle'then
returnp.showentity(id,params.lang)
else
returnp.formatEntity(id,params)
end

elseifdatatype=='string'then
localshowntext=params.showntext
ifdisplayformat=='weblink'then
ifshowntextthen
return'['..value..' '..showntext..']'
else
returnvalue
end
end
ifsnak.datatype=='math'anddisplayformat~='raw'then
value=mw.getCurrentFrame():extensionTag('math',value)
end
ifparams.urlpatternthen
showntext=mw.text.nowiki(showntextorvalue)
value=mw.ustring.gsub(value,'%%','%%%%')-- escape '%'
value='['..mw.ustring.gsub(mw.ustring.gsub(params.urlpattern,'$1',value),' ','%%20')..' '..showntext..']'
end
returnvalue

elseifdatatype=='time'then-- format example: +00000001809-02-12T00:00:00Z
ifdisplayformat=='raw'then
returnvalue.time
else
returnobjectToText(dateObject(value),params)
end

elseifdatatype=='globecoordinate'then
-- retourne une table avec clés latitude, longitude, précision et globe à formater par un autre module (à changer?)
ifdisplayformat=='latitude'then
returnvalue.latitude
elseifdisplayformat=='longitude'then
returnvalue.longitude
elseifdisplayformat=='qualifier'then
localcoord=require'Module:Coordinates'
value.globe=require('Module:Wikidata/Globes')[value.globe]
value.precision=nil
returncoord._coord(value)
else
value.globe=require('Module:Wikidata/Globes')[value.globe]-- transforme l'ID du globe en nom anglais utilisable par geohack
returnvalue-- note: les coordonnées Wikidata peuvent être utilisée depuis Module:Coordinates. Faut-il aussi autoriser à appeler Module:Coordiantes ici?
end

elseifdatatype=='quantity'then-- todo: gérer les paramètre précision
ifdisplayformat=='raw'then
returntonumber(value.amount)
else
localformatNum=require'Module:Formatnum'
localnumber=formatNum.formatNum(value.amount)
localunit=mw.ustring.match(value.unit,'(Q%d+)')
ifunitthen
number=number..' '..p.formatEntity(unit,params)
end
returnnumber
end
elseifdatatype=='monolingualtext'then
return'<span lang= "'..value.language..' ">'..value.text..'</span>'
else
returnformatError('unknown-datavalue-type',datatype)
end
end

localfunctiongetMultipleClaims(args)
localnewargs=args
localclaims={}
fori,jinpairs(args.property)do
newargs.property=j
localnewclaims=p.getClaims(args)
ifnewclaimsthen
fork,linpairs(newclaims)do
table.insert(claims,l)
end
end
end
returnclaims
end

functionp.getClaims(args)-- returns a table of the claims matching some conditions given in args
args=removeBlanks(args)
ifnotargs.propertythen
returnformatError('property-param-not-provided')
end
iftype(args.property)=='table'then
returngetMultipleClaims(args)
end
--Get entity
ifargs.itemthen-- synonyms
args.entity=args.item
end
localentity=args.entity
iftype(entity)~='table'then
entity=p.getEntity(entity)
end
localproperty=string.upper(args.property)
ifnotentityornotentity.claimsornotentity.claims[property]then
returnnil
end

ifnotargs.rankthen
args.rank='best'
end
localclaims={}
-- ~= '' lorsque le paramètre est écrit mais laissé blanc dans une fonction frame
fori,statementinpairs(entity.claims[property])do
if
(
notargs.excludespecial
or
not(isSpecial(statement.mainsnak))
)
and
(
notargs.targetvalue
or
hasTargetValue(statement,args.targetvalue)
)
and
(
notargs.qualifier
or
hasQualifier(statement,args.qualifier,args.qualifiervaluesorargs.qualifiervalue)
)
and
(
notargs.withsourceorargs.withsource=='-'
or
hasSource(statement,args.withsource,args.sourceproperty)
)
and
(
notargs.isinlanguage
or
isInLanguage(statement.mainsnak,args.isinlanguage)
)
and
(
args.rank=='best'-- rank == best est traité à a fin
or
hasRank(statement,args.rank)
)
then
table.insert(claims,statement)
end
end
if#claims==0then
returnnil
end
ifargs.rank=='best'then
claims=bestRanked(claims)
end
ifargs.sorttypethen
claims=p.sortclaims(claims,args.sorttype)
end

ifargs.numvalthen
returnnumval(claims,args.numval)
end
returnclaims
end

functionp.formatClaimList(claims,args)
ifnotclaimsthen
returnnil
end
fori,jinpairs(claims)do
claims[i]=p.formatStatement(j,args)
end
returnclaims
end

functionp.stringTable(args)-- like getClaims, but get a list of string rather than a list of snaks, for easier manipulation
localclaims=p.getClaims(args)
returnp.formatClaimList(claims,args)
end

localfunctiongetQualifiers(statement,qualifs,params)
ifnotstatement.qualifiersthen
returnnil
end
localvals={}
fori,jinpairs(qualifs)do
j=string.upper(j)
ifstatement.qualifiers[j]then
localinserted=false
ifstatement.qualifiers[j][1].datatype=='monolingualtext'then
localin_preferred_lang
for_,languageinpairs(fb.fblist(params.langordefaultlang))do
for_,snakinpairs(statement.qualifiers[j])do
ifisInLanguage(snak,language)then
in_preferred_lang=snak
break
end
end
ifin_preferred_langthen
break
end
end
ifin_preferred_langthen
table.insert(vals,in_preferred_lang)
inserted=true
end
end
ifnotinsertedthen
for_,snakinpairs(statement.qualifiers[j])do
table.insert(vals,snak)
end
end
end
end
if#vals==0then
returnnil
end
returnvals
end

functionp.getFormattedQualifiers(statement,qualifs,params)
ifnotparamsthenparams={}end
localqualiftable=getQualifiers(statement,qualifs,params)
ifnotqualiftablethen
returnnil
end
fori,jinpairs(qualiftable)do
localparams=params
ifj.datatype=='globe-coordinate'then
params.displayformat='qualifier'
end
qualiftable[i]=p.formatSnak(j,params)
end
returnlinguistic.conj(qualiftable,params.langordefaultlang)
end

functionp.formatStatement(statement,args)
ifnotstatement.typeorstatement.type~='statement'then
returnformatError('unknown-claim-type',statement.type)
end
ifnotargsthenargs={}end
locallang=args.langordefaultlang
localstr=p.formatSnak(statement.mainsnak,args)
ifargs.showlang==truethen
str=showLang(statement,str)
end

localqualifs=args.showqualifiers
ifqualifsthen
iftype(qualifs)=='string'then
qualifs=mw.text.split(qualifs,',')
end
localfoundvalues=p.getFormattedQualifiers(statement,qualifs,args)
iffoundvaluesthen
ifargs.delimiterthen
str=str..args.delimiter..foundvalues
else
str=str..linguistic.inparentheses(foundvalues,lang)
end
end
end

ifargs.showdatethen-- when "showdate and p.chronosort are both set, date retrieval is performed twice
localtimedata=p.getDate(statement)
iftimedatathen
localformatteddate=objectToText(timedata,args)
formatteddate=linguistic.inparentheses(formatteddate,lang)
str=str..'<small>'..formatteddate..'</small>'
end
end

ifargs.showsourceandstatement.referencesthen
localcite=require'Module:Cite'
localframe=mw.getCurrentFrame()
localsourcestring=''
fori,refinpairs(statement.references)do
ifref.snaks.P248then
forj,sourceinpairs(ref.snaks.P248)do
ifnotisSpecial(source)then
localpage
ifref.snaks.P304andnotisSpecial(ref.snaks.P304[1])then
page=ref.snaks.P304[1].datavalue.value
end
locals=cite.citeitem('Q'..source.datavalue.value['numeric-id'],lang,page)
s=frame:extensionTag('ref',s)
sourcestring=sourcestring..s
end
end
elseifref.snaks.P854andnotisSpecial(ref.snaks.P854[1])then
s=frame:extensionTag('ref',p.getDatavalue(ref.snaks.P854[1]))
sourcestring=sourcestring..s
end
end
str=str..sourcestring
end
returnstr
end

functionp.formatSnak(snak,params)
--local params = params or {} pour faciliter l'appel depuis d'autres modules
ifsnak.snaktype=='value'then
returnp.getDatavalue(snak,params)
elseifsnak.snaktype=='somevalue'then
returnformatTheUnknown()
elseifsnak.snaktype=='novalue'then
returni18n('novalue')--todo
else
returnformatError('unknown-snak-type',snak.snaktype)
end
end

localfunctiondefaultLabel(entity,lang,displayformat)-- label when no label is available
ifentityanddisplayformat=='id'then
returnentity.id
end
returni18n('no-label',lang)
end

functionp._getLabel(entity,lang,default)
ifnotentitythen
returnnil
end
iftype(entity)~='table'then
entity=p.getEntity(entity)
end
ifentityandentity.labelsthen
fori,lginpairs(fb.fblist(langordefaultlang))do
ifentity.labels[lg]then
returnentity.labels[lg].value
end
end
end
returndefaultLabel(entity,lang,default)
end

functionp._getDescription(entity,lang)
ifnotentitythen
returni18n('no description')
end
iftype(entity)~='table'then
entity=p.getEntity(entity)
end
localdescriptions=entity.descriptions
ifnotdescriptionsthen
returni18n('no description')
end
ifdescriptions[lang]then
returndescriptions[lang].value
end
locallanglist=fb.fblist(langordefaultlang)-- list of fallback languages if no label in the desired language
fori,lginpairs(langlist)do
ifdescriptions[lg]then
returndescriptions[lg].value
end
end
returni18n('no description')
end

localfunctionwikipediaLink(entity,lang)
locallink=entity:getSitelink(lang..'wiki')
iflinkthen
return':'..lang..':'..link
end
returnnil
end

localfunctiongetLink(entity,typelink,lang)
ifnottypelinkortypelink=='-'then
returnnil
end
ifnotlangthen
lang=defaultlang
end

iftypelink=='wikidata'then
ifentity.type=='property'then
return'd:P:'..entity.id
else
return'd:'..entity.id
end

elseiftypelink=='wikipedia'then
returnwikipediaLink(entity,lang)

elseiftypelink=='anywikipedia'then
localfallbacklist=fb.fblist(lang)
fori,lginpairs(fallbacklist)do
link=wikipediaLink(entity,lg)
iflinkthenreturnlinkend
end
end
returnnil
end

localfunctionformattedLabel(label,entity,args)
ifnotargsthenargs={}end
locallink=getLink(entity,args.link,args.lang)
ifnotlinkthen
link=getLink(entity,defaultlink,args.lang)
end
ifnotlinkthen
returnlabel
else
return'[['..link..'|'..label..']]'
end
end


functionp.getmainid(claim)
ifclaimandnotisSpecial(claim.mainsnak)then
return'Q'..claim.mainsnak.datavalue.value['numeric-id']
end
returnnil
end

functionp.formatEntity(entity,args)
ifnotentitythen
returnnil
end
ifnotargsthenargs={}end
iftype(entity)=='string'then
entity=p.getEntity(entity)
end
locallabel=p._getLabel(entity,args.lang)
ifnotlabelthen
label=entity.id
end
returnformattedLabel(label,entity,args)
end

functionp.getLabel(frame)-- simple for simple templates like {{Q|}}}
localargs=frame.args
localentity=args.entity
locallang=args.lang
iflang==''then
lang=defaultlang
end

ifstring.sub(entity,1,10)=='Property:P'then
entity=string.sub(entity,10)
elseif(string.sub(entity,1,1)~='P'andstring.sub(entity,1,1)~='Q')or(nottonumber(string.sub(entity,2)))then
returni18n('invalid-id')
end

ifnotargs.linkorargs.link==''then-- by default: no link
args.link='-'
end
ifargs.link=='-'then
returnp._getLabel(entity,lang)ori18n('invalid-id')
else
returnp.formatEntity(entity,args)
end
end

functionp._formatStatements(args)--Format statements and concat them cleanly
ifargs.value=='-'then
returnnil
end
--If a value is already set, use it
ifargs.valueandargs.value~=''then
returnargs.value
end
localvaluetable=p.stringTable(args)
returntableToText(valuetable,args)
end

functionp.showQualifier(args)
localqualifs=args.qualifiersorargs.qualifier
iftype(qualifs)=='string'then
qualifs=mw.text.split(qualifs,',')
end
ifnotqualifsthen
returnformatError('property-param-not-provided')
end
localclaims=p.getClaims(args)
ifnotclaimsthen
returnnil
end
localstr=''
fori,jinpairs(claims)do
localnew=p.getFormattedQualifiers(j,qualifs,args)or''
str=str..new
end
returnstr
end

functionp._formatAndCat(args)
localval=p._formatStatements(args)
ifvalthen
returnval..addTrackingCat(args.property)
end
returnnil
end

functionp.getTheDate(args)
localclaims=p.getClaims(args)
ifnotclaimsthen
returnnil
end
localformattedvalues={}
fori,jinpairs(claims)do
table.insert(formattedvalues,p.getFormattedDate(j))
end
localval=linguistic.conj(formattedvalues)
ifvalandargs.addcat==truethen
returnval..addTrackingCat(args.property)
else
returnval
end
end
---FONCTIONS depuis le FRAME
functionp.getaDate(frame)
returnp.getTheDate(frame.args)
end

functionp.getQualifier(frame)
returnp.showQualifier(frame.args)
end

functionp.getDescription(frame)-- simple for simple templates like {{Q|}}}
localentity=frame.args.entity
locallang=frame.args.lang

returnp._getDescription(entity,lang)ori18n('invalid-id')
end

functionp.formatStatements(args)
returnp._formatStatements(args)
end

functionp.formatStatementsE(frame)
localargs={}
ifframe==mw.getCurrentFrame()then
args=frame:getParent().args-- paramètres du modèle appelant (est-ce vraiment une bonne idée?)
fork,vinpairs(frame.args)do
args[k]=v
end
else
args=frame
end
returnp._formatStatements(args)
end

functionp.formatAndCat(frame)
localargs={}
ifframe==mw.getCurrentFrame()then
args=frame:getParent().args-- paramètres du modèle appelant (est-ce vraiment une bonne idée?)
fork,vinpairs(frame.args)do
args[k]=v
end
else
args=frame
end
returnp._formatAndCat(args)
end

functionp.getEntityFromId(id)
returnp.getEntity(id)
end

returnp