هذه الوحدة مستخدمة في عدد كبير من الصفحات (+2769524) .
لتفادي خلق بلبلة على نطاق واسع من الصفحات وزيادة الأعباء على الخوادم، يجب تجربة أي تعديل في هذه الصفحات الفرعية /ملعب أو /تجربة أو في ملعبك. بعدها يمكنك اضافة التعديلات دفعة واحدة، ورجاءً، لا تنسَ مناقشة أمر التعديلات أوّلًا قبل القيام بها.
|label= اذا كنت تريد الاختيار كيفية ظهور الوصلات. مثلا [[شعار مقاطعة بليكينج|الشعار]] يمكن الحصول عليها عن طريق اضافة |label=الشعار تؤثر هذه المعلمة على وحدات القياس.
|raw= يعود بالنتيجة خام على شكل جداول (يستخدم من داخل وحدات لوا أخرى) ويمكن معاينة ما سيكون الناتج عليه عبر إضافة خيار |rawtolua=.
فصل القيم
|separator= فاصلة بين البنود | انظر أيضا conjunction
|conjunction= الفاصلة الأخيرة قبل اخر بند، افتراضي ، و .
{{#invoke:Wikidata2{{#تبديل:{{SUBPAGENAME}}|ملعب=/ملعب}} |formatStatements|entityId=Q76|property=P39|qual1=P1545|noref=true|rank=best}} ينتج :← رئيس الولايات المتحدة (44)
فلترة النتائج
|avoidqualifier= يتجاهل القيم التي تحتوي تصفيات معينة، مثل: |avoidqualifier=P518 يظهر البند الذي لا يحتوي على تصفية (P518).
بإستخدام |avoidqualifiervalue= مع |avoidqualifier= فإن ذلك يحدد قيمة التصفية إذا طابقت الوسيط |avoidqualifiervalue= فلن يتم إظهارها، وإذا لم تطابق فسيتم إظهارها، يدعم حالياً العناصر/items فقط.
|preferqualifier= تحديد خاصية تصفيات يجب أن تكون بيانات الخاصية متضمنتها.
|preferqualifiervalue= تحدد القيمة التي تناسب أعلاه. يدعم حالياً العناصر فقط.
|justthisqual= يظهر فقط التصفية، إذا لم تكن التصفية موجودة لن يظهر شيء.
|formatting=sitelink يعرض القيم التي تحتوي مقالة في أرابيكا العربية.
= فلترة النتيجة =
|getonly= يستخدم هذا الوسيط إذا أردنا الحصول على عناصر معينة التي تكون قيمة (P31) فيها تساوي قيمة هذا الوسيط، مثال:
|getonly=Q5 للحصول على الأفراد فقط.
القيم المتعددة ممكنة، مثل :|getonly=Q127448,Q193556 للحصول على البلديات السويدية والمناظر الطبيعية.
|getonlyproperty= إذا أردنا استخدام خاصية أخرى بدلاً من (P31) في البند السابق.
|avoidvalue= يستخدم هذا الوسيط إذا أردنا أن نتجاهل أو نلغي ظهور عنصر معين، مثال عند وضع |avoidvalue=Q21769847 فتظهر النتائج دون ظهور (Q21769847).
= prefervalue =
|prefervalue= يستخدم هذا الوسيط بشكل معاكس للوسيط |avoidvalue= حيث نقوم بتحديد القيمة التي نريد ظهورها |prefervalue=Q19481 فتظهر النتيجة للعنصر (Q19481) فقط، ولكن الفائدة من إستخدام هذا الوسيط هي التأكد من وجود العنصر في هذه الخاصية أو للحصول على التصفيات، مثال يظهر عناصر (P1346) مع تصفية (P1923) بين قوسين.
إذا كنا قد حصلنا عبر خاصية (P1346) عن الفريق الفائز في (Q39052816). وأردنا الحصول على عدد مرات الفوز للفريق الفائز، من الجدول السابق ويتم ذلك بإستخدام الوسيط |justthisqual= ما ينتج:
|avoidvalue= يستخدم هذا الوسيط بشكل معاكس للوسيط |prefervalue= إذا أردنا أن نتجاهل أو نلغي ظهور عنصر معين، مثال عند وضع |avoidvalue=Q50602 فتظهر النتائج دون ظهور (Q50602).
|NosValue= يستخدم لإظهار نتيجة ما عند عدم وجود قيمة محلية في وسيط |value= وعدم وجود قيمة في ويكي بيانات.
property-(module/function) و claim-(module/function) و value-(module/function)
يتم دعم ثلاثة أنواع من معلمات الوظائف، والتي تشير أيضًا إلى كيفية تنسيق القيم:
|-module= عنوان الوحدة
|-function= عنوان الوظيفة
property
fun( claims, options )
|property-module= عنوان الوحدة مثل |property-module=وحدة:Wikidata2/P54
|property-function= عنوان الوظيفة مثل |property-function=foot
تستخدم هذه الخيارات عند الحاجة لتنسيق قيم الخاصية بشكل كامل مثلاً لوضعها في جدول معين، أو فرزها بتنسيق خاص، مع إمكانية الحصول على التصفيات/qualifiers والمراجع/references وتنسيقها والتحكم بها.
أمثلة:
الوحدة وحدة:Wikidata2/P54 الخاصة بعرض فرق لاعبي كرة القدم، مثل أندية كرة القدم حيث يتم فصل المنتخبات عن الأندية.
claim
fun( statement, options )
|claim-module= عنوان الوحدة مثل |claim-module=وحدة:Wikidata2/P39
|claim-function= عنوان الوظيفة مثل |claim-function=office3
تستخدم هذه الخيارات عند الحاجة لتنسيق قيم الخاصية بشكل منفرد، مع إمكانية الحصول على التصفيات/qualifiers والمراجع/references وتنسيقها والتحكم بها.
|value-module= عنوان الوحدة مثل |value-module=وحدة:Wikidata2/P106
|value-function= عنوان الوظيفة مثل |value-function=formatEntityWithGenderClaim
تستخدم هذه الخيارات عند الحاجة لتنسيق قيم الخاصية بشكل منفرد لكل قيمة مثلاً لأخذ تسمية الإناث عند إستخدام خاصية (P106)، لا نستطيع هنا الحصول على التصفيات/qualifiers والمراجع/references.
مثال موسع: {{#invoke:Wikidata2{{#تبديل:{{SUBPAGENAME}}|ملعب=/ملعب}} |Dump|claims|P1791|1|references|1|snaks|P244|1|datavalue|value}}
isSubclass / نوع فرعي من
إن كانت قيمة (P31) أو (P279) للصفحة التي وضع فيها الكود أو للصفحة في الوسيط |id= مساوية للوسيط |parent= ينتج 'true' غير ذلك لا ينتج شيئاً.
كامل الخيارات:{{#invoke:Wikidata2{{#تبديل:{{SUBPAGENAME}}|ملعب=/ملعب}} |isSubclass|parent=|maxDepth=1|property=|id=|exitItem=}}
{{#invoke:Wikidata2/ملعب|isSubclass|maxDepth=5|id=Q76|parent=Q45}} ← خطأ لوا: عدد كبير جدا من ادعاءات "mw.wikibase.getReferencedEntityId"، فقط ما يصل إلى 3 مسموح به..
EntityIdForTitle
يعطي معرف ويكي بيانات من خلال عنوان مقالة أرابيكا العربية:
local p = {}
local Frame_args = {}
local Moduletext
local Modulecite
local Moduleflags
local InfoboxImage
local ModuleGlobes
local formatera
local weblink
local citetitle = "Module:Cite Q"
if nil ~= string.find(mw.getCurrentFrame():getTitle(), "ملعب", 1, true) then
citetitle = "Module:Cite Q/ملعب"
end
local i18n = {
["errors"] = {
["property-param-not-provided"] = "وسيط property غير متوفر.",
["entity-not-found"] = "الكيان غير موجود.",
["unknown-claim-type"] = "نوع claim غير معروف.",
["unknown-snak-type"] = "نوع snak غير معروف.",
["unknown-datatype"] = "نوع data غير معروف.",
["unknown-entity-type"] = "نوع entity غير معروف.",
["unknown-value-module"] = "يجب عليك تعيين كل من value-module و value-function.",
["unknown-claim-module"] = "يجب عليك تعيين كل من claim-module و claim-function.",
["unknown-property-module"] = "يجب عليك تعيين كل من property-module و property-function.",
["property-module-not-found"] = "الوحدة المستخدمة في وسيط property-module غير موجودة.",
["property-function-not-found"] = "الوظيفة المستخدمة في وسيط property-function غير موجودة.",
["value-module-not-found"] = "الوحدة المستخدمة في وسيط value-module غير موجودة.",
["value-function-not-found"] = "الوظيفة المستخدمة في وسيط value-function غير موجودة.",
["claim-module-not-found"] = "الوحدة المستخدمة في وسيط claim-module غير موجودة.",
["claim-function-not-found"] = "الوظيفة المستخدمة في وسيط claim-function غير موجودة."
},
["noarabiclabel"] = "تصنيف:صفحات_ويكي_بيانات_بحاجة_لتسمية_عربية",
["warnDump"] = "[[Category:Called function 'Dump' from module Wikidata]]",
["somevalue"] = "", --'"غير محدد"'
["novalue"] = "", --قيمة مجهولة
["cateref"] = "[[" .. "تصنيف:صفحات بها مراجع ويكي بيانات" .. "]]",
["to translate"] = "صفحات تستعمل معطيات من ويكي بيانات بحاجة لترجمة",
["trackingcat"] = "صفحات تستخدم خاصية $1",
["see-wikidata-value"] = "الاطلاع ومراجعة البيانات على ويكي داتا",
["see-wikidata"] = "راجع العنصر من ويكي بيانات المقابل",
["see-another-project"] = "مقالة على $1",
["see-another-language"] = "مقالة على أرابيكا $1"
}
local sortingproperties = {"P585", "P571", "P580", "P569", "P582", "P570"}
local sorting_methods = {
["chronological"] = "chronological",
["تصاعدي"] = "chronological",
["asc"] = "chronological",
["inverted"] = "inverted",
["تنازلي"] = "inverted",
["desc"] = "inverted"
}
local falsetitles = {
"قالب:قيمة ويكي بيانات",
"وحدة:Wikidata2"
}
local skiip_items = {
["P106"] = {
"Q42857", -- prophet
"Q14886050", -- terrorist
"Q2159907" -- criminal
}
}
function isvalid(x)
if x and x ~= "" then return x end
return nil
end
function isntvalid(x)
if not x or x == "" or x == nil then return true end
return false
end
function No_Tracking_cat(options)
if isvalid(options.formatting) == "raw" or isvalid(options.formatting) == "sitelink" then
return true
end
local notracking = isvalid(options.nocate) or isvalid(options.notracking) or isvalid(Frame_args.notracking)
local raw = isvalid(options.raw) or isvalid(Frame_args.raw) or isvalid(options.raw2) or isvalid(Frame_args.raw2)
local nolink = isvalid(options.nolink) or isvalid(Frame_args.nolink)
if notracking or raw or nolink then
return true
end
local pagetitle = mw.title.getCurrentTitle().text
for _, title in pairs(falsetitles) do
if string.find(pagetitle, title, 1, true) then
mw.log("notracking for title with: " .. title)
return true
end
end
return false
end
function addTrackingCategory(options)
if No_Tracking_cat(options) then
return ""
end
local cat = require("Module:Wikidata/تتبع").makecategory1
local category = cat(options)
local nbsp = " "
if isvalid(options.nbsp) then
nbsp = ""
end
if isvalid(category) then
return nbsp .. category
end
return ""
end
function catewikidatainfo(options)
--[[ function to add tracking category ]]
if No_Tracking_cat(options) then
return ""
end
local cat = ""
local prop = options.property
cat = cat .. " [[" .. "تصنيف:صفحات بها بيانات ويكي بيانات|" .. (prop or "wikidata") .. "]]"
if isntvalid(options.nolink) then
return cat
else
return ""
end
end
function getqualifierbysortingproperty(claim, sortingproperty)
for k, v in pairs(sortingproperty) do
if claim and claim.qualifiers and claim.qualifiers[v] and claim.qualifiers[v][1].snaktype == "value" then
local vali = claim.qualifiers[v][1].datavalue.value.time or claim.qualifiers[v][1].datavalue.value.amount
if vali:sub(1, 1) == "+" then
vali = vali:sub(2)
end
--mw.log(vali)
return vali
end
end
return nil
end
function get_sorting_properties(options)
if type(options.sortingproperty) == "table" then
return options.sortingproperty
elseif type(options.sortingproperty) == "string" and options.sortingproperty ~= "" then
return mw.text.split(options.sortingproperty, ",")
else
return sortingproperties
end
end
function getDate(claim, options)
local sortingproperty = get_sorting_properties(options)
return getqualifierbysortingproperty(claim, sortingproperty)
end
function get_entityId(options)
local id = isvalid(options.entityId) or isvalid(options.id) or isvalid(options.qid)
if id then
return id
end
if isvalid(options.page) then
id = mw.wikibase.getEntityIdForTitle(options.page)
else
id = mw.wikibase.getEntityIdForCurrentPage()
end
return id or ""
end
function countSiteLinks(id)
local numb = 0
local entity = mw.wikibase.getEntityObject(id)
if entity and entity.sitelinks then
for i, v in pairs(entity.sitelinks) do
numb = numb + 1
end
end
return numb
end
function make_format_num(String)
local line = String
line = mw.getCurrentFrame():preprocess("{{ {{{|safesubst:}}}formatnum: " .. String .. " }}")
line = mw.ustring.gsub(line, "٫", ".")
line = mw.ustring.gsub(line, "٬", ",")
return line
end
function formatcharacters(label, options)
local formatch = options.formatcharacters
--if options.FormatfirstCharacter and options.num == 1 then
--formatch = options.FormatfirstCharacter
--end
local String2 = mw.ustring.gsub(label, "–", "-")
local march_y =
mw.ustring.match(String2, "%d%d%d%d%-%d%d%d%d", 1) or mw.ustring.match(String2, "%d%d%-%d%d%d%d", 1) or
mw.ustring.match(String2, "%d%d%d%d", 1) or
mw.ustring.match(String2, "%d%d%d%d%-%d%d", 1) or
mw.ustring.match(String2, "%d%d%d%d", 1)
if isvalid(options.illwd2y) then
return march_y or label
end
if isvalid(options.illwd2noy) and march_y then
label = mw.ustring.gsub(label, march_y, "")
return label
end
if isntvalid(formatch) then
return label
end
local prepr = {
["lcfirst"] = "{{lcfirst: " .. label .. " }}",
["lc"] = "{{lc: " .. label .. " }}",
["uc"] = "{{uc: " .. label .. " }}"
}
if prepr[formatch] then
return mw.getCurrentFrame():preprocess(prepr[formatch])
elseif formatch == "ucfirst" then
return mw.language.getContentLanguage():ucfirst(label)
elseif formatch == "formatnum" then
return make_format_num(label)
end
return label
end
function descriptionIn(langcode, id) -- returns item description for a given language
if isntvalid(langcode) then
langcode = "ar"
end
langcode = mw.text.trim(langcode or "")
id = mw.text.trim(id or "")
if langcode == "ar" then
local description, lange = mw.wikibase.getDescriptionWithLang(id)
if lange == langcode then
return description
else
return nil
end
else
local entity = getEntityFromId(id)
if entity and entity.descriptions then
local description = entity.descriptions[langcode]
if description and description.value then
if description["language"] == langcode then
return description.value
end
end
end
end
return nil
end
function labelIn(langcode, id) -- returns item label for a given language
if isntvalid(langcode) then
langcode = "ar"
end
if type(id) ~= "string" then
id = tostring(id)
end
langcode = mw.text.trim(langcode or "")
id = mw.text.trim(id or "")
local label = mw.wikibase.getLabelByLang(id, langcode) or nil
return label
end
function get_snak_id(snak)
if
snak and snak.type and snak.type == "statement" and snak.mainsnak and snak.mainsnak.snaktype and
snak.mainsnak.snaktype == "value" and
snak.mainsnak.datavalue and
snak.mainsnak.datavalue.type and
snak.mainsnak.datavalue.type == "wikibase-entityid" and
snak.mainsnak.datavalue.value and
snak.mainsnak.datavalue.value.id
then
ID = snak.mainsnak.datavalue.value.id
return ID
end
end
function comparedates(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 > b
elseif a then
return true
end
end
function getDateArb(claim, sorting_properties)
local sortingproperty = sorting_properties
if claim.mainsnak.snaktype == "value" then
local item = claim.mainsnak.datavalue.value["numeric-id"]
if claim.mainsnak.datavalue.value["entity-type"] == "item" then
item = "Q" .. item
elseif claim.mainsnak.datavalue.value["entity-type"] == "property" then
item = "P" .. item
end
for k, prop in pairs(sortingproperty) do
local date =
formatStatements({property = prop, entityId = item, firstvalue = "t", noref = "t", modifytime = "q"})
if isvalid(date) then
--mw.log("item:".. item .. ", prop:".. prop .. ", date:".. date)
return date
end
end
end
end
function table_contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
function dontget(claims, options)
--[[
options.dontget
options.dontgetproperty
]]
local claims2 = {}
local dontget_values = mw.text.split(options.dontget, ",")
for _, claim in pairs(claims) do
local id = get_snak_id(claim)
if id then
local valid = true
local t2 =
formatStatements({property = (options.dontgetproperty or "P31"), entityId = id, noref = "t", raw = "t"})
if t2 and #t2 > 0 then
for _, state in pairs(t2) do
if table_contains(dontget_values, state.item) then
valid = false
break
end
end
end
if valid then
table.insert(claims2, claim)
end
end
end
return claims2
end
function getonly(claims, options)
--[[
-- options.getonly
-- options.getonlyproperty
]]
local claims2 = {}
local getonly_values = mw.text.split(options.getonly, ",")
for _, claim in pairs(claims) do
local id = get_snak_id(claim)
if id then
local t2 =
formatStatements({property = (options.getonlyproperty or "P31"), entityId = id, noref = "t", raw = "t"})
if t2 and #t2 > 0 then
for _, state in pairs(t2) do
if table_contains(getonly_values, state.item) then
table.insert(claims2, claim)
break
end
end
end
end
end
return claims2
end
function claimindex(claims, options)
local claims2 = {}
for j, index in pairs(mw.text.split(options.claimindex, ",")) do
if tonumber(index) and #claims >= tonumber(index) then
table.insert(claims2, claims[tonumber(index)])
end
end
return claims2
end
function avoidvalue(claims, options)
local avoidvalue = options.avoidvalue
if type(avoidvalue) == "string" then
avoidvalue = mw.text.split(avoidvalue, ",")
elseif type(avoidvalue) ~= "table" then
return claims
end
local claims4 = {}
for i, j in pairs(claims) do
local ID = get_snak_id(j)
if ID and not table_contains(avoidvalue, ID) then
table.insert(claims4, j)
end
end
return claims4
end
function prefervalue(claims, options)
local prefervalue = options.prefervalue
if type(prefervalue) == "string" then
prefervalue = mw.text.split(prefervalue, ",")
elseif type(prefervalue) ~= "table" then
return claims
end
local claims3 = {}
for _, claim in pairs(claims) do
local ID = get_snak_id(claim)
if ID and table_contains(prefervalue, ID) then
table.insert(claims3, claim)
end
end
return claims3
end
function preferqualifier(claims, options)
--[[
-- options.preferqualifier
-- options.preferqualifiervalue
]]
local claims2 = {}
local preferq_values = mw.text.split(options.preferqualifiervalue or "", ",")
for _, statement in pairs(claims) do
if statement.qualifiers and statement.qualifiers[options.preferqualifier:upper()] then
if isvalid(options.preferqualifiervalue) then
for _, quall in pairs(statement.qualifiers[options.preferqualifier:upper()]) do
if quall.snaktype == "value" and table_contains(preferq_values, quall.datavalue.value["id"]) then
table.insert(claims2, statement)
break
end
end
else
table.insert(claims2, statement)
end
end
end
return claims2
end
function avoidqualifier(claims, options)
-- options.avoidqualifier
-- options.avoidqualifiervalue
if isntvalid(options.avoidqualifier) then
return claims
end
local av = options.avoidqualifier:upper()
local avoidqualifiervalue_values =
type(options.avoidqualifiervalue) == "string" and mw.text.split(options.avoidqualifiervalue, ",") or
options.avoidqualifiervalue
local claims2 = {}
for _, statement in pairs(claims) do
if not statement.qualifiers or not statement.qualifiers[av] then
table.insert(claims2, statement)
elseif isvalid(options.avoidqualifiervalue) then
local active = true
for _, quall in pairs(statement.qualifiers[av]) do
if
quall.snaktype == "value" and quall.datavalue and quall.datavalue.value and
quall.datavalue.value["id"] and
table_contains(avoidqualifiervalue_values, quall.datavalue.value["id"])
then
active = false
break
end
end
if active then
table.insert(claims2, statement)
end
end
end
return claims2
end
function claims_limit(claims, limit)
local newclaims = {}
if type(limit) ~= "number" then
limit = tonumber(limit)
end
if limit and type(limit) == "number" then
if limit < 1 or #claims < limit then
return claims
end
for i = 1, #claims do
if i <= limit then
newclaims[i] = claims[i]
end
end
return newclaims
end
return claims
end
function claims_offset(claims, offset)
local offsetclaims = {}
if type(offset) ~= "number" then
offset = tonumber(offset)
end
if offset and type(offset) == "number" then
for i = offset + 1, #claims do
offsetclaims[#offsetclaims + 1] = claims[i]
end
return offsetclaims
end
return claims
end
function sortbyarb(claims, sorting_properties, options)
local sortingmethod = options.sortbyarbitrary or options.sortingmethod
--mw.log("sortbyarb: " .. sortingmethod)
table.sort(
claims,
function(a, b)
local timeA = getDateArb(a, sorting_properties)
local timeB = getDateArb(b, sorting_properties)
if sortingmethod == "inverted" or sorting_methods[sortingmethod] == "inverted" then
return comparedates(timeB, timeA)
else
return comparedates(timeA, timeB)
end
end
)
return claims
end
function sort_langs(claims, options)
local claims7 = {}
local arabic_id = {["P407"] = 13955, ["P282"] = 8196} -- Q13955 = "العربية", Q8196 = "أبجدية عربية"
for _, statement in pairs(claims) do
for prop, id in pairs(arabic_id) do
if statement.qualifiers and statement.qualifiers[prop] then
for _, v in pairs(statement.qualifiers[prop]) do
if v.snaktype == "value" and v.datavalue.value["numeric-id"] == id then
table.insert(claims7, statement)
break
end
end
end
end
end
if #claims7 > 0 then
claims = claims7
end
return claims
end
function sortbyqualifier(claims, sorting_properties, options)
if not sorting_properties or #sorting_properties == 0 then
sorting_properties = get_sorting_properties(options)
end
local sort_by = sorting_methods[options.sortbytime] or options.sortbytime
table.sort(
claims,
function(a, b)
local timeA = getqualifierbysortingproperty(a, sorting_properties)
local timeB = getqualifierbysortingproperty(b, sorting_properties)
if sort_by == "inverted" then
return comparedates(timeB, timeA)
else
return comparedates(timeA, timeB)
end
end
)
return claims
end
function sortbyqualifiernumber(claims, sorting_properties, options)
if not sorting_properties or #sorting_properties == 0 then
sorting_properties = get_sorting_properties(options)
end
local sort_by = sorting_methods[options.sortbynumber] or options.sortbynumber
table.sort(
claims,
function(a, b)
local timeA = getqualifierbysortingproperty(a, sorting_properties)
local timeB = getqualifierbysortingproperty(b, sorting_properties)
if sort_by == "inverted" then
return comparedates(timeB, timeA)
else
return comparedates(timeA, timeB)
end
end
)
return claims
end
function sort_claims(claims, options)
local sortingmethod = options.sortbyarbitrary or options.sortingmethod
local sorting_properties = get_sorting_properties(options)
if isvalid(options.sortbytime) and sorting_methods[options.sortbytime] then
if #sorting_properties == 0 then
sorting_properties = sortingproperties
end
claims = sortbyqualifier(claims, sorting_properties, options)
elseif isvalid(options.sortbynumber) and sorting_methods[options.sortbynumber] then
claims = sortbyqualifiernumber(claims, sorting_properties, options)
elseif isvalid(sortingmethod) and sorting_methods[sortingmethod] then
claims = sortbyarb(claims, sorting_properties, options)
end
return claims
end
function filter_claims(claims, options)
local claims = claims
if isntvalid(options.langpref) then
claims = sort_langs(claims, options)
end
claims = sort_claims(claims, options)
local offset = options.offset
if isvalid(offset) then
claims = claims_offset(claims, offset)
end
local limit = options.limit
if isvalid(limit) then
claims = claims_limit(claims, limit)
end
if isvalid(options.avoidqualifier) then -- to avoid value with a given qualifier
claims = avoidqualifier(claims, options)
end
if isvalid(options.preferqualifier) then
claims = preferqualifier(claims, options)
end
-- options.avoidvalue
if isvalid(options.avoidvalue) then
claims = avoidvalue(claims, options)
end
-- options.prefervalue
if isvalid(options.prefervalue) then
claims = prefervalue(claims, options)
end
-- options.getonly
if isvalid(options.getonly) then
claims = getonly(claims, options)
end
-- options.dontget
if isvalid(options.dontget) then
claims = dontget(claims, options)
end
local firstvalue = options.enbarten or options.firstvalue
local first = isvalid(tonumber(firstvalue))
if isvalid(first) and #claims > 1 then
if #claims > 0 then
first = tonumber(first) or 1
if first > 0 and first <= #claims then
claims = {claims[first]}
else
claims = {claims[1]}
end
end
elseif isvalid(firstvalue) and #claims > 0 then
claims = {claims[1]}
end
local numval = options.numval
if numval and type(numval) ~= "number" then
numval = tonumber(numval)
end
if numval and type(numval) == "number" and #claims > 1 and #claims > numval then
local claimsnumval = {}
local ic = 1
while (numval >= ic) and (#claims >= ic) do
table.insert(claimsnumval, claims[ic])
ic = ic + 1
end
claims = claimsnumval
end
return claims
end
function getEntityFromId(id)
return isvalid(id) and mw.wikibase.getEntityObject(id) or mw.wikibase.getEntityObject()
end
function formatError(key)
return i18n.errors[key]
end
function formatOneStatement(statement, ref, options)
local value = nil
local stat = formatStatement(statement, options)
if not stat then
return {v = value, raw = stat}
end
local s = stat.value
if isntvalid(s) then
return {v = value, raw = stat}
end
if not stat.qualifiers then
stat.qualifiers = {}
end
local P585 = stat.P585 or ""
local tf = stat.tifr
local awardqual = stat.foto
local ro = stat.ro
local qp1a = stat.qp1a
local onlyqualifier = stat.onlyqualifier
local qp1 = stat.qp1
local qp2 = stat.qp2
local qp3 = stat.qp3
local qp4 = stat.qp4
local qp5 = stat.qp5
local reff = stat.reff
if reff and isvalid(options.reff) then
s = s .. reff
end
if isvalid(options.template) then
s =
mw.getCurrentFrame():expandTemplate {
title = options.template,
args = {
stat.QQ1,
s,
stat.QQ2,
stat.QQ3,
stat.QQ4,
stat.QQ5,
stat.QQ6,
stat.QQ7,
stat.QQ8,
stat.QQ9,
stat.QQ10,
entityId = options.entityId,
v1 = options.v1,
id = stat.ID
}
}
end
if isvalid(options.football) then
s =
mw.getCurrentFrame():expandTemplate {
title = "صندوق معلومات سيرة كرة قدم/سطر فريق",
args = {
stat.qualifiers.P580 or "",
stat.qualifiers.P582 or "",
s,
stat.amatch,
stat.goal
}
}
end
if isvalid(options.office) then
s =
mw.getCurrentFrame():expandTemplate {
title = "معلومات صاحب منصب/منصب ويكي بيانات/نواة",
args = {
office = s,
termstart = stat.qualifiers.P580 or "",
termend = stat.qualifiers.P582 or "",
constituency = stat.qualifiers.P768 or "",
predecessor = stat.qualifiers.P1365 or "",
successor = stat.qualifiers.P1366 or "",
series = stat.qualifiers.P1545 or "",
of = stat.qualifiers.P642 or "",
electedin = stat.qualifiers.P2715 or "",
jurisdiction = stat.qualifiers.P1001 or "",
employer = stat.qualifiers.P108 or "",
entityId = options.entityId
}
}
end
local function qoo(Prefix, qualpref, p, Suffix)
if isvalid(p) then
local stri = (Prefix or " (") .. (qualpref or "") .. p .. (Suffix or ")")
if isvalid(options.nosmall) then
return stri
else
return mw.text.tag("small", {}, stri)
end
end
end
local QPrefix = isvalid(options.qualifierprefix)
local QSuffix = isvalid(options.qualifiersuffix)
if isvalid(qp1) and isvalid(options.qual1) and isvalid(qp1a) and isvalid(options.qual1a) then
s = s ..
qoo(QPrefix, options.qual1pref, qp1, QSuffix) .. qoo(QPrefix, options.qp1apref, qp1a, QSuffix)
elseif isvalid(qp1) and isvalid(options.qual1) then
s = s .. qoo(QPrefix, options.qual1pref, qp1, QSuffix)
elseif isvalid(qp1a) and isvalid(options.qual1a) then
s = s .. qoo(QPrefix, options.qp1apref, qp1a, QSuffix)
end
if isvalid(qp2) and isvalid(options.qual2) then
s = s .. qoo(QPrefix, options.qual2pref, qp2, QSuffix)
end
if isvalid(qp3) and isvalid(options.qual3) then
s = s .. qoo(QPrefix, options.qual3pref, qp3, QSuffix)
end
if isvalid(qp4) and isvalid(options.qual4) then
s = s .. qoo(QPrefix, options.qual4pref, qp4, QSuffix)
end
if isvalid(qp5) and isvalid(options.qual5) then
s = s .. qoo(QPrefix, options.qual5pref, qp5, QSuffix)
end
if isvalid(options.justthisqual) then
if onlyqualifier then
s = onlyqualifier
else
s = nil -- We need only the qualifier
end
end
if isvalid(ro) and isvalid(options.withro) then
s = s .. qoo(QPrefix, "", ro, QSuffix)
end
if isvalid(P585) and isvalid(options.withdate) then
if options.withdate == "y" then
s = s .. qoo(QPrefix, "سنة ", P585, QSuffix)
elseif options.withdate == "before" then
s = "*" .. P585 .. ":" .. s .. "\n"
else
s = s .. qoo(QPrefix, "", P585, QSuffix)
end
end
if awardqual and isvalid(options.awardqua) then
s = s .. qoo(QPrefix, "", awardqual, QSuffix)
end
local bothdates = options.withintervall or options.bothdates
if tf and isvalid(bothdates) then
if bothdates == "line" then
s = s .. mw.text.tag("br") .. qoo(QPrefix, "", tf, QSuffix)
elseif bothdates == "before" then
s = qoo(QPrefix, "", tf, QSuffix) .. s
else
s = s .. qoo(QPrefix, "", tf, QSuffix)
end
end
if type(ref) == "table" or (isvalid(options.noref)) or (isvalid(options.justthisqual)) then
value = s
else
local t = formatReferences(statement, options)
stat.ref = t
if isvalid(options.justref) then
value = t
elseif isvalid(options.onlyvaluewithref) then
if isvalid(t) then
value = s .. t
end
else
value = s .. t
end
end
return {v = value, raw = stat}
end
function formatStatements(options, LuaClaims)
local valuetable = {} -- formattedStatements
local claims = {}
if isntvalid(options.property) and isvalid(options.pid) then
options.property = options.pid
end
if isntvalid(options.property) then
return formatError("property-param-not-provided")
end
local option1 = options.option1
if option1 and options.option1value then
options[option1] = options.option1value
options['"' .. option1 .. '"'] = options.option1value
--mw.log( "option1: " .. option1 .. "value: " .. options.option1value )
end
if type(LuaClaims) == "table" then
claims = LuaClaims[options.property] or {}
mw.log("module:wikidata2: claims = LuaClaims[options.property]")
else
--Get entity
local entity = nil
if options.entity and type(options.entity) == "table" then
entity = options.entity
else
local id = get_entityId(options)
if isvalid(id) then
local check = mw.ustring.match(id, "Q%d+") or mw.ustring.match(id, "P%d+")
if check == nil then
mw.addWarning(id .. " لا يمثل معرف ويكي بيانات صحيح")
return ""
else
options.entityId = id
options.qid = id
end
end
entity = getEntityFromId(id)
end
--local property = mw.wikibase.resolvePropertyId( options.property:upper() )
local property = options.property:upper()
if not entity then
return ""
end --TODO error?
if not entity.claims or not entity.claims[property] then
if isvalid(options.otherproperty) then
options.property = options.otherproperty
property = options.otherproperty:upper()
end
end
if property == nil then
return ""
end
if not entity.claims or not entity.claims[property] then
return "" --TODO error?
end
--Format statement and concat them cleanly
if options.rank == "best" or isntvalid(options.rank) then
--claims = entity:getAllStatements( property )
claims = entity:getBestStatements(property)
elseif options.rank == "valid" then
for i, statement in pairs(entity.claims[property]) do
if statement.rank == "preferred" or statement.rank == "normal" then
table.insert(claims, statement)
end
end
elseif options.rank == "all" then
for i, statement in pairs(entity.claims[property]) do
table.insert(claims, statement)
end
else
for i, statement in pairs(entity.claims[property]) do
if statement.rank == options.rank then
table.insert(claims, statement)
end
end
end
end
claims = filter_claims(claims, options)
local statementsraw = {}
local All_claims = claims
if claims then
if options["property-module"] or options["property-function"] then
if not options["property-module"] or not options["property-function"] then
return formatError("unknown-property-module")
end
local formatter = require("Module:" .. options["property-module"])
if not formatter then
return formatError("property-module-not-found")
end
local fun = formatter[options["property-function"]]
if not fun then
return formatError("property-function-not-found")
end
mw.log("work with property-module: " .. options["property-module"] .. "|" .. options["property-function"])
return fun(claims, options)
else
for i, statement in pairs(claims) do
options.num = i
local va = formatOneStatement(statement, LuaClaims, options)
if va.v then
table.insert(valuetable, va.v)
end
table.insert(statementsraw, va.raw)
end
end
end
if isvalid(options.raw) then
if isvalid(options.rawtolua) then
return mw.getCurrentFrame():extensionTag("source", mw.dumpObject(statementsraw), {lang = "lua"})
end
return statementsraw
end
local priff = ""
local Separator = options.separator -- or ""
local Conjunction = options.conjunction -- or ""
if Separator == "br" or Conjunction == "br" then
Separator = mw.text.tag("br")
end
if Separator == "*" then
priff = "\n*"
Separator = "\n*"
end
if Separator == "#" then
priff = "\n#"
Separator = "\n#"
end
if isvalid(options.justref) then
priff = ""
Separator = ""
end
local tot = mw.text.listToText(valuetable, Separator, Separator)
if #valuetable > 1 then
tot = priff .. tot
end
if isntvalid(tot) then
tot = nil
end
if isvalid(options.returnnumberofvalues) or options.returnnumberofvalues == true then
return tot, #valuetable
end
if isvalid(options.numberofclaims) then
return #All_claims
end
return tot
end
function p.formatAndCat(args)
if args == nil then
return nil
end
Frame_args = args
args.linkback = args.linkback or true
args.addcat = true
if isvalid(args.value) and args.value == "-" then
return nil
end
if isvalid(args.value) then
local val = args.value .. addTrackingCategory(args)
val = p.addLinkBack(val, args.entity, args.property)
return val
end
return p.formatStatementsFromLua(args)
end
function formatReferences(statement, options)
local ic = 1
local reference = {}
local numberofref = tonumber(options.numberofreferences) or 7
local qid = get_entityId(options)
local statementreferences = statement.references
if statementreferences then
if Modulecite == nil then
Modulecite = require(citetitle)
end
for i, ref in ipairs(statementreferences) do
if ref.snaks and numberofref >= ic then
local s = Modulecite._cite_wikidata(ref, qid)
if isvalid(s) then
ic = ic + 1
table.insert(reference, s)
end
end
end
end
local final = table.concat(reference)
if isvalid(final) then
final = final .. i18n.cateref
end
return final or ""
end
function formatqualifiers(statement, s, options)
s.qualifiers = {}
local function qua(p, firstvalue, modifytime)
local vvv
if isvalid(p) then
vvv =
formatStatements(
{
property = p,
enlabelcate = "t",
firstvalue = (firstvalue or ""),
modifytime = (modifytime or "longdate"),
noref = "t"
},
statement.qualifiers
) or ""
s.qualifiers[p] = vvv
return vvv
end
end
if isvalid(options.template) then
s.ID = statement.mainsnak.datavalue.value.id
s.QQ1 = qua(options.Q1)
s.QQ2 = qua(options.Q2)
s.QQ3 = qua(options.Q3)
s.QQ4 = qua(options.Q4)
s.QQ5 = qua(options.Q5)
s.QQ6 = qua(options.Q6)
s.QQ7 = qua(options.Q7)
s.QQ8 = qua(options.Q8)
s.QQ9 = qua(options.Q10)
s.QQ10 = qua(options.Q10)
end
if isvalid(options.football) then
if statement.qualifiers.P1350 or statement.qualifiers.P1351 then
s.amatch = qua("P1350", "true")
s.goal = qua("P1351", "true")
end
end
if (isvalid(options.football)) or (isvalid(options.office)) then
s.start1 = qua("P580", "true")
s.finish1 = qua("P582", "true")
end
if isvalid(options.office) then
if
statement.qualifiers.P580 or statement.qualifiers.P582 or statement.qualifiers.P1365 or
statement.qualifiers.P1366
then
s.before1 = qua("P1365", "true")
s.after1 = qua("P1366", "true")
s.constituency1 = qua("P768")
s.series1 = qua("P1545")
s.electedin1 = qua("P2715", "")
s.pp1001 = qua("P1001")
s.pp108 = qua("P108")
s.pp642 = qua("P642")
end
end
if isvalid(options.withdate) then
--if statement.qualifiers.P585 then
s.P585 = qua("P585", "true", options.modifyqualifiertime)
end
local qwe = options.qwer
if statement.qualifiers.qwe then
s.ro = qua(qwe, "true")
end
local bothdates_option = options.withintervall or options.bothdates
if isvalid(bothdates_option) then
if statement.qualifiers.P580 or statement.qualifiers.P582 then
local f = qua("P580", "true", options.modifyqualifiertime)
local t = qua("P582", "true", options.modifyqualifiertime)
s.tifr = f .. "–" .. t
end
end
if isvalid(options.awardqua) then
if statement.qualifiers.P585 or statement.qualifiers.P1346 then
local fo = qua("P585", "true", options.modifyqualifiertime)
local to = qua("P1346", "true")
s.foto = fo .. " " .. mw.text.tag("span", {}, " " .. to .. "")
end
end
local function quaaal(opti, options)
if isvalid(opti) and statement.qualifiers[opti] then
local kkk =
formatStatements(
{
property = opti,
noref = "t",
separator = options.qualifierseparator,
conjunction = options.qualifierconjunction,
size = options.size,
image = options.image,
modifytime = options.modifyqualifiertime,
enlabelcate = "t",
langpref = options.langpref,
showlang = options.showlang
},
statement.qualifiers
) or ""
s.qualifiers[opti] = kkk
return kkk
end
end
if isvalid(options.justthisqual) and statement.qualifiers[options.justthisqual] then
s.onlyqualifier = quaaal(options.justthisqual, options)
end
if isvalid(options.qual1) and statement.qualifiers[options.qual1] then
s.qp1 = quaaal(options.qual1, options)
end
if isvalid(options.qual1a) and statement.qualifiers[options.qual1a] then
s.qp1a = quaaal(options.qual1a, options)
end
if isvalid(options.qual2) and statement.qualifiers[options.qual2] then
s.qp2 = quaaal(options.qual2, options)
end
if isvalid(options.qual3) and statement.qualifiers[options.qual3] then
s.qp3 = quaaal(options.qual3, options)
end
if isvalid(options.qual4) and statement.qualifiers[options.qual4] then
s.qp4 = quaaal(options.qual4, options)
end
if isvalid(options.qual5) and statement.qualifiers[options.qual5] then
s.qp5 = quaaal(options.qual5, options)
end
end
function formatSnak(snak, options)
if snak.snaktype == "somevalue" then
local somevalue = options.somevalue or i18n["somevalue"]
return {value = somevalue}
elseif snak.snaktype == "novalue" then
local novalue = options.novalue or i18n["novalue"]
return {value = novalue}
elseif snak.snaktype == "value" then
local s = formatDatavalue(snak.datavalue, snak.datatype, options)
if s and s.value and isvalid(s.value) then
s.value = (options.prefix or "") .. s.value .. (options.suffix or "")
end
return s
else
return {value = formatError("unknown-snak-type")}
end
end
function formatStatement(statement, options)
if options["claim-module"] or options["claim-function"] then
if not options["claim-module"] or not options["claim-function"] then
return {value = formatError("unknown-claim-module")}
end
local formatter = require("Module:" .. options["claim-module"])
if formatter == nil then
return {value = formatError("claim-module-not-found")}
end
local fun = formatter[options["claim-function"]]
if fun == nil then
return {value = formatError("claim-function-not-found")}
end
return {value = fun(statement, options)}
elseif statement.type == "statement" then
local s = formatSnak(statement.mainsnak, options)
if isvalid(s) then
s.qualifiers = {}
if statement.qualifiers then
local qualu = formatqualifiers(statement, s, options)
--if isvalid(qualu) then table.insert(qualu) end
end
if statement.references then
if isvalid(options.reff) then
s.reff = formatReferences(statement, options)
end
end
end
return s
elseif not statement.type then
return formatSnak(statement, options)
end
return {value = formatError("unknown-claim-type")}
end
function get_property1(options, item)
--[[ function to get countries flags without reload large countries items ]]
local flagprop = {"p27", "p1532", "p17", "p495", "p1376"}
local work_flag = false
if string.lower(options.property1) == "p41" then
for k, l in pairs(flagprop) do
if string.lower(options.property) == l then
work_flag = true
end
end
end
local caca = ""
local size = options.size or ""
if isntvalid(size) then
size = "20"
end
if work_flag then
if Moduleflags == nil then
Moduleflags = require("Module:Wikidata2/Flags")
end
local flag = Moduleflags[item]
if isntvalid(flag) then
flag =
formatStatements(
{
property = options.property1,
otherproperty = options.otherproperty1,
entityId = item,
rank = options.property1rank,
pattern = options.property1pattern,
formatting = options.property1formatting,
noref = "t",
firstvalue = "t"
}
)
--mw.log("get flag2 :" .. flag .. ", for item ".. item )
end
if isvalid(flag) then -- return real image
if isvalid(options.image) then -- return real image
caca = "[[file:" .. flag .. "|" .. size .. "px|" .. "border" .. "]]"
--caca = Infobox_Image( {image=flag, size=size, maxsize = "280x330px", center=options.center} )
--mw.log("get flag :" .. flag .. ", for item ".. item )
end
end
end
if isntvalid(caca) then
caca =
formatStatements(
{
property = options.property1,
otherproperty = options.otherproperty1,
entityId = item,
rank = options.property1rank,
pattern = options.property1pattern,
formatting = options.property1formatting,
size = options.size,
image = options.image,
noref = "t",
firstvalue = "t"
}
)
end
return caca
end
function formatwikibaseitem(datavalue, datatype, options)
--[[ datatype wikibase-item ]]
local value
local itemqid = datavalue.value.id
local Skipped = skiip_items[options.property] or {}
for k, v in pairs(Skipped) do
if datavalue.value.id == v then
return {value = "", item = ""}
end
end
if isvalid(options.formatting) then
if options.formatting == "raw" then
return {value = itemqid, item = itemqid}
elseif options.formatting == "rawtotemplate" and isvalid(options.rawtotemplate) then
local args = {q = itemqid, no1 = options.no1 or "", no2 = options.no2 or ""}
value = mw.getCurrentFrame():expandTemplate {title = options.rawtotemplate, args = args} .. "\n"
return {value = value, item = itemqid}
elseif options.formatting == "fu" then
value =
mw.getCurrentFrame():expandTemplate {
title = "Cycling race/stageclassification2",
args = {itemqid, type = "1"}
}
return {value = value, item = itemqid}
elseif options.formatting == "sitelink" then
value = formatsitelink(datavalue.value.id, options)
return {value = value, item = itemqid}
else
value = formatcharacters(datavalue.value, options)
if isvalid(options.pattern) then
value = formatFromPattern(value, options)
end
return {value = value, item = itemqid}
end
end
local itemValue = formatEntityId(itemqid, options).value
if isvalid(itemValue) then
if isvalid(options.property1) and options.property1:upper():sub(1, 1) == "P" then
local prop1value = get_property1(options, itemqid)
if isvalid(prop1value) then
prop1value = (options.property1pref or "") .. "" .. prop1value .. "" .. (options.property1suff or "")
value = prop1value .. " " .. itemValue
if isvalid(options.property1after) then
value = itemValue .. prop1value
end
else
value = itemValue
end
return {value = value, item = itemqid}
elseif isvalid(options.propertyimage) then
local p_f = options.propertyimageformatting or options.formattingpropertyimage
local vas =
formatStatements(
{
property = options.propertyimage,
formatting = p_f,
entityId = itemqid,
rank = options.rank,
pattern = options.pattern,
size = options.size,
image = options.image,
noref = "t",
avoidvalue = options.avoidvaluepropertyimage,
firstvalue = "t",
nolink = options.nolink
}
)
if isvalid(vas) then
return {value = vas}
end
elseif isvalid(options.property2) then
local caca =
formatStatements(
{
property = options.property2,
entityId = itemqid,
noref = options.noref,
rank = options.rank,
pattern = options.property2pattern,
size = options.size,
image = options.image,
propertyimage = options.property3,
firstvalue = "t"
}
)
if isvalid(caca) then
return {value = caca .. " " .. itemValue}
end
end
end
return {value = itemValue, item = itemqid}
end
function formatwikibaseproperty(datavalue, datatype, options)
--[[ datatype wikibase-property ]]
local tid = ""
if isvalid(options.formatting) then
if options.formatting == "raw" then
tid = datavalue.value.id
end
else
tid = formatEntityId(datavalue.value.id, options).value
end
return {value = tid}
end
function formattabulardata(datavalue, datatype, options)
--[[ tabular-data ]]
local data = "[[commons:" .. datavalue.value .. "|" .. datavalue.value .. "]]"
return {value = data}
end
function formatgeoshape(datavalue, datatype, options)
--[[ geo-shape ]]
local shape = "[[commons:" .. datavalue.value .. "|" .. datavalue.value .. "]]"
return {value = shape}
end
function formatcommonsMedia(datavalue, datatype, options)
local tid
--[[ commonsMedia ]]
local size = options.size or ""
if isvalid(options.image) then -- return real image
--tid = "[[file:" .. datavalue.value .. "|".. (options.size or "20").."px|border]]"
--if isvalid(options.center) then
--tid = "[[file:" .. datavalue.value .. "|".. (options.size or "20").."px|border|center]]"
--end
--tid = "[[file:" .. datavalue.value .. "|".. (options.size or "60").."px|".."border".."]]"
local params = {image = datavalue.value, maxsize = "280x330px", center = (options.center or "")}
if isvalid(options.size) then
params.size = size
end
if InfoboxImage == nil then
InfoboxImage = require("Module:InfoboxImage")
end
tid = InfoboxImage.Infobox_Image(params)
else
tid = formatcharacters(datavalue.value, options)
end
return {value = tid}
end
function formatmath(datavalue, datatype, options)
--[[datatype math ]]
--return {value=mw.text.tag("math", {}, "".. datavalue.value.."") } -- that doesn't work well
local result = mw.getCurrentFrame():callParserFunction("#tag:math", datavalue.value)
return {value = result}
end
function formatstring(datavalue, datatype, options)
--[[ datatype string ]]
local par = options.pattern
local result = formatcharacters(datavalue.value, options)
local tid = result
if isvalid(options.stringpattern) then
tid = mw.ustring.gsub(options.stringpattern, "$1", datavalue.value)
elseif isvalid(par) then
if par ~= "autourl" and par ~= "autourl2" and par ~= "autourl3" and par ~= "autourl4" then
tid = formatFromPattern(result, options)
end
end
return {value = tid}
end
function formatexternalid(datavalue, datatype, options)
local result = formatcharacters(datavalue.value, options)
if isntvalid(options.pattern) then
return {value = result} --just return value
end
local patter =
formatStatements({property = "P1630", entityId = options.property, firstvalue = "t", noref = "t", rank = "all"}) -- get formatter URL
local par = options.pattern
local tid = result
if isvalid(patter) then -- if P1630 are there
local pp = formatFromPattern(datavalue.value, {pattern = patter})
local plabel = mw.wikibase.label(options.property) or pp
local ppp = mw.ustring.gsub(pp, " ", "_")
local results = {
["autourl"] = ppp, -- like http://example.com/$1.html
["autourl2"] = "[" .. ppp .. " " .. datavalue.value .. "]", -- like [http://example.com/$1.html $1]
["autourl3"] = "[" .. ppp .. " " .. ppp .. "]", -- like [http://example.com/$1.html http://example.com/$1.html]
["autourl4"] = "[" .. ppp .. " " .. plabel .. "]"
}
if results[par] then
tid = results[par]
else
tid = formatFromPattern(result, options)
end
elseif isvalid(par) then
if par ~= "autourl" and par ~= "autourl2" and par ~= "autourl3" and par ~= "autourl4" then
tid = formatFromPattern(result, options)
end
end
return {value = tid}
end
function formattime(datavalue, datatype, options)
--[[ datatype time ]]
local ModuleTime = require "Module:wikidata2/time"
local timen = datavalue.value
local tid = ModuleTime.getdate(timen, options)
-- local tid = mw.getCurrentFrame():preprocess(mall)
if isvalid(options.modifytime) then
if options.modifytime == "q" then
local mall = datavalue.value.time
tid = mw.getCurrentFrame():preprocess(mall)
elseif options.modifytime == "precision" then
local mall = datavalue.value.precision
tid = mw.getCurrentFrame():preprocess(mall)
end
end
return {value = tid}
end
function formatcoordinate(datavalue, datatype, options)
--[[ datatype globe-coordinate ]]
--local GlobeCoordinate = require "Module:GlobeCoordinate"
--return {value=GlobeCoordinate.newFromWikidataValue( datavalue.value ):toHtml()}
if ModuleGlobes == nil then
ModuleGlobes = require("Module:Wikidata2/Globes")
end
local coord = datavalue.value
local globe = datavalue.value.globe
local globe2 = ModuleGlobes[globe] or ""
local results = {
["latitude"] = coord.latitude,
["longitude"] = coord.longitude,
["dimension"] = coord.dimension,
["precision"] = coord.precision,
["globe"] = globe:match("Q%d+"),
["globe2"] = globe2
}
local pro = options.formatting and results[options.formatting]
if pro == nil then
pro =
mw.getCurrentFrame():preprocess(
"{{ {{{|safesubst:}}}#invoke:Coordinates|coord" ..
"|" .. coord.latitude ..
"|" .. coord.longitude ..
"|display=inline" ..
"|globe:" .. globe2 .. "_type:landmark" ..
"|format=" .. (options.formatcoord or "") .. "}}"
) .. catewikidatainfo(options)
end
return {value = pro}
end
function formatquantity(datavalue, datatype, options)
--[[ datatype quantity ]]
local amount, unit = datavalue.value.amount, datavalue.value.unit
amount = mw.ustring.gsub(amount, "+", "")
if unit then
unit = unit:match("Q%d+")
end
if formatera == nil then
formatera = require("Module:Wikidata2/Math")
end
local number = formatera.newFromWikidataValue(datavalue.value)
local unitraw = unit
if unit then
-- يتحقق اذا كان هناك اي اختصار لوحدة القياس
--if lab and ( isntvalid(options.nounitshort) ) then
if isvalid(options.unitshort) then
local lab =
options.label or formatStatements({property = "P498", entityId = unit, firstvalue = "t", noref = "t"}) or
formatStatements(
{property = "P5061", entityId = unit, firstvalue = "t", langpref = options.langpref, noref = "t"}
) or
""
local s =
formatEntityId(unit, {label = lab, enlabelcate = "t", nolink = (options.nounitlink or options.nolink)})
unit = s.value
else
local s = formatEntityId(unit, {nolink = options.nounitlink, enlabelcate = "t"})
unit = s.value
end
end
if options.formatcharacters and options.formatcharacters == "formatnum" then
amount = make_format_num(amount)
end
local Value = amount .. " " .. (unit or "")
if isvalid(options.nounit) then
Value = amount
end
return {value = Value, amount = amount, unit = unit, unitraw = unitraw}
end
function formaturl(datavalue, datatype, options)
--[[ datatype url ]]
local label = options.label
if isvalid(options.urllabel) then
label = options.urllabel
end
local va = mw.ustring.gsub(datavalue.value, " ", "_")
if label == nil and options.property == "P856" then
label = "الموقع الرسمي"
end
if isvalid(options.displayformat) == "weblink" then
if weblink == nil then
weblink = require("Module:Weblink")
end
return {value = weblink.makelink(va)}
end
if isvalid(options.formatting) == "raw" then
return {value = va}
end
local pro = va
if isvalid(label) then
pro = "[" .. va .. " " .. label .. "]"
end
return {value = pro}
end
function formatmonolingualtext(datavalue, datatype, options) -- showlang
local text = datavalue.value.text
if isvalid(options.textformat) == "text" then
return {value = text}
end
if Moduletext == nil then
Moduletext = require "Module:wikidata2/monolingualtext"
end
local tid = Moduletext._main(datavalue, datatype, options)
return {value = tid}
end
function formatDatavalue(datavalue, datatype, options)
--Use the customize handler if provided
if options["value-module"] or options["value-function"] then
if not options["value-module"] or not options["value-function"] then
return {value = formatError("unknown-value-module")}
end
local formatter = require("Module:" .. options["value-module"])
if not formatter then
return {value = formatError("value-module-not-found")}
end
local fun = formatter[options["value-function"]]
if not fun then
return {value = formatError("value-function-not-found")}
end
return {value = fun(datavalue, datatype, options)}
end
--Default dataformatters
local dataformatters = {
["wikibase-item"] = formatwikibaseitem,
["wikibase-property"] = formatwikibaseproperty,
["commonsMedia"] = formatcommonsMedia,
["math"] = formatmath,
["time"] = formattime,
["external-id"] = formatexternalid,
["string"] = formatstring,
["globe-coordinate"] = formatcoordinate,
["quantity"] = formatquantity,
["url"] = formaturl,
["monolingualtext"] = formatmonolingualtext,
["geo-shape"] = formatgeoshape,
["tabular-data"] = formattabulardata
}
local dataformatter = dataformatters[datatype]
if not dataformatter then
return {value = formatError("unknown-data-type")}
end
return dataformatter(datavalue, datatype, options)
end
function Labelfunction(qid, arlabel, options) -- label with no arwiki sitelink
local value
local cat = ""
local use_en_label = isvalid(options.enlabelcate) or isvalid(options.use_en_labels)
local Args = {fromlua = "t", ["المعرف"] = qid, nocat = "t"}
if isvalid(options.illwd2noy) then
Args.noy = "t"
end
if isvalid(options.illwd2y) then
Args.y = "t"
end
if isvalid(arlabel) then
value = arlabel
if isvalid(options.illwd2) then
Args.label = arlabel
value = mw.getCurrentFrame():expandTemplate {title = "Ill-WD2", args = Args}
end
elseif isntvalid(options.justarabic) then
-- else
--cat = " [[".. i18n.noarabiclabel .."|".. qid .."]]"
local en_label = mw.wikibase.label(qid) or ""
if isvalid(options.illwd2noarlabel) then
if isvalid(en_label) then
Args.enlabel = en_label
end
value = mw.getCurrentFrame():expandTemplate {title = "Ill-WD2", args = Args}
elseif use_en_label and isvalid(en_label) then
value = en_label
end
end
return {value = value or "", cat = cat}
end
function formatEntityId(qid, options)
local labeloption = options.label
local label = ""
local value
local arlabel = labelIn("ar", qid) or "" -- The arabic label
local link = mw.wikibase.sitelink(qid)
if isvalid(labeloption) then
label = labeloption
elseif isvalid(arlabel) then
--mw.log("arlabel" .. arlabel)
label = arlabel
elseif isvalid(link) then
label = link
arlabel = link
end
if isvalid(link) then
-- elseif isvalid(arlabel) then
local linklabel = isvalid(label) or link
if (isntvalid(options.nolink)) then
value = "[[:" .. link .. "|" .. formatcharacters(linklabel, options) .. "]]"
label = linklabel
else
value = formatcharacters(linklabel, options)
label = linklabel
end
else
local va = Labelfunction(qid, arlabel, options)
label = va.value
value = va.value -- .. va.cat
end
return {value = value or "", label = label or ""}
end
function sitelink_g(id, wikisite)
--[[ function to get any link from any sister project ]]
local site = wikisite or "arwiki"
local link = mw.wikibase.sitelink(id, site) or ""
--mw.log("mw.wikibase.sitelink,site: " .. site.. ",link:" .. link )
return link
end
function sitelink(id, wikisite)
local site = wikisite or "arwiki"
local link = ""
--local link = mw.wikibase.getSitelink( id, site ) or ""
local entity = mw.wikibase.getEntityObject(id)
if
entity and entity.sitelinks and entity.sitelinks["" .. site .. ""] and entity.sitelinks["" .. site .. ""].site and
entity.sitelinks["" .. site .. ""].title
then
if entity.sitelinks["" .. site .. ""].site == site then
link = entity.sitelinks["" .. site .. ""].title
end
end
return link
end
function formatsitelink(entityId, options)
--[[ function to get only the value with link ]]
local link = sitelink(entityId)
if isvalid(link) and isntvalid(options.nolink) then
return "[[" .. link .. "]]" .. catewikidatainfo(options)
end
return link
end
function formatFromPattern(str, options)
-- [[ function to replace $1 with string ]]
if isvalid(options.pattern) then
str = string.gsub(str, "%%", "%%%%")
str = mw.ustring.gsub(options.pattern, "$1", str)
end
return str
end
function p.getEntity(id)
if type(id) == "table" then
return id
end
return getEntityFromId(id)
end
function p.translate(str, rep1, rep2)
str = i18n[str] or str
if rep1 and (type(rep1) == "string") then
str = str:gsub("$1", rep1)
end
if rep2 and (type(rep2) == "string") then
str = str:gsub("$2", rep2)
end
return str
end
function p.getId(snak)
if (snak.snaktype == "value") then
if snak.datavalue.type == "wikibase-entityid" then
return "Q" .. snak.datavalue.value["numeric-id"]
end
end
end
function p.addLinkBack(str, id, property)
if not id then
id = p.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|class=noviewer|link=%s]]"
local title = i18n["see-wikidata-value"]
local url = mw.uri.fullUrl("d:" .. id, "uselang=ar")
url.fragment = property
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
-- Function to check whether a certain item is a parent of a given item.
-- If pExitItem is reached without finding the searched parent item, the search stops.
-- A parent is connected via P31 or P279.
-- Attention: very intensive function, use carefully!
function isParent(property, pItem, pParent, pExitItem, pMaxDepth, pDepth)
if not pDepth then
pDepth = 0
end
local entity = mw.wikibase.getEntity(pItem)
if not entity then
return false
end
local claims31
local claims279
if entity.claims then
if isvalid(property) then
claims31 = entity.claims[property]
else
claims31 = entity.claims["P31"]
claims279 = entity.claims["P279"]
end
else
return false
end
if not claims31 and not claims279 then
return false
end
local parentIds = {}
if claims31 and #claims31 > 0 then
for i, v in ipairs(claims31) do
parentIds[#parentIds + 1] = p.getId(v.mainsnak)
end
end
if claims279 and #claims279 > 0 then
for i, v in ipairs(claims279) do
parentIds[#parentIds + 1] = p.getId(v.mainsnak)
end
end
-- check if searched parent or exit item is reached or do recursive call
if not parentIds[1] or #parentIds == 0 then
return false
end
local itemString = ""
local result = nil
for i, qid in ipairs(parentIds) do
if not qid then
return false
end
--itemString = "Q" .. v
itemString = qid
if itemString == pParent then
-- successful!
return true
elseif itemString == pExitItem then --or itemString == "Q35120"
-- exit if either "exit item" or node item (Q35120) is reached
return false
else
if pDepth + 1 < pMaxDepth then
result = isParent(property, itemString, pParent, pExitItem, pMaxDepth, pDepth + 1)
else
return false
end
if result == true then
return result
end
end
end
do
return false
end
end
function p.Subclass(options)
if options then
Frame_args = options
end
local parent = options.parent or ""
local id = options.id or ""
local Entity = getEntityFromId(id)
if Entity then
id = Entity.id
end
local property = options.property or "P31"
if isntvalid(parent) or isntvalid(id) or isntvalid(property) then
return false
end
local tab = mw.text.split(options.parent, ",")
local result = mw.wikibase.getReferencedEntityId(id, property, tab) -- { "Q5", "Q2095" } )
if result == nil and property == "P31" then
result = mw.wikibase.getReferencedEntityId(id, "P279", tab)
end
if result then
return true
end
end
function old_isSubclass(options)
if isntvalid(options.parent) then
return false
end
local maxDepth
maxDepth = tonumber(options.maxDepth) or 10
if not type(maxDepth) == "number" then
maxDepth = 5
end
local property = options.property
local result
result = isParent(property, options.id, options.parent, options.exitItem, maxDepth)
if options.returnInt then
if result == true then
return 1
else
return nil
end
else
return result
end
end
function p.formatSnak(snak, options)
return formatSnak(snak, options)
end
function p.formatEntityId(entityId, options)
return formatEntityId(entityId, (options or {}))
end
function p.formatStatements(frame, key)
if frame.args then
if type(key) == "table" and key ~= {} then
else
Frame_args = frame.args
end
end
--[[ The main function ]]
local args = frame.args
--If a value if already set, use it
if isvalid(args.value) then
return args.value
end
local wd_arg = frame:getParent().args["ويكي بيانات"] or frame.args["ويكي بيانات"] -- arg used to ban wikidata value
if isvalid(wd_arg) == "لا" then
return ""
end
local valuesnumb = 0
local s
local prop = formatStatements(args, key)
if isvalid(args.returnnumberofvalues) then
s, valuesnumb = formatStatements(frame.args, key)
end
if isvalid(prop) then
if isvalid(args.mainprefix) then -- mainprefix
prop = args.mainprefix .. prop
end
if isvalid(args.mainsuffix) then -- mainsuffix
prop = prop .. args.mainsuffix
end
if isvalid(args.addTrackingCat) then -- add tracking cat
prop = prop .. addTrackingCategory(frame.args)
end
if isvalid(args.mainsuffixAfterIcon) then -- another suffix but after wikidata icon
prop = prop .. args.mainsuffixAfterIcon
end
else
if isvalid(args.NoPropValue) then -- value if no local value and no wikidata value
prop = args.NoPropValue
end
end
if isvalid(args.returnnumberofvalues) then
mw.log("valuesnumb: " .. valuesnumb)
return s, valuesnumb
end
return prop
end
function p.formatStatementsFromLua(options, key) -- main function but to use from lua module
if options then
if type(key) == "table" and key ~= {} then
else
Frame_args = options
end
end
--If a value if already set, use it
if isvalid(options.value) then
return options.value
end
local valuesnumb = 0
local s = formatStatements(options, key)
if isvalid(options.returnnumberofvalues) then
s, valuesnumb = formatStatements(options, key)
end
if isntvalid(s) then
s = nil
end
if isvalid(s) then
if isvalid(options.mainprefix) then -- mainprefix
s = options.mainprefix .. s
end
if isvalid(options.mainsuffix) then -- mainsuffix
s = s .. options.mainsuffix
end
if isvalid(options.addTrackingCat) then -- add tracking cat
s = s .. addTrackingCategory(options)
end
if isvalid(options.mainsuffixAfterIcon) then -- another suffix but after wikidata icon
s = s .. options.mainsuffixAfterIcon
end
else
if isvalid(options.NosValue) then -- value if no local value and no wikidata value
s = options.NosValue
end
end
if isvalid(options.returnnumberofvalues) then
-- mw.log( "valuesnumb: " .. valuesnumb )
return s, valuesnumb
end
return s
end
function p.isSubclass(frame)
return p.Subclass(frame.args)
end
-- Return the site link for a given data item and a given site (the current site by default)
function p.getSiteLink(frame)
local site = frame.args[2] or frame.args.site
local id = frame.args[1] or frame.args.id
local count = frame.args.countsitelinks
if isntvalid(id) then
if isvalid(frame.args.page) then
id = mw.wikibase.getEntityIdForTitle(frame.args.page)
end
end
if isvalid(count) then
return countSiteLinks(id)
end
local link = sitelink(id, site)
if isvalid(link) then
return link
end
end
function p.getSiteLink1(frame)
local project = frame.args[1]
local id = frame.args[2]
local link = sitelink(id, project)
return link
end
-- returns the page id (Q...) of the current page or nothing of the page is not connected to Wikidata
function p.pageId(frame)
return mw.wikibase.getEntityIdForCurrentPage()
end
function p.descriptionIn(frame)
local langcode = frame.args[1] or frame.args["lang"]
local id = frame.args[2] or frame.args["id"]
return descriptionIn(langcode, id)
end
function p.labelIn(frame)
local langcode = frame.args[1] or frame.args["lang"]
local id = frame.args[2] or frame.args["id"]
return labelIn(langcode, id)
end
function p.getLabel(entity, lang)
return labelIn(lang, entity)
end
function p.ViewSomething(frame) -- from en:Module:Wikidata
local f = (frame.args[1] or frame.args.id) and frame or frame:getParent()
local aa
if isvalid(f.args.id) then
aa = f.args.id
end
local data = mw.wikibase.getEntityObject(aa)
if data == nil then
return nil
end
local i = 1
while true do
local index = f.args[i]
if index == nil then
if type(data) == "table" then
return mw.text.jsonEncode(data, mw.text.JSON_PRESERVE_KEYS + mw.text.JSON_PRETTY)
else
return tostring(data)
end
end
data = data[index] or data[tonumber(index)]
if data == nil then
return
end
i = i + 1
end
end
function p.Dump(frame)
local f = (frame.args[1] or frame.args.id) and frame or frame:getParent()
local aa
if isvalid(f.args.id) then
aa = f.args.id
end
local data = mw.wikibase.getEntityObject(aa)
if data == nil then
return i18n.warnDump
end
local i = 1
while true do
local index = f.args[i]
if index == nil then
return frame:extensionTag("source", mw.dumpObject(data), {lang = "lua"}) .. i18n.warnDump
end
data = data[index] or data[tonumber(index)]
if data == nil then
return i18n.warnDump
end
i = i + 1
end
end
function p.countSiteLinks(id)
return countSiteLinks(id)
end
function p.EntityIdForTitle(frame)
local title = frame.args[1]
local str = mw.wikibase.getEntityIdForTitle(title)
--mw.log(str)
return str
end
function p.Qidfortitleandwiki(frame)
local title = frame.args[1]
local wiki = frame.args[2]
local str = mw.wikibase.getEntityIdForTitle(title, wiki)
return str
end
return p