Module:Wikidata/πρόχειρο
Αυτή η σελίδα είναι το πρόχειρο module για το Module:Wikidata (διαφορές). |
Τεκμηρίωση module[προβολή] [επεξεργασία] [ιστορικό] [ανανέωση]
Το κύριο module για εργασία με τα δεδομένα των Wikidata. Η βασική μορφή προέρχεται από test2wiki:Module:Wikidata, και έχει επεκταθεί με νέες δυνατότητες.
Το module διαιρείται σε υπό modules:
- Module: Wikidata/lib - βιβλιοθήκη λειτουργιών για όλα τα άλλα υπο modules.
- Module: Wikidata/i18n - διαμόρφωση με βάση την ελληνική Βικιπαίδεια
- Module: Wikidata/Filterers - φιλτράρισμα δηλώσεων, ορισμών κτλ.
- Module: Wikidata/Formatters - μορφοποίηση δεδομένων
- Module: Wikidata/Sorters - ταξινόμηση δεδομένων (αλφαβητικά, ανά ημερομηνία κτλ)
- Module: Wikidata/cite - μορφοποίηση παραπομπών
Δείτε επίσης τη λίστα των προτύπων που χρησιμοποιούν αυτό το module.
Χρήση
ΕπεξεργασίαΤοποθετείστε το πρότυπο {{#invoke:Wikidata|λειτουργία|παράμετρος}}.
Οι παράμετροι και οι λειτουργίες που σημειώνονται με έναν αστερίσκο (*) δεν υποστηρίζονται πλήρως και δεν συνιστάται η χρήση τους. Αντίθετα, οι παράμετροι ή οι λειτουργίες που σημειώνονται με ένα σταυρό (†) είναι ξεπερασμένα και μπορεί σύντομα να αφαιρεθούν.
Λειτουργία | Περιγραφή λειτουργίας | Παράμετρος | Απαιτείται | Περιγραφή παραμέτρου |
---|---|---|---|---|
formatStatements | ανακτά τα δεδομένα, επιλέγει αξιώσεις, φιλτράρει, ταξινομεί και μορφοποιεί τις τιμές τους και επιστρέφει τη λίστα τους | id | όχι | ένα αναγνωριστικό του αντικειμένου (το γράμμα "q" που ακολουθείται από ψηφία) ή τις ιδιότητες (το γράμμα "p" ακολουθούμενο από ψηφία) στα Wikidata, ποια δεδομένα θα πρέπει να ληφθούν για περαιτέρω εργασία μαζί του (σιωπηρά ένα στοιχείο που συνδέεται με αυτή τη σελίδα) |
of | όχι | το αναγνωριστικό των ιδιοτήτων στις Wikidata (το γράμμα "p" που ακολουθείται από ψηφία) από το οποίο η οντότητα που πραγματικά χρησιμοποιεί το στοιχείο αποκτάται χρησιμοποιώντας την πρώτη προτιμώμενη τιμή της ιδιότητας | ||
page* | όχι | το όνομα της σελίδας της οποίας το αντικείμενο πρόκειται να χρησιμοποιηθεί για την ανάκτηση των δεδομένων | ||
property | ναι | αναγνωριστικό ιδιότητας Wikidata (το γράμμα "p" που ακολουθείται από ψηφία) της οποίας οι τιμές θα μορφοποιηθούν και θα εμφανιστούν | ||
value* | όχι | εάν αυτή η παράμετρος έχει οριστεί, εμφανίζονται τα περιεχόμενά της | ||
over* | όχι | αν είναι «αληθής», η κενή τιμή του «value» δεν θεωρείται καταχωρημένη | ||
compare* | όχι | εάν είναι «αληθής» και η παράμετρος «value» έχει καθοριστεί, το module συγκρίνει το περιεχόμενό της και τα δεδομένα στα Wikidata σύμφωνα με τις άλλες παραμέτρους που καθορίζονται για το φιλτράρισμα δεδομένων και τις επισημαίνει με την κλάση CSS σύμφωνα με τη συνέπεια των δεδομένων | ||
addlink | όχι | αν «αληθής», ένα (e) εμφανίζεται απευθείας στην ιδιότητα στο τέλος των δεδομένων από το χώρο αποθήκευσης | ||
addclass | όχι | αν είναι «ψευδής», καταστέλλει την ταξινόμηση δεδομένων της κλάσης CSS </ span> (χρήση μόνο σε σπάνιες περιπτώσεις) | ||
value-formatter | όχι | το υπό module του Module:Wikidata/Formatters (της υποσελίδας) που χρησιμοποιείται για τη μορφοποίηση των τιμών εάν το προεπιλεγμένο υπό module δεν είναι ικανοποιητικό | ||
limit | όχι | ο μέγιστος αριθμός τιμών που εμφανίζονται στη λίστα | ||
rank | όχι | η απαιτούμενη κατάσταση της τιμής σε μια δήλωση: μπορεί να είναι «all» - θα χρησιμοποιηθούν όλες οι δηλώσεις, best - θα χρησιμοποιηθούν είτε οι δηλώσεις που έχουν προτιμώμενη βαθμίδα είτε μόνο όσοι έχουν κανονική βαθμίδα αν δεν χρησιμοποιείται η προτιμώμενη. valid (προεπιλογή) - χρησιμοποιούνται τόσο οι δηλώσεις με προτιμώμενες όσο και με κανονικές βαθμίδες. preferred, normal, deprecated - μόνο δηλώσεις με την κατάλληλη βαθμίδα | ||
withqualifier | όχι | Αναγνωριστικό ιδιότητας Wikidata (το γράμμα "p" που ακολουθείται από ψηφία), το οποίο πρέπει να αντιστοιχιστεί στη δεδομένη τιμή της δήλωσης ως ένας ορισμός | ||
withlang | όχι | ο κώδικας γλώσσας, στον οποίο πρέπει να είναι οι τιμές του μονογλωσσικού κειμένου | ||
date | όχι | ημερομηνίας σε μορφή ΕΕΕΕ-ΜΜ-ΗΗ ή #now (σημερινή ημερομηνία) στην οποία θα πρέπει να ισχύει η δήλωση | ||
sort | όχι | ο τρόπος αλλαγής της προεπιλεγμένης σειράς κάθε τιμής. Η τιμή της παραμέτρου αντιστοιχεί σε δευτερεύουσες σελίδες που χωρίζονται με κόμματα του υπό module Module:Wikidata/Sorters | ||
invert | όχι | αν έχει οριστεί «αληθής» και έχει οριστεί «sort», η ταξινόμηση θα είναι πτωτική, όχι η προεπιλεγμένη αύξουσα | ||
pattern | όχι | αν ο τύπος συμβολοσειράς είναι string (κείμενο), αυτή η μορφή είναι για μορφοποίηση, με το "$1" να αντικαθιστά το string | ||
autoformat† | όχι | εάν είναι «αληθής» και ο τύπος συμβολοσειράς είναι string (κείμενο), το module θα προσπαθήσει να βρει αντικαταστάτη για την ιδιότητα (P1630) στη σελίδα ιδιοτήτων και να την εφαρμόσει | ||
precision | όχι | προσαρμογή της μορφής του χρόνου (εάν η πραγματική ακρίβεια είναι μικρότερη, η μορφή προσαρμόζεται σε αυτήν). 11 – 11. Ιανουαρίου 2025, 10 – Ιανουάριος 2025, 9 – 2025 κ.λπ. | ||
somevalue | όχι | εάν συμπληρωθεί, το module θα εμφανίσει επίσης την ειδική τιμή "άγνωστη τιμή" μαζί με το κείμενο | ||
novalue | όχι | εάν συμπληρωθεί, το module θα εμφανίσει επίσης την ειδική τιμή "καμία τιμή" μαζί με το κείμενο | ||
showqualifier | όχι | τα αναγνωριστικά των προσδιοριστών της ιδιότητας στα Wikidata (το γράμμα "p" που ακολουθείται από ψηφία ή "time"), τα οποία χωρίζονται με κόμματα, που εμφανίζονται σε παρένθεση μετά την εκχώρηση της τιμής στην τιμή αυτή ως ορισμός | ||
showtargetdata* | όχι | παρόμοια με το "showqualifier", αλλά τα δεδομένα αντλούνται από το αντικείμενο στόχο | ||
targetdate* | όχι | παρόμοια με την "date", αναφέρεται στα στοιχεία του αντικειμένου στόχου | ||
showsource | όχι | αν είναι "αληθής", οι αναφορές προστίθενται στα δεδομένα | ||
showmore | όχι | pokud je hodnota „true“, tak se v případě, že existuje více hodnot, než kolik povoluje limit, zobrazí na konci jejich seznamu text „… více na Wikidatech“ s odkazem přímo na vlastnost | ||
separator | όχι | znaky, jimiž se v seznamu oddělí jednotlivé hodnoty, kromě předposlední a poslední (implicitně čárka) | ||
conjunction | όχι | znaky, jimiž se v seznamu oddělí předposlední a poslední hodnota (implicitně spojka „a“) | ||
formatStatementsFromLua | funkce, kterou používají pouze jiné moduly a která je jinak shodná s „formatStatements“ | entity | όχι | tabulka s entitou, s níž má modul pracovat |
dumpWikidataEntity | zobrazí entitu v čitelné podobě, užitečná pro ladění a zavádění nových funkcí, nepoužívá se v šablonách nebo článcích | id | όχι | identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž entita se zobrazí (implicitně je to položka propojená s danou stránkou) |
getSitelink | vrátí odkaz na článek daného projektu | site / první nepojmenovaný | όχι | zkratka projektu (implicitně „cswiki“) |
pattern | όχι | vzor pro zformátování odkazu, kde „$1“ je název odkazovaného článku (implicitně „$1“) | ||
id | όχι | identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou) | ||
of | όχι | identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti | ||
addclass | όχι | pokud je „true“, odkaz bude obalen CSS třídou | ||
getLabel | vrátí štítek položky v daném jazyce | lang | όχι | zkratka jazyka (implicitně „cs“) |
id | όχι | identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou) | ||
of | όχι | identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti | ||
addclass | όχι | pokud je „true“, štítek bude obalen CSS třídou | ||
getDescription | vrátí popisek položky v daném jazyce | lang | όχι | zkratka jazyka (implicitně „cs“) |
id | όχι | identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou) | ||
of | όχι | identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti | ||
addclass | όχι | pokud je „true“, popisek bude obalen CSS třídou | ||
getAliases | vrátí aliasy položky v daném jazyce | lang | όχι | zkratka jazyka (implicitně „cs“) |
limit | όχι | maximální počet aliasů, který se má zobrazit | ||
id | όχι | identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou) | ||
of | όχι | identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti | ||
separator | όχι | znaky, jimiž se v seznamu oddělí jednotlivé aliasy, kromě předposledního a posledního (implicitně čárka) | ||
conjunction | όχι | znaky, jimiž se v seznamu oddělí předposlední a poslední alias (implicitně spojka „a“) | ||
getBadges | vrátí štítek odznaku přiřazeného danému odkazu na článek | site | ναι | zkratka projektu |
id | όχι | identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou) | ||
of | όχι | identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti | ||
getCount | vrátí počet tvrzení podle daných kritérií | všechny parametry pro filtrování | ||
getCurrentId | vrátí id položky, se kterou je stránka propojena | |||
getId* | Vrátí id položky propojené se zadanou stránkou. Není-li propojená a jedná se o Βικιπαίδεια:Ανακατεύθυνση, následuje jej (i rekurzivně). Nepodaří-li se, zkusí další stránky, pokud jich bylo zadáno víc. Nedostane-li parametry přímo, zpracuje parametry předané volající šabloně.
(funkčnost závisí na phab:T74815) |
první, druhý, ... nepojmenovaný | όχι | název stránky na této wiki (implicitně aktuální stránka) |
getRawValue | použije stejná kritéria jako „formatStatements“, ovšem vrátí strojově čitelný (nezformátovaný) údaj | všechny parametry pro filtrování | ||
field | όχι | pokud je typ hodnoty souřadnice, toto je její část, která se zobrazí; jedno z „latitude“, „longitude“, „precision“ a „globe“ | ||
getRawValueFromLua | jako „getRawValue“, pro použití v jiném modulu | entity | όχι | tabulka s entitou, s níž má modul pracovat |
getQualifier* | qualifier | ναι | ||
getRawQualifier* | qualifier | ναι | ||
formatEntity | lokalizuje položku zadanou pomocí jejího identifikátoru (pokusí se vytvořit lokální odkaz a zobrazit štítek) | id | όχι | id položky, která se má zformátovat (jinak id položky, se kterou je stránka propojena) |
--script that retrieves basic data stored in Wikidata, for the datamodel, see https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua
local p = {}
local linguistic = 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
local fb = require('Module:Fallback')
local i18nmessages = mw.loadData('Module:i18n/wikidata')
local tools = require('Module:Wikidata/Outils')
local translate = tools.translate
local defaultlang = mw.getContentLanguage():getCode()
-- Wiki-specific parameters
local defaultlang = mw.getCurrentFrame():preprocess("{{int:lang}}")
local defaultlink = 'wikidata'
local function i18n(str, lang)
local message = i18nmessages[str]
if type(message) == 'string' then
return message
end
return fb._langSwitch(message, lang or defaultlang)
end
local function formatError( key, text )
return error(i18n(key) .. (text or ''))
end
local function addTrackingCat(prop, cat)
if not prop and not cat then
return error("no property provided")
end
if not cat then
cat = i18nmessages.trackingcat .. '/' .. string.upper(prop)
end
return '[[Category:' .. cat .. ']]'
end
local function removeBlanks(args)
for i, j in pairs(args) do -- does not work ??
if (j == '') or (j == '-') then args[i] = nil end
end
return args
end
local function formatTheUnknown() -- voir si on peut accorder/adapter l'usage de "inconnu"
return i18n('somevalue')
end
local function isSpecial(snak)
return snak.snaktype ~= 'value'
end
local function sameValue(snak, target)
return not isSpecial(snak) and p.getRawvalue(snak) == target
end
local function showLang(statement, str) -- TODO (not yet in proper format)
--adds a lang indication at the start of the string, based on data in statement
local mainsnak = statement.mainsnak
if isSpecial(mainsnak) then
return str
end
local langlist = {}
if mainsnak.datavalue.type == 'monolingualtext' then
langlist = {mainsnak.datavalue.value.language}
elseif statement.qualifiers and statement.qualifiers.P407 then
local convertlangcode = mw.loadData('Module:Dictionary/lang codes')
for i, j in pairs( statement.qualifiers.P407 ) do
if not isSpecial(j) then
local val = convertlangcode[j.datavalue.value['numeric-id']]
table.insert(langlist, val)
end
end
end
if #langlist == 0 then
return str
else
return '('.. table.concat(langlist) .. ')' .. str
end
end
function p.getEntity( val )
if type(val) == 'table' then
return val
end
return mw.wikibase.getEntityObject(val)
end
-- DATE FUNCTIONS
local function splitTimestamp(timestamp, calendar)
local pattern = "(%W)(%d+)%-(%d+)%-(%d+)"
local era, year, month, day = timestamp:match(pattern)
if calendar == '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
local function rangeObject(begin, ending)
local timestamp
if begin then
timestamp = begin.timestamp
elseif ending then
timestamp = ending.timestamp
end
return {begin = begin, ending = ending, timestamp = timestamp, type = 'rangeobject'}
end
local function dateObject(orig, params) -- transforme un snak en un nouvel objet utilisable par Module:Date complexe
if not params then
params = {}
end
local newobj = splitTimestamp(orig.time, orig.calendar) -- initalise l'object en mettant la valeur des dates
newobj.precision = params.precision or orig.precision
newobj.type = 'dateobject'
return newobj
end
local function formatDatepoint(obj, params) -- TO IMPROVE
if not obj then
return nil
end
local era = obj.era == '-' and 'bc' or ''
local formatDate = require('Module:Complex date')
local lang = params.lang or defaultlang
local precision = math.min(obj.precision, params.precision or 15) -- if we don't want to show the value to its full detail
if precision >= 11 then
return formatDate.complex_date{args={date1 = obj.year .. '-' .. obj.month .. '-' .. obj.day, lang= lang, era1 = era}}
elseif precision == 10 then
return formatDate.complex_date{args={date1 = obj.year .. '-' .. obj.month, lang= lang, era1 = era}}
elseif precision == 9 then
return formatDate.complex_date{args={date1 = tostring(obj.year), lang= lang, era1 = era}}
elseif precision == 8 then
return formatDate.complex_date{args={date1 = string.sub(tostring(obj.year), 1, 3) .. '0', lang = lang, precision = 'decade', era1 = era}}
elseif precision == 7 then
return formatDate.complex_date{args={date1 = tostring(obj.year / 100), lang = lang, precision = 'century', era1 = era}}
end
return nil
end
local function formatDaterange(obj, params) --TODO
local begin = formatDatepoint(obj.begin, params) or ''
local ending = formatDatepoint(obj.ending, params) or ''
return begin .. '-' .. ending
end
local function objectToText(obj, params)
if obj.type == 'dateobject' then
return formatDatepoint(obj, params)
elseif obj.type == 'rangeobject' then
return formatDaterange(obj, params)
end
return nil
end
local function tableToText(values, params) -- takes a list of already formatted values and make them a text
if not values then
return nil
end
return linguistic.conj(values, params.lang or defaultlang, params.conjtype)--linguistic.conj( values, params.lang, params.conjtype )
end
function p.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}
]]--
if not obj then
return nil
end
if type(obj) == 'string' then
obj = p.getEntity(obj)
end
-- if obj is a statement with date, get it
if obj.mainsnak and not isSpecial(obj.mainsnak) and obj.mainsnak.datatype == 'time' then
return dateObject(obj.mainsnak.datavalue.value)
end
-- else preload relevant data
local qualifs = obj.qualifiers -- when obj is a statement, look in qualifiers
local claims = obj.claims -- when obj is an item, look in claims
local pointprop = {'P585', 'P571'} -- dates corresponding to a punctual fact
local beginprop = {'P580', 'P569'} -- start date, birth date == start of a date range
local endingprop = {'P582', 'P570'}
local function getval(prop)
local val
if claims and claims[prop] and not isSpecial(claims[prop][1].mainsnak) then
val = claims[prop][1].mainsnak.datavalue.value
elseif qualifs and qualifs[prop] and not isSpecial(qualifs[prop][1]) then
val = qualifs[prop][1].datavalue.value
end
if val then
return dateObject(val)
end
return nil
end
for i, prop in pairs(pointprop) do
local val = getval(prop)
if val then return val end
end
--if no date has not been found, look for startdate or enddate
local begin, ending
for i, prop in pairs(beginprop) do
begin = getval(prop)
if begin then
break
end
end
for i, prop in pairs(endingprop) do
ending = getval(prop)
if ending then
break
end
end
if begin or ending then
return rangeObject(begin, ending)
end
return nil
end
function p.getFormattedDate(statement, params)
local datetable = p.getDate(statement)
if not datetable then
return nil
end
return objectToText(datetable, params)
end
local function hasTargetValue(claim, target)
if target == nil then
return true
end
return sameValue(claim.mainsnak, target)
end
local function hasRank(claim, target)
if target == 'valid' then
return hasRank(claim, 'preferred') or hasRank(claim, 'normal')
else
return claim.rank == target
end
end
local function bestRanked(claims)
if not claims then
return nil
end
local preferred, normal = {}, {}
for i, j in pairs(claims) do
if j.rank == 'preferred' then
table.insert(preferred, j)
elseif j.rank == 'normal' then
table.insert(normal, j)
end
end
if #preferred > 0 then
return preferred
else
return normal
end
end
local function hasQualifier(claim, qualifier, qualifiervalues)
if not qualifier then -- si aucun qualificatif est demandé, ça passe
return true
end
qualifier = string.upper(qualifier)
if not claim.qualifiers or not claim.qualifiers[qualifier] then
return false
end
if type(qualifiervalues) == 'string' then
qualifiervalues = mw.text.split(qualifiervalues, ',')
end
if (not qualifiervalues) or (qualifiervalues == {}) then
return true -- si aucune valeur spécifique n'est exigée
end
for i, j in pairs(claim.qualifiers[qualifier]) do
for k, l in pairs(qualifiervalues) do
if p.getRawvalue(j) == l then
return true
end
end
end
return false
end
local function hasSource(statement, source, sourceproperty)
if not statement.references then
return false
end
sourceproperty = string.upper(sourceproperty or 'P248')
local sourcevalue = string.upper(source or '')
for i, ref in pairs(statement.references) do
for prop, content in pairs(ref.snaks) do
if prop == sourceproperty then
if sourcevalue == '' then
return true
else
for j, k in pairs(content) do
if p.getRawvalue(k) == source then
return true
end
end
end
end
end
end
return false
end
local function hasDate(statement)
if not statement.qualifiers then
return false
end
local dateprops = {'P580', 'P585', 'P582'}
for i, prop in pairs(dateprops) do
if statement.qualifiers[prop] then
return true
end
end
return false
end
local function isInLanguage(snak, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ?
return not isSpecial(snak) and snak.datavalue.type == 'monolingualtext' and snak.datavalue.value.language == lang
end
local function numval(claims, numval) -- retourn les numval premières valeurs de la table claims
local numval = tonumber(numval) or 0 -- raise a error if numval is not a positive integer ?
if #claims <= numval then
return claims
end
local newclaims = {}
while #newclaims < numval do
table.insert(newclaims, claims[#newclaims + 1])
end
return newclaims
end
function p.comparedate(a, b) -- returns true if a is earlier than B or if a has a date but not b
if a and b then
return a.timestamp < b.timestamp
elseif a then
return true
end
return false
end
function p.chronosort(objs, inverted)
table.sort(objs, function(a, b)
local timeA = p.getDate(a)
local timeB = p.getDate(b)
if inverted then
return p.comparedate(timeB, timeA)
else
return p.comparedate(timeA, timeB)
end
end)
return objs
end
function p.sortclaims(claims, sorttype)
if type(sorttype) == 'function' then
table.sort(claims, sorttype)
elseif sorttype == 'chronological' then
return p.chronosort(claims)
elseif sorttype == 'inverted' then
return p.chronosort(claims, true)
end
return claims
end
function p.getRawvalue(snak)
return p.getDatavalue(snak, {displayformat = 'raw'})
end
function p.showentity(entity, lang)
if not entity then
return nil
end
if type(entity) == 'string' then
entity = p.getEntity(entity)
end
if not entity or not entity.type then
return formatError('entity-not-found')
end
local label = p._getLabel(entity, lang)
local id = entity.id
local link = id
if entity.type == 'property' then
link = 'Property:' .. link
end
return '[[' .. link .. '|' .. label .. ']] <small>(' .. id .. ')</small>'
end
function p.getDatavalue(snak, params)
if isSpecial(snak) then
return nil
end
if not params then
params = {}
end
local displayformat = params.displayformat
local datatype = snak.datavalue.type
local value = snak.datavalue.value
if datatype == 'wikibase-entityid' then
if type(displayformat) == 'function' then
return displayformat(snak, params)
end
local prefix = 'Q'
if snak.datavalue.value["entity-type"] == 'property' then
prefix = 'P'
end
local id = prefix .. tostring(value['numeric-id'])
if displayformat == 'raw' then
return id
elseif displayformat == 'wikidatastyle' then
return p.showentity(id, params.lang)
else
return p.formatEntity(id, params)
end
elseif datatype == 'string' then
local showntext = params.showntext
if displayformat == 'weblink' then
if showntext then
return '[' .. value .. ' ' .. showntext .. ']'
else
return value
end
end
if snak.datatype == 'math' and displayformat ~= 'raw' then
value = mw.getCurrentFrame():extensionTag('math', value)
end
if params.urlpattern then
value = '[' .. mw.ustring.gsub(mw.ustring.gsub(params.urlpattern, '$1', value), ' ', '%%20') .. ' ' .. (showntext or value) .. ']'
end
return value
elseif datatype == 'time' then -- format example: +00000001809-02-12T00:00:00Z
if displayformat == 'raw' then
return value.time
else
return objectToText(dateObject(value), params)
end
elseif datatype == 'globecoordinate' then
-- retourne une table avec clés latitude, longitude, précision et globe à formater par un autre module (à changer ?)
if displayformat == 'latitude' then
return value.latitude
elseif displayformat == 'longitude' then
return value.longitude
elseif displayformat == 'qualifier' then
local coord = require 'Module:Coordinates'
value.globe = require('Module:Wikidata/Globes')[value.globe]
value.precision = nil
return coord._coord(value)
else
value.globe = require('Module:Wikidata/Globes')[value.globe] -- transforme l'ID du globe en nom anglais utilisable par geohack
return value -- note : les coordonnées Wikidata peuvent être utilisée depuis Module:Coordinates. Faut-il aussi autoriser à appeler Module:Coordiantes ici ?
end
elseif datatype == 'quantity' then -- todo : gérer les paramètre précision
if displayformat == 'raw' then
return tonumber(value.amount)
else
local formatNum = require 'Module:Formatnum'
local number = formatNum.formatNum(value.amount)
local unit = mw.ustring.match(value.unit, '(Q%d+)')
if unit then
number = number .. ' ' .. p.formatEntity(unit, params)
end
return number
end
elseif datatype == 'monolingualtext' then
return '<span lang="' .. value.language .. '">' .. value.text .. '</span>'
else
return formatError( 'unknown-datavalue-type', datatype )
end
end
local function getMultipleClaims(args)
local newargs = args
local claims = {}
for i, j in pairs(args.property) do
newargs.property = j
local newclaims = p.getClaims(args)
if newclaims then
for k, l in pairs(newclaims) do
table.insert(claims, l)
end
end
end
return claims
end
function p.getClaims( args ) -- returns a table of the claims matching some conditions given in args
args = removeBlanks(args)
if not args.property then
return formatError( 'property-param-not-provided' )
end
if type(args.property) == 'table' then
return getMultipleClaims(args)
end
--Get entity
if args.item then -- synonyms
args.entity = args.item
end
local entity = args.entity
if type(entity) ~= 'table' then
entity = p.getEntity(entity)
end
local property = string.upper(args.property)
if not entity or not entity.claims or not entity.claims[property] then
return nil
end
if not args.rank then
args.rank = 'best'
end
local claims = {}
-- ~= '' lorsque le paramètre est écrit mais laissé blanc dans une fonction frame
for i, statement in pairs(entity.claims[property]) do
if
(
not args.excludespecial
or
not (isSpecial(statement.mainsnak))
)
and
(
not args.targetvalue
or
hasTargetValue(statement, args.targetvalue)
)
and
(
not args.qualifier
or
hasQualifier(statement, args.qualifier, args.qualifiervalues or args.qualifiervalue)
)
and
(
not args.withsource or args.withsource == '-'
or
hasSource(statement, args.withsource, args.sourceproperty)
)
and
(
not args.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 == 0 then
return nil
end
if args.rank == 'best' then
claims = bestRanked(claims)
end
if args.sorttype then
claims = p.sortclaims(claims, args.sorttype)
end
if args.numval then
return numval(claims, args.numval)
end
return claims
end
function p.formatClaimList(claims, args)
if not claims then
return nil
end
for i, j in pairs(claims) do
claims[i] = p.formatStatement(j, args)
end
return claims
end
function p.stringTable(args) -- like getClaims, but get a list of string rather than a list of snaks, for easier manipulation
local claims = p.getClaims(args)
return p.formatClaimList(claims, args)
end
local function getQualifiers(statement, qualifs, params)
if not statement.qualifiers then
return nil
end
local vals = {}
for i, j in pairs(qualifs) do
j = string.upper(j)
if statement.qualifiers[j] then
local inserted = false
if statement.qualifiers[j][1].datatype == 'monolingualtext' then
local in_preferred_lang
for _, language in pairs(fb.fblist(params.lang or defaultlang)) do
for _, snak in pairs(statement.qualifiers[j]) do
if isInLanguage(snak, language) then
in_preferred_lang = snak
break
end
end
if in_preferred_lang then
break
end
end
if in_preferred_lang then
table.insert(vals, in_preferred_lang)
inserted = true
end
end
if not inserted then
for _, snak in pairs(statement.qualifiers[j]) do
table.insert(vals, snak)
end
end
end
end
if #vals == 0 then
return nil
end
return vals
end
function p.getFormattedQualifiers(statement, qualifs, params)
if not params then params = {} end
local qualiftable = getQualifiers(statement, qualifs, params)
if not qualiftable then
return nil
end
for i, j in pairs(qualiftable) do
local params = params
if j.datatype == 'globe-coordinate' then
params.displayformat = 'qualifier'
end
qualiftable[i] = p.formatSnak(j, params)
end
return linguistic.conj(qualiftable, params.lang or defaultlang, params.qualifconjtype or '')
end
function p.formatStatement( statement, args )
if not statement.type or statement.type ~= 'statement' then
return formatError( 'unknown-claim-type', statement.type )
end
if not args then args = {} end
local lang = args.lang or defaultlang
local str = p.formatSnak( statement.mainsnak, args )
if tostring( args.showlang ) == 'true' then
str = showLang(statement, str)
end
local qualifs = args.showqualifiers
if qualifs then
if type(qualifs) == 'string' then
qualifs = mw.text.split(qualifs, ',')
end
local foundvalues = p.getFormattedQualifiers(statement, qualifs, args)
if foundvalues then
if args.delimiter then
str = str .. args.delimiter .. foundvalues
else
str = str .. linguistic.inparentheses(foundvalues, lang)
end
end
end
if args.showdate then -- when "showdate and p.chronosort are both set, date retrieval is performed twice
local timedata = p.getDate(statement)
if timedata then
local formatteddate = objectToText(timedata, args)
formatteddate = linguistic.inparentheses(formatteddate, lang)
str = str .. '<small>' .. formatteddate ..'</small>'
end
end
if args.showsource and statement.references then
local cite = require 'Module:Cite'
local frame = mw.getCurrentFrame()
local sourcestring = ''
for i, ref in pairs(statement.references) do
if ref.snaks.P248 then
for j, source in pairs(ref.snaks.P248) do
if not isSpecial(source) then
local page
if ref.snaks.P304 and not isSpecial(ref.snaks.P304[1]) then
page = ref.snaks.P304[1].datavalue.value
end
local s = cite.citeitem('Q' .. source.datavalue.value['numeric-id'], lang, page)
s = frame:extensionTag( 'ref', s )
sourcestring = sourcestring .. s
end
end
elseif ref.snaks.P854 and not isSpecial(ref.snaks.P854[1]) then
s = frame:extensionTag( 'ref', p.getDatavalue(ref.snaks.P854[1]) )
sourcestring = sourcestring .. s
end
end
str = str .. sourcestring
end
return str
end
function p.formatSnak(snak, params)
--local params = params or {} pour faciliter l'appel depuis d'autres modules
if snak.snaktype == 'value' then
return p.getDatavalue(snak, params)
elseif snak.snaktype == 'somevalue' then
return formatTheUnknown()
elseif snak.snaktype == 'novalue' then
return i18n('novalue') --todo
else
return formatError( 'unknown-snak-type', snak.snaktype )
end
end
local function defaultLabel(entity, lang, displayformat) -- label when no label is available
if entity and displayformat == 'id' then
return entity.id
end
return i18n('no-label', lang)
end
function p._getLabel(entity, lang, default)
if not entity then
return nil
end
if type(entity) ~= 'table' then
entity = p.getEntity(entity)
end
if entity and entity.labels then
for i, lg in pairs(fb.fblist(lang or defaultlang)) do
if entity.labels[lg] then
return entity.labels[lg].value
end
end
end
return defaultLabel(entity, lang, default)
end
function p._getDescription(entity, lang)
if not entity then
return i18n('no description')
end
if type(entity) ~= 'table' then
entity = p.getEntity(entity)
end
local descriptions = entity.descriptions
if not descriptions then
return i18n('no description')
end
if descriptions[lang] then
return descriptions[lang].value
end
local langlist = fb.fblist(lang or defaultlang) -- list of fallback languages if no label in the desired language
for i, lg in pairs(langlist) do
if descriptions[lg] then
return descriptions[lg].value
end
end
return i18n('no description')
end
function p.addLinkback(str, id, property)
if not id then
id = tools.getEntity()
end
if not id then
return str
end
if type(property) == 'table' then
property = property[1]
end
if type(id) == 'table' then
id = id.id
end
local class = ''
if property then
class = 'wd_' .. string.lower(property)
end
local icon = '[[File:Blue pencil.svg|%s|10px|baseline|link=%s]]'
local title = 'Δείτε την τιμή στα Wikidata'
local url = mw.uri.fullUrl('d:' .. id, 'uselang=el')
url.fragment = property -- ajoute une #ancre si paramètre "property" défini
url = tostring(url)
local v = mw.html.create('span')
:addClass(class)
:wikitext(str)
:tag('span')
:addClass('noprint wikidata-linkback')
:css('padding-left', '0.5em')
:wikitext(icon:format(title, url))
:allDone()
return tostring(v)
end
local function wikipediaLink(entity, lang)
local link = entity:getSitelink(lang .. 'wiki')
if link then
return ':' .. lang .. ':' .. link
end
return nil
end
local function getLink(entity, typelink, lang)
if not typelink or typelink == '-' then
return nil
end
if not lang then
lang = defaultlang
end
if typelink == 'wikidata' then
if entity.type == 'property' then
return 'd:P:' .. entity.id
else
return 'd:' .. entity.id
end
elseif typelink == 'wikipedia' then
return wikipediaLink(entity, lang)
elseif typelink == 'anywikipedia' then
local fallbacklist = fb.fblist(lang)
for i, lg in pairs(fallbacklist) do
link = wikipediaLink(entity, lg)
if link then return link end
end
end
return nil
end
local function formattedLabel(label, entity, args)
if not args then args = {} end
local link = getLink(entity, args.link, args.lang)
if not link then
link = getLink(entity, defaultlink, args.lang)
end
if not link then
return label
else
return '[[' .. link .. '|' .. label .. ']]'
end
end
function p.getmainid(claim)
if claim and not isSpecial(claim.mainsnak) then
return 'Q' .. claim.mainsnak.datavalue.value['numeric-id']
end
return nil
end
function p.formatEntity( entity, args )
if not entity then
return nil
end
if not args then args = {} end
if type(entity) == 'string' then
entity = p.getEntity(entity)
end
local label = p._getLabel(entity, args.lang)
if not label then
label = entity.id
end
return formattedLabel(label, entity, args)
end
function p.getLabel(frame) -- simple for simple templates like {{Q|}}}
local args = frame.args
local entity = args.entity
local lang = args.lang
if lang == '' then
lang = defaultlang
end
if string.sub(entity, 1, 10) == 'Property:P' then
entity = string.sub(entity, 10)
elseif (string.sub(entity, 1, 1) ~= 'P' and string.sub(entity, 1, 1) ~= 'Q') or (not tonumber(string.sub(entity, 2))) then
return i18n('invalid-id')
end
if not args.link or args.link == '' then -- by default: no link
args.link = '-'
end
if args.link == '-' then
return p._getLabel(entity, lang) or i18n('invalid-id')
else
return p.formatEntity(entity, args)
end
end
function p._formatStatements( args )--Format statements and concat them cleanly
if args.value == '-' then
return nil
end
--If a value is already set, use it
if args.value and args.value ~= '' then
return args.value
end
local valuetable = p.stringTable(args)
local str= tableToText(valuetable, args)
if not str then
return nil
end
if args.linkback and (args.linkback ~= '-') then
str = p.addLinkback(str, args.entity, props)
end
end
function p.showQualifier( args )
local qualifs = args.qualifiers or args.qualifier
if type(qualifs) == 'string' then
qualifs = mw.text.split(qualifs, ',')
end
if not qualifs then
return formatError( 'property-param-not-provided' )
end
local claims = p.getClaims(args)
if not claims then
return nil
end
local str = ''
for i, j in pairs(claims) do
local new = p.getFormattedQualifiers(j, qualifs, args) or ''
str = str .. new
end
return str
end
function p._formatAndCat(args)
local val = p._formatStatements(args)
if val then
return val .. addTrackingCat(args.property)
end
return nil
end
function p.getTheDate(args)
local claims = p.getClaims(args)
if not claims then
return nil
end
local formattedvalues = {}
for i, j in pairs(claims) do
table.insert(formattedvalues, p.getFormattedDate(j))
end
local val = linguistic.conj(formattedvalues)
if val and args.addcat == true then
val = p.addLinkback(val, args.entity, args.property)
return val .. addTrackingCat(args.property)
else
val = p.addLinkback(val, args.entity, args.property)
return val
end
end
---FONCTIONS depuis le FRAME
function p.getaDate(frame)
return p.getTheDate(frame.args)
end
function p.getQualifier(frame)
return p.showQualifier(frame.args)
end
function p.getDescription(frame) -- simple for simple templates like {{Q|}}}
local entity = frame.args.entity
local lang = frame.args.lang
return p._getDescription(entity, lang) or i18n('invalid-id')
end
function p.formatStatements( args )
return p._formatStatements( args )
end
function p.formatStatementsE(frame)
local args = {}
if frame == mw.getCurrentFrame() then
args = frame:getParent().args -- paramètres du modèle appelant (est-ce vraiment une bonne idée ?)
for k, v in pairs(frame.args) do
args[k] = v
end
else
args = frame
end
return p._formatStatements( args )
end
function p.formatAndCat(frame)
local args = {}
if frame == mw.getCurrentFrame() then
args = frame:getParent().args -- paramètres du modèle appelant (est-ce vraiment une bonne idée ?)
for k, v in pairs(frame.args) do
args[k] = v
end
else
args = frame
end
return p._formatAndCat( args )
end
function p.getEntityFromId(id)
return p.getEntity(id)
end
-- returns the page id (Q...) of the current page or nothing of the page is not connected to Wikidata
function p.pageId(frame)
local entity = mw.wikibase.getEntityObject()
if not entity then return nil else return entity.id end
end
return p