ویکی‌پدیا mznwiki https://mzn.wikipedia.org/wiki/%DA%AF%D8%AA_%D8%B5%D9%81%D8%AD%D9%87 MediaWiki 1.47.0-wmf.23 first-letter مدیا شا گپ کارور کارور گپ ویکی‌پدیا ویکی‌پدیا گپ پرونده پرونده گپ مدیاویکی مدیاویکی گپ شابلون شابلون گپ رانما رانما گپ رج رج گپ پورتال پورتال گپ پروژه پروژه گپ TimedText TimedText talk ماژول ماژول گپ Event Event talk ماژول:Wikidata.Ca 828 36877 416617 325810 2026-10-13T16:04:06Z محک 1023 416617 Scribunto text/plain -- version 20261002 from master @cawiki -- changes from previous version: -- more fixes following the emergency change provoked by [[phab:T439809]] local p = {} -- Initialization of variables -------------------- local i18n = { -- internationalisation at subpage /i18n ["errors"] = { ["property-not-found"] = "Property not found.", ["qualifier-not-found"] = "Qualifier not found.", }, ["datetime"] = { -- $1 is a placeholder for the actual number ["beforenow"] = "$1 BCE", -- how to format negative numbers for precisions 0 to 5 ["afternow"] = "$1 CE", -- how to format positive numbers for precisions 0 to 5 ["bc"] = "$1 BCE", -- how print negative years ["ad"] = "$1", -- how print 1st century AD dates [0] = "$1 billion years", -- precision: billion years [1] = "$100 million years", -- precision: hundred million years [2] = "$10 million years", -- precision: ten million years [3] = "$1 million years", -- precision: million years [4] = "$100000 years", -- precision: hundred thousand years; thousand separators added afterwards [5] = "$10000 years", -- precision: ten thousand years; thousand separators added afterwards [6] = "$1 millennium", -- precision: millennium [7] = "$1 century", -- precision: century [8] = "$1s", -- precision: decade -- the following use the format of #time parser function [9] = "Y", -- precision: year, [10] = "F Y", -- precision: month [11] = "F j, Y", -- precision: day ["hms"] = {["hours"] = "h", ["minutes"] = "m", ["seconds"] = "s"}, -- duration: xh xm xs }, ["years-old"] = {"", ""}, -- year(s) old, as in magic word {PLURAL:$1|singular|plural} -- two values for most languages, up to six values for some languages, examples: -- ["years-old"] = {"singular", "paucal", "plural"} in Russian and other Slavic languages -- ["years-old"] = {"zero", "one", "two", "few 3-10", "many 11-99", "other 100-102"} in Arabic -- see documentation of PLURAL in your language at [[mw:Help:Magic words#Localization 2]] ["cite"] = { -- cite parameters ["title"] = "title", ["author"] = "author", ["date"] = "date", ["pages"] = "pages", ["language"] = "language", -- cite web parameters ["url"] = "url", ["website"] = "website", ["access-date"] = "access-date", ["archive-url"] = "archive-url", ["archive-date"] = "archive-date", ["publisher"] = "publisher", ["quote"] = "quote", -- cite journal parameters ["work"] = "work", ["issue"] = "issue", ["issn"] = "issn", ["doi"] = "doi" }, -- default local wiki settings ["addpencil"] = false, -- adds a pencil icon linked to Wikidata statement, planned to overwrite by Wikidata Bridge ["categorylabels"] = "", -- Category:Pages with Wikidata labels not translated (void for no local category) ["categoryprop"] = "", -- Category:Pages using Wikidata property $1 (void for no local category) ["categoryref"] = "", -- Category:Pages with references from Wikidata (void for no local category) ["addfallback"] = {}, -- additional fallback language codes ["suppressids"] = {}, -- list of Qid values to suppress ["qidlabels"] = true -- show labels as Qid if no fallback translation is available } local cases = {} -- functions for local grammatical cases defined at subpage /i18n local required = ... -- variadic arguments from require function local wiki = { langcode = mw.language.getContentLanguage().code, module_title = required or mw.getCurrentFrame():getTitle() } local untranslated -- used in infobox modules: nil or true local _ -- variable for unused returned values, avoiding globals -- Module local functions -------------------------------------------- -- Credit to http://stackoverflow.com/a/1283608/2644759, cc-by-sa 3.0 local function tableMerge(t1, t2) for k, v in pairs(t2) do if type(v) == "table" then if type(t1[k] or false) == "table" then tableMerge(t1[k] or {}, t2[k] or {}) else t1[k] = v end else t1[k] = v end end return t1 end local function loadI18n(lang) local exist, res = pcall(require, wiki.module_title .. "/i18n") if exist and next(res) ~= nil then tableMerge(i18n, res.i18n) cases = res.cases end if lang ~= wiki.langcode then exist, res = pcall(require, wiki.module_title .. "/i18n/" .. lang) if exist and next(res) ~= nil then tableMerge(i18n, res.i18n) tableMerge(cases, res.cases) end end i18n.suppress = {} for _, id in ipairs(i18n.suppressids) do i18n.suppress[id] = true end end -- Table of language codes: requested or default and its fallbacks local function findLang(langcode) if mw.language.isKnownLanguageTag(langcode or '') == false then local cframe = mw.getCurrentFrame() local pframe = cframe:getParent() langcode = pframe and pframe.args.lang if mw.language.isKnownLanguageTag(langcode or '') == false then if not mw.title.getCurrentTitle().isContentPage then langcode = cframe:callParserFunction('int', {'lang'}) end if mw.language.isKnownLanguageTag(langcode or '') == false then langcode = wiki.langcode end end end loadI18n(langcode) local languages = mw.language.getFallbacksFor(langcode) table.insert(languages, 1, langcode) table.insert(languages, 2, "mul") -- see [[d:Help:Default values for labels and aliases]] if langcode == wiki.langcode then for _, l in ipairs(i18n.addfallback) do table.insert(languages, l) end end return languages end -- Argument is 'set' when it exists (not nil) or when it is not an empty string. local function isSet(var) return not (var == nil or (type(var) == 'string' and mw.text.trim(var) == '')) end -- Set local case to a label local function case(localcase, label, ...) if not isSet(label) then return label end if type(localcase) == "function" then return localcase(label) elseif localcase == "smallcaps" then return '<span style="font-variant: small-caps;">' .. label .. '</span>' elseif cases[localcase] then return cases[localcase](label, ...) end return label end -- get safely a serialized snak local function getSnak(statement, snaks) local ret = statement for i, v in ipairs(snaks) do if not ret then return end ret = ret[v] end return ret end -- get label with an array of fallback languages -- mw.wikibase.getLabelWithLang uses lang mul as last fallback, not the first one local function getLabelByLangs(id, languages) local label, lang for _, l in ipairs(languages) do label = mw.wikibase.getLabelByLang(id, l) if label then lang = (l == "mul" and languages[1] or l) break end end return label, lang end -- getBestStatements if bestrank=true, else getAllStatements with no deprecated local function getStatements(entityId, property, bestrank) local claims = {} if not (entityId and mw.ustring.match(property, "^P%d+$")) then return claims end if bestrank then claims = mw.wikibase.getBestStatements(entityId, property) else local allclaims = mw.wikibase.getAllStatements(entityId, property) for _, c in ipairs(allclaims) do if c.rank ~= "deprecated" then table.insert(claims, c) end end end return claims end -- Is gender femenine? true or false local function feminineGender(id) for idn in string.gmatch(id, "Q%d+") do local claims = mw.wikibase.getBestStatements(idn or mw.wikibase.getEntityIdForCurrentPage(),'P21') local gender_id = getSnak(claims, {1, "mainsnak", "datavalue", "value", "id"}) if gender_id == nil or not (gender_id == "Q6581072" or gender_id == "Q1052281" or gender_id == "Q43445") then -- not female, transgender female or female organism return false end end return true end -- Fetch female form of label local function feminineForm(id, lang) local feminine_claims = getStatements(id, 'P2521') for _, feminine_claim in ipairs(feminine_claims) do if getSnak(feminine_claim, {'mainsnak', 'datavalue', 'value', 'language'}) == lang then return feminine_claim.mainsnak.datavalue.value.text end end end -- Add an icon for no label in requested language local function addLabelIcon(label_id, lang, uselang, icon) local ret_lang, ret_icon = '', '' if icon then if lang and lang ~= uselang then ret_lang = " <sup>(" .. lang .. ")</sup>" end if label_id and (lang == nil or lang ~= uselang) then local namespace = '' if string.sub(label_id, 1, 1) == 'P' then namespace = 'Property:' end ret_icon = " [[File:Noun Project label icon 1116097 cc mirror.svg|10px|baseline|class=skin-invert|" .. mw.message.new('Translate-taction-translate'):inLanguage(uselang):plain() .. "|link=https://www.wikidata.org/wiki/" .. namespace .. label_id .. "?uselang=" .. uselang .. "]]" untranslated = true end if isSet(i18n.categorylabels) and lang ~= uselang and uselang == wiki.langcode then ret_icon = ret_icon .. '[[' .. i18n.categorylabels .. (lang and ']]' or '/Q]]') end end return ret_lang .. ret_icon end -- editicon values: true/false (no=false), right, void defaults to i18n.addpencil -- labelicon only by parameter local function setIcons(arg, parg) local val = arg == nil and parg or arg local edit_icon, label_icon if not isSet(val) then edit_icon, label_icon = i18n.addpencil, true elseif val == false or val == "false" or val == "no" then edit_icon, label_icon = false, false else edit_icon, label_icon = val, true end return edit_icon, label_icon end -- Add an icon for editing a statement with requirements for future Wikidata Bridge local function addEditIcon(parameters) local ret = '' if parameters.editicon and parameters.id and parameters.property then local bridge_flow = parameters.editbridge and ' data-bridge-edit-flow="single-best-value"' or '' local icon_style = parameters.editicon == "right" and ' style="float: right;"' or '' ret = ' <span class="penicon"' .. bridge_flow .. icon_style .. '>' .. "[[File:Arbcom ru editing.svg|10px|baseline|" .. string.gsub(mw.message.new('Wikibase-client-data-bridge-bailout-suggestion-go-to-repo-button'):inLanguage(parameters.lang[1]):plain(), '{{WBREPONAME}}', 'Wikidata') .. "|link=https://www.wikidata.org/wiki/" .. parameters.id .. "?uselang=" .. parameters.lang[1] .. "#" .. parameters.property .. "]]" .. "</span>" if isSet(i18n.categoryprop) then ret = ret .. "[[" .. string.gsub(i18n.categoryprop, '$1', parameters.property) .. "]]" end end return ret end -- add edit icon to the last element of a table local function addEditIconTable(thetable, parameters) if #thetable == 0 or parameters.editicon == false then return thetable end local last_element = thetable[#thetable] local the_icon = addEditIcon(parameters) -- add it before last html closing tags local tags = '' local rev_element = string.reverse(last_element) for tag in string.gmatch(rev_element, '(>%l+/<)') do if string.match(rev_element, '^' .. tags .. tag) then tags = tags .. tag else break end end local last_tags = string.reverse(tags) local offset = string.find(last_element, last_tags .. '$') if offset then thetable[#thetable] = string.sub(last_element, 1, offset - 1) .. the_icon .. last_tags else thetable[#thetable] = last_element .. the_icon end return thetable end -- Escape Lua captures local function captureEscapes(text) return mw.ustring.gsub(text, "(%%%d)", "%%%1") end -- expandTemplate or callParserFunction local function expandBraces(text, formatting) if text == nil or formatting == nil then return text end -- only expand braces if provided in argument, not included in value as in Q1164668 if mw.ustring.find(formatting, '{{', 1, true) == nil then return text end if type(text) ~= "string" then text = tostring(text) end for braces in mw.ustring.gmatch(text, "{{(.-)}}") do local parts = mw.text.split(braces, "|") local title_part = parts[1] local parameters = {} for i = 2, #parts do local subparts = mw.ustring.find(parts[i], "=") if subparts then local param_name = mw.ustring.sub(parts[i], 1, subparts - 1) local param_value = mw.ustring.sub(parts[i], subparts + 1, -1) -- reconstruct broken links by parts if i < #parts and mw.ustring.find(param_value, "[[", 1, true) and not mw.ustring.find(param_value, "]]", 1, true) then parameters[param_name] = param_value local part_next = i + 1 while parts[part_next] and mw.ustring.find(parts[part_next], "]]", 1, true) do parameters[param_name] = parameters[param_name] .. "|" .. parts[part_next] part_next = part_next + 1 end else parameters[param_name] = param_value end elseif not mw.ustring.find(parts[i], "]]", 1, true) then table.insert(parameters, parts[i]) end end local braces_expanded if mw.ustring.find(title_part, ":") and mw.text.split(title_part, ":")[1] ~= mw.site.namespaces[10].name -- not a prefix Template: then braces_expanded = mw.getCurrentFrame():callParserFunction{name=title_part, args=parameters} elseif title_part == "!" then -- template:! may be deleted locally, now provided by MediaWiki -- although it works, it raises a Lua internal error braces_expanded = "|" else braces_expanded = mw.getCurrentFrame():expandTemplate{title=title_part, args=parameters} end braces = mw.ustring.gsub(braces, "([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1") -- escape magic characters braces_expanded = captureEscapes(braces_expanded) text = mw.ustring.gsub(text, "{{" .. braces .. "}}", braces_expanded) end return text end -- format data type math local function printDatatypeMath(data) return mw.getCurrentFrame():callParserFunction('#tag:math', data) end -- format data type musical-notation local function printDatatypeMusical(data, formatting) local attr = {} if formatting == 'sound' then attr.sound = 1 end return mw.getCurrentFrame():extensionTag('score', data, attr) end -- format data type string local function printDatatypeString(data, parameters) if mw.ustring.find((parameters.formatting or ''), '$1', 1, true) then -- formatting = a pattern return expandBraces(mw.ustring.gsub(parameters.formatting, '$1', {['$1'] = data}), parameters.formatting) elseif parameters.case then return case(parameters.case, data, parameters.lang[1], feminineGender(parameters.id)) end local data_number = string.match(data, "^%d+") if data_number then -- sort key by initial number and remaining string local sortkey = string.format("%019d", data_number * 1000) return data, sortkey .. string.sub(data, #data_number + 1) end return data end -- format data type tabular-data local function printDatatypeTabular(data, parameters) local icon if parameters.formatting == 'raw' then icon = "no-icon" data = string.gsub(data, '^Data:', '') -- remove prefix, i.e. see Module:Tabular data end return printDatatypeString(data, parameters), icon end -- format data type url local function printDatatypeUrl(data, parameters) if parameters.formatting == 'weblink' then local label_parts = mw.text.split(string.gsub(data, '/$', ''), '/') local label = string.gsub(label_parts[3], '^www%.', '') if #label_parts > 3 then label = label .. '…' end return '[' .. data .. ' ' .. label .. ']' end return printDatatypeString(data, parameters) end -- format data type external-id local function printDatatypeExternal(data, parameters) if parameters.formatting == 'externalid' then local p_stat = mw.wikibase.getBestStatements(parameters.property, 'P1630') -- formatter URL local p_link_pattern = getSnak(p_stat, {1, "mainsnak", "datavalue", "value"}) if p_link_pattern then local p_link = mw.ustring.gsub(p_link_pattern, '$1', {['$1'] = data}) return '[' .. p_link .. ' ' .. data .. ']' end end return printDatatypeString(data, parameters) end -- format data type commonsMedia and geo-shape local function printDatatypeMedia(data, parameters) local icon if not string.find((parameters.formatting or ''), '$1', 1, true) then icon = "no-icon" if not string.find(data, '^Data:') then data = mw.uri.encode(data, 'PATH') -- encode special characters in filename end end return printDatatypeString(data, parameters), icon end -- format data type globe-coordinate local function printDatatypeCoordinate(data, formatting) local function globes(globe_id) -- parameter globe in coordinates accepted by GeoHack -- see [[w:en:Special:PrefixIndex/Template:GeoTemplate]] local globes = {['Q3343'] = 'ariel', ['Q3134'] = 'callisto', ['Q596'] = 'ceres', ['Q6604'] = 'charon', ['Q7548'] = 'deimos', ['Q15040'] = 'dione', ['Q2'] = 'earth', ['Q3303'] = 'enceladus', ['Q3143'] = 'europa', ['Q3169'] = 'ganymede', ['Q15037'] = 'hyperion', ['Q17958'] = 'iapetus', ['Q3123'] = 'io', ['Q319'] = 'jupiter', ['Q111'] = 'mars', ['Q308'] = 'mercury', ['Q15034'] = 'mimas', ['Q3352'] = 'miranda', ['Q405'] = 'moon', ['Q3332'] = 'oberon', ['Q7547'] = 'phobos', ['Q17975'] = 'phoebe', ['Q339'] = 'pluto', ['Q15050'] = 'rhea', ['Q15047'] = 'tethys', ['Q2565'] = 'titan', ['Q3322'] = 'titania', ['Q3359'] = 'triton', ['Q3338'] = 'umbriel', ['Q313']='venus', ['Q3030']='vesta'} return globes[globe_id] end local function roundPrecision(num, prec) if prec == nil or prec <= 0 then return num end local sig = 10^math.floor(math.log10(prec)+.5) -- significant figure from sexagesimal precision: 0.00123 -> 0.001 return math.floor(num / sig + 0.5) * sig end local precision = data.precision local latitude = roundPrecision(data.latitude, precision) local longitude = roundPrecision(data.longitude, precision) if formatting and string.find(formatting, '$lat', 1, true) and string.find(formatting, '$lon', 1, true) then local ret = mw.ustring.gsub(formatting, '$l[ao][tn]', {['$lat'] = latitude, ['$lon'] = longitude}) if string.find(formatting, '$globe', 1, true) then local myglobe = 'earth' if isSet(data.globe) then local globenum = mw.text.split(data.globe, 'entity/')[2] -- http://www.wikidata.org/wiki/Q2 myglobe = globes(globenum) or 'earth' end ret = mw.ustring.gsub(ret, '$globe', myglobe) end return expandBraces(ret, formatting) elseif formatting == 'latitude' then return latitude, "no-icon" elseif formatting == 'longitude' then return longitude, "no-icon" elseif formatting == 'dimension' then return data.dimension, "no-icon" else --default formatting='globe' if isSet(data.globe) == false or data.globe == 'http://www.wikidata.org/entity/Q2' then return 'earth', "no-icon" else local globenum = mw.text.split(data.globe, 'entity/')[2] return globes(globenum) or globenum, "no-icon" end end end -- Local functions for data value quantity local function unitSymbol(id, lang) -- get unit symbol or code local unit_symbol = '' if lang == wiki.langcode and pcall(require, wiki.module_title .. "/Units") then unit_symbol = require(wiki.module_title .. "/Units").getUnit(0, '', id, true) end if unit_symbol == '' then -- fetch it local claims = mw.wikibase.getBestStatements(id, 'P5061') if #claims > 0 then local langclaims = {} for _, snak in ipairs(claims) do local snak_language = getSnak(snak, {"mainsnak", "datavalue", "value", "language"}) if snak_language and not langclaims[snak_language] then -- just the first one by language langclaims[snak_language] = snak.mainsnak.datavalue.value.text end end for _, l in ipairs(lang) do if langclaims[l] then return langclaims[l] end end end end return unit_symbol end local function getUnit(amount, id, parameters) -- get unit symbol or name local suffix = '' if string.sub(parameters.formatting or '', 1, 8) == "unitcode" then -- get unit symbol local unit_symbol = unitSymbol(id, parameters.lang) if isSet(unit_symbol) then if string.sub(parameters.formatting or '', -6) == "linked" then suffix = "[[" .. (mw.wikibase.getSitelink(id) or "d:" .. id) .. "|" .. unit_symbol .. "]]" else suffix = unit_symbol end end end if suffix == '' then -- formatting=unit, or formatting=unitcode not found -- get unit label local unit_label, lang = getLabelByLangs(id, parameters.lang) if lang == wiki.langcode and pcall(require, wiki.module_title .. "/Units") then suffix = require(wiki.module_title .. "/Units").getUnit(amount, unit_label, id, false) if string.sub(parameters.formatting or '', -6) == "linked" then suffix = "[[" .. (mw.wikibase.getSitelink(id) or "d:" .. id) .. "|" .. suffix .. "]]" end else suffix = (unit_label or id) .. addLabelIcon(id, lang, parameters.lang[1], parameters.labelicon) end end if suffix ~= '' then suffix = ' ' .. suffix end return suffix end local function roundDefPrecision(in_num, factor) -- rounds out_num with significant figures of in_num (default precision) local out_num = in_num * factor if factor/60 == math.floor(factor/60) or out_num == 0 then -- sexagesimal integer or avoiding NaN return out_num end -- first, count digits after decimal mark, handling cases like '12.345e6' local exponent, prec local integer, dot, decimals, expstr = in_num:match('^(%d*)(%.?)(%d*)(.*)') local e = expstr:sub(1, 1) if e == 'e' or e == 'E' then exponent = tonumber(expstr:sub(2)) end if dot == '' then prec = -integer:match('0*$'):len() else prec = #decimals end if exponent then -- So '1230' and '1.23e3' both give prec = -1, and '0.00123' and '1.23e-3' give 5. prec = prec - exponent end -- significant figures local in_bracket = 10^-prec -- -1 -> 10, 5 -> 0.00001 local out_bracket = in_bracket * out_num / in_num out_bracket = 10^math.floor(math.log10(out_bracket)+.5) -- 1230 -> 1000, 0.00123 -> 0.001 -- round it (credit to Luc Bloom from http://lua-users.org/wiki/SimpleRound) return math.floor(out_num/out_bracket + (out_num >=0 and 1 or -1) * 0.5) * out_bracket end -- format data type quantity local function printDatatypeQuantity(data, parameters) local amount = data.amount amount = mw.ustring.gsub(amount, "%+", "") local suffix = "" local conv_amount, conv_suffix if string.sub(parameters.formatting or '', 1, 4) == "unit" or string.sub(parameters.formatting or '', 1, 8) == "duration" or parameters.convert then local unit_id = data.unit unit_id = mw.ustring.sub(unit_id, mw.ustring.find(unit_id, "Q"), -1) if string.sub(unit_id, 1, 1) == "Q" then suffix = getUnit(amount, unit_id, parameters) local convert_to if parameters.convert == "default" or parameters.convert == "default2" then local exist, units = pcall(require, wiki.module_title .. "/Units") if exist and units.convert_default and next(units.convert_default) ~= nil then convert_to = units.convert_default[unit_id] end elseif string.sub(parameters.convert or '', 1, 1) == "Q" then convert_to = parameters.convert elseif string.sub(parameters.formatting or '', 1, 8) == "duration" then convert_to = 'Q11574' -- seconds end if convert_to and convert_to ~= unit_id then -- convert units local conv_temp = { -- formulae for temperatures ºC, ºF, ªK: [from] = {[to] = 'formula'} ['Q25267'] = {['Q42289'] = '$1*1.8+32', ['Q11597'] = '$1+273.15'}, ['Q42289'] = {['Q25267'] = '($1-32)/1.8', ['Q11597'] = '($1+459.67)*5/9'}, ['Q11597'] = {['Q25267'] = '$1-273.15', ['Q42289'] = '($1-273.15)*1.8000+32.00'} } if conv_temp[unit_id] and conv_temp[unit_id][convert_to] then local amount_f = mw.getCurrentFrame():callParserFunction('#expr', mw.ustring.gsub(conv_temp[unit_id][convert_to], "$1", amount)) conv_amount = math.floor(tonumber(amount_f) + 0.5) else local conversions = getStatements(unit_id, 'P2442') -- conversion to standard unit table.insert(conversions, mw.wikibase.getBestStatements(unit_id, 'P2370')[1]) -- conversion to SI unit for _, conv in ipairs(conversions) do if conv.mainsnak.snaktype == 'value' then -- no somevalue nor novalue if conv.mainsnak.datavalue.value.unit == "http://www.wikidata.org/entity/" .. convert_to then conv_amount = roundDefPrecision(amount, tonumber(conv.mainsnak.datavalue.value.amount)) break end end end end if conv_amount then conv_suffix = getUnit(conv_amount, convert_to, parameters) end elseif parameters.convert == 'M' then local exist, units = pcall(require, wiki.module_title .. "/Units") if wiki.langcode == parameters.lang[1] and exist and units.convert2M and type(units.convert2M) == "function" then conv_amount, conv_suffix = units.convert2M(amount) conv_suffix = (conv_suffix or "").. suffix elseif tonumber(amount) > 10^8 then conv_amount = math.floor(amount/10^6 + 0.5) conv_suffix = ' M' .. mw.text.trim(suffix) end end if conv_amount and parameters.formatting == 'raw' then amount = conv_amount suffix = "" conv_amount = nil end end end local lang_obj = mw.language.new(parameters.lang[1]) local sortkey = string.format("%019d", tonumber(amount) * 1000) if string.sub(parameters.formatting or '', 1, 8) == "duration" then local sec = tonumber(conv_amount or amount) if parameters.formatting == 'duration' then return lang_obj:formatDuration(sec) elseif parameters.formatting == 'durationm:s' then local mm = math.floor(sec / 60) local ss = sec - (mm * 60) return string.format("%02d:%02d", mm, ss) else -- durationhms or durationh:m:s local intervals = {"hours", "minutes", "seconds"} local sec2table = lang_obj:getDurationIntervals(sec, intervals) sec2table["seconds"] = (sec2table["seconds"] or 0) + tonumber("." .. (tostring(sec):match("%.(%d+)") or "0")) -- add decimals local duration = '' for i, v in ipairs(intervals) do if parameters.formatting == 'durationh:m:s' then if i == 1 and sec2table[v] then duration = duration .. sec2table[v] .. ":" elseif i == 2 then duration = duration .. string.format("%02d", sec2table[v] or 0) .. ":" elseif i == 3 then local sec_str = tostring(lang_obj:formatNum(sec2table[v] or 0)) duration = duration .. (sec2table[v] < 10 and "0" or "") .. sec_str end elseif sec2table[v] then duration = duration .. lang_obj:formatNum(sec2table[v]) .. i18n.datetime.hms[v] .. (i < 3 and " " or "") end end return duration end end if parameters.case then amount = case(parameters.case, amount, parameters.lang[1], feminineGender(parameters.id)) elseif parameters.formatting ~= 'raw' then if parameters.numformat then amount = lang_obj:formatNum(tonumber(string.format(parameters.numformat, amount))) else amount = lang_obj:formatNum(tonumber(amount)) end end if conv_amount then local conv_sortkey = string.format("%019d", conv_amount * 1000) conv_amount = lang_obj:formatNum(conv_amount) if parameters.convert == 'default2' then return conv_amount .. conv_suffix .. ' (' .. amount .. suffix .. ')', conv_sortkey else return conv_amount .. conv_suffix, conv_sortkey end elseif mw.ustring.find((parameters.formatting or ''), '$1', 1, true) then -- formatting with pattern amount = mw.ustring.gsub(parameters.formatting, '$1', {['$1'] = amount}) end return amount .. suffix, sortkey end -- format data type time local function printDatatypeTime(data, parameters) -- Dates and times are stored in ISO 8601 format local timestamp = data.time if parameters.formatting == "raw" then return timestamp, timestamp end local post_format local calendar_add = "" local precision = data.precision or 11 if string.sub(timestamp, 1, 1) == '-' then post_format = i18n.datetime["bc"] elseif string.sub(timestamp, 2, 3) == '00' then post_format = i18n.datetime["ad"] elseif precision > 8 then -- calendar model local calendar_model = {["Q12138"] = "gregorian", ["Q1985727"] = "gregorian", ["Q11184"] = "julian", ["Q1985786"] = "julian"} local calendar_id = mw.text.split(data.calendarmodel, 'entity/')[2] if (timestamp < "+1582-10-15T00:00:00Z" and calendar_model[calendar_id] == "gregorian") or (timestamp > "+1582-10-04T00:00:00Z" and calendar_model[calendar_id] == "julian") then calendar_add = " <sup>(" .. mw.message.new('Wikibase-time-calendar-' .. calendar_model[calendar_id]):inLanguage(parameters.lang[1]):plain() .. ")</sup>" end end local function formatTime(form, stamp) local pattern if type(form) == "function" then pattern = form(stamp) else pattern = form end stamp = tostring(stamp) if mw.ustring.find(pattern, "$1") then return mw.ustring.gsub(pattern, "$1", stamp) elseif string.sub(stamp, 1, 1) == '-' then -- formatDate() only supports years from 0 stamp = '+' .. string.sub(stamp, 2) elseif string.sub(stamp, 1, 1) ~= '+' then -- not a valid timestamp, it is a number stamp = string.format("%04d", stamp) end local ret = mw.language.new(parameters.lang[1]):formatDate(pattern, stamp) ret = string.gsub(ret, "^(%[?%[?)0+", "%1") -- suppress leading zeros ret = string.gsub(ret, "( %[?%[?)0+", "%1") return ret end local function postFormat(t) if post_format and mw.ustring.find(post_format, "$1") then return mw.ustring.gsub(post_format, "$1", t) end return t end local intyear = tonumber(string.match(timestamp, "[+-](%d+)")) local ret if precision <= 5 then -- precision is 10000 years or more local factor = 10 ^ ((5 - precision) + 4) local y2 = math.ceil(math.abs(intyear) / factor) local relative = formatTime(i18n.datetime[precision], y2) if post_format == i18n.datetime["bc"] then ret = mw.ustring.gsub(i18n.datetime.beforenow, "$1", relative) else ret = mw.ustring.gsub(i18n.datetime.afternow, "$1", relative) end local ret_number = string.match(ret, "%d+") if ret_number ~= nil then ret = mw.ustring.gsub(ret, ret_number, mw.language.new(parameters.lang[1]):formatNum(tonumber(ret_number))) end elseif precision == 6 or precision == 7 then -- millennia or centuries local card = math.floor((intyear - 1) / 10^(9 - precision)) + 1 ret = formatTime(i18n.datetime[precision], card) ret = postFormat(ret) elseif precision == 8 then -- decades local card = math.floor(math.abs(intyear) / 10) * 10 ret = formatTime(i18n.datetime[8], card) ret = postFormat(ret) elseif intyear > 9999 then -- not a valid timestamp return elseif precision == 9 or parameters.formatting == 'Y' then -- precision is year ret = formatTime(i18n.datetime[9], intyear) ret = postFormat(ret) .. calendar_add elseif precision == 10 then -- month ret = formatTime(i18n.datetime[10], timestamp .. " + 1 day") -- formatDate yyyy-mm-00 returns the previous month ret = postFormat(ret) .. calendar_add else -- precision 11, day ret = formatTime(parameters.formatting or i18n.datetime[11], timestamp) ret = postFormat(ret) .. calendar_add end return ret, timestamp end -- format data value wikibase-entityid with data types wikibase-item or wikibase-property local function printDatatypeEntity(data, parameters) local entity_id = data['id'] if parameters.formatting == 'raw' then return entity_id, entity_id end local entity_page = 'Special:EntityPage/' .. entity_id local label, lang = getLabelByLangs(entity_id, parameters.lang) local sitelink = mw.wikibase.getSitelink(entity_id) local parameter = parameters.formatting local labelcase = label or sitelink if parameters.gender == 'feminineform' then labelcase = feminineForm(entity_id, lang) or labelcase end if parameters.case ~= 'gender' then labelcase = case(parameters.case, labelcase, lang, parameters.lang[1], entity_id, parameters.id) end if labelcase == nil and i18n.qidlabels == false then return end local ret1, ret2 if parameter == 'label' then ret1 = labelcase or entity_id ret2 = labelcase or entity_id elseif parameter == 'sitelink' then ret1 = (sitelink or 'd:' .. entity_page) ret2 = sitelink or entity_id elseif mw.ustring.find((parameter or ''), '$1', 1, true) then -- formatting = a pattern ret1 = mw.ustring.gsub(parameter, '$1', labelcase or entity_id) ret1 = expandBraces(ret1, parameter) ret2 = labelcase or entity_id else if parameter == "ucfirst" or parameter == "ucinternallink" then if labelcase and lang then labelcase = mw.language.new(lang):ucfirst(labelcase) end -- only first of a list, reset formatting for next ones if parameter == "ucinterlanllink" then parameters.formatting = 'internallink' else parameters.formatting = nil -- default format end end if sitelink then ret1 = '[[' .. sitelink .. '|' .. labelcase .. ']]' ret2 = labelcase elseif label and string.match(parameter or '', 'internallink$') and not mw.wikibase.getEntityIdForTitle(label) then ret1 = '[[' .. label .. '|' .. labelcase .. ']]' ret2 = labelcase else ret1 = '[[d:' .. entity_page .. '|' .. (labelcase or entity_id) .. ']]' ret2 = labelcase or entity_id end end return ret1 .. addLabelIcon(entity_id, lang, parameters.lang[1], parameters.labelicon), ret2 end -- format data type wikibase-lexeme local function printDatatypeLexeme(data, parameters) local entity_id = data['id'] if parameters.formatting == 'raw' then return entity_id, entity_id end local lemmas = mw.wikibase.getEntity(entity_id):getLemmas() if parameters.list == 'lang' and lemmas[1][2] ~= parameters.lang[1] then return end local ret = '[[d:Special:EntityPage/' .. entity_id .. '|' .. lemmas[1][1] .. ']]' if parameters.list ~= 'lang' or (parameters.list == 'lang' and lemmas[1][2] ~= wiki.langcode) then ret = ret .. " <sup>(" .. lemmas[1][2] .. ")</sup>" end return ret, entity_id end -- format data type monolingualtext local function printDatatypeMonolingual(data, parameters) -- data fields: language [string], text [string] local valid_lang = {[parameters.lang[1]] = true, ["mul"] = true} if parameters.list == "lang" and not valid_lang[data["language"]] then return elseif parameters.list == "notlang" and valid_lang[data["language"]] then return elseif parameters.formatting == "language" or parameters.formatting == "text" then return data[parameters.formatting] end local result = data["text"] valid_lang = {[wiki.langcode] = true, ["mul"] = true} if not valid_lang[data["language"]] then result = mw.ustring.gsub('<span lang="$1">$2</span>', '$[12]', {["$1"]=data["language"], ["$2"]=data["text"]}) end if mw.ustring.find((parameters.formatting or ''), '$', 1, true) then -- output format defined with $text, $language result = mw.ustring.gsub(parameters.formatting, '$text', result) result = mw.ustring.gsub(result, '$language', data["language"]) end return result end local function getSnakValue(snak, parameters) parameters.editbridge = false if snak.snaktype == 'value' then -- see Special:ListDatatypes -- data value string if snak.datatype == "string" then parameters.editbridge = true -- Wikidata Bridge currently only for string values return printDatatypeString(snak.datavalue.value, parameters) elseif snak.datatype == "commonsMedia" or snak.datatype == "geo-shape" then return printDatatypeMedia(snak.datavalue.value, parameters) elseif snak.datatype == "tabular-data" then return printDatatypeTabular(snak.datavalue.value, parameters) elseif snak.datatype == "url" then return printDatatypeUrl(snak.datavalue.value, parameters) elseif snak.datatype == "external-id" then return printDatatypeExternal(snak.datavalue.value, parameters) elseif snak.datatype == 'math' then return printDatatypeMath(snak.datavalue.value) elseif snak.datatype == 'musical-notation' then return printDatatypeMusical(snak.datavalue.value, parameters.formatting) -- data types other than string value elseif snak.datatype == 'wikibase-item' or snak.datatype == 'wikibase-property' then if i18n.suppress[snak.datavalue.value.id] then return end return printDatatypeEntity(snak.datavalue.value, parameters) elseif snak.datatype == 'wikibase-lexeme' then return printDatatypeLexeme(snak.datavalue.value, parameters) elseif snak.datatype == 'monolingualtext' then return printDatatypeMonolingual(snak.datavalue.value, parameters) elseif snak.datatype == "globe-coordinate" then return printDatatypeCoordinate(snak.datavalue.value, parameters.formatting) elseif snak.datatype == "quantity" then return printDatatypeQuantity(snak.datavalue.value, parameters) elseif snak.datatype == "time" then return printDatatypeTime(snak.datavalue.value, parameters) end elseif snak.snaktype == 'novalue' then if parameters.formatting == 'raw' or parameters.shownovalue == false then return end return mw.message.new('Wikibase-snakview-snaktypeselector-novalue'):inLanguage(parameters.lang[1]):plain() elseif snak.snaktype == 'somevalue' then if parameters.formatting == 'raw' or parameters.showsomevalue == false then return end return mw.message.new('Wikibase-snakview-snaktypeselector-somevalue'):inLanguage(parameters.lang[1]):plain() end return mw.wikibase.renderSnak(snak) end local function printError(key) return '<span class="error">' .. i18n.errors[key] .. '</span>' end local function getQualifierSnak(claim, qualifierId, parameters) -- a "snak" is Wikidata terminology for a typed key/value pair -- a claim consists of a main snak holding the main information of this claim, -- as well as a list of attribute snaks and a list of references snaks if qualifierId then -- search the attribute snak with the given qualifier as key if claim.qualifiers then local qualifier = claim.qualifiers[qualifierId] if qualifier then if qualifier[1].datatype == "monolingualtext" then -- iterate over monolingualtext qualifiers to get languages local qual_lang, qual_mul for idx in pairs(qualifier) do qual_lang = getSnak(qualifier[idx], {"datavalue", "value", "language"}) if qual_lang == parameters.lang[1] then return qualifier[idx] -- return local language if found elseif qual_lang == "mul" then qual_mul = qualifier[idx] end end return qual_mul -- else return multilingual elseif parameters.list then return qualifier else return qualifier[1] end end end return nil, printError("qualifier-not-found") else -- otherwise return the main snak return claim.mainsnak end end local function getValueOfClaim(claim, qualifierId, parameters) local snak, error = getQualifierSnak(claim, qualifierId, parameters) if not snak then return nil, nil, error elseif snak[1] then -- a multi qualifier local result, sortkey = {}, {} local maxvals = tonumber(parameters.listmax) for idx in pairs(snak) do result[#result + 1], sortkey[#sortkey + 1] = getSnakValue(snak[idx], parameters) if maxvals and maxvals == #result then break end end return mw.text.listToText(result, parameters.qseparator, parameters.qconjunction), sortkey[1] else -- a property or a qualifier return getSnakValue(snak, parameters) end end local function getValueOfParentClaim(claim, qualifierId, parameters) local qids = mw.text.split(qualifierId, '/', true) local value, sortkey, valueraw = {}, {}, {} local parent_raw, value_text if qids[1] == parameters.property then parent_raw, _, _ = getValueOfClaim(claim, nil, {["formatting"]="raw", ["lang"]=parameters.lang}) else parent_raw, _, _ = getValueOfClaim(claim, qids[1], {["formatting"]="raw", ["lang"]=parameters.lang, ["list"]=true, ["qseparator"]='/', ["qconjunction"]='/'}) end if string.sub(parent_raw or '', 1, 1) == "Q" then -- protection for 'no value' local parent_qids = mw.text.split(parent_raw, '/', true) for idx, p_qid in ipairs(parent_qids) do local parent_claims = mw.wikibase.getBestStatements(p_qid, qids[2]) if parent_claims[1] then value[idx], sortkey[idx], _ = getValueOfClaim(parent_claims[1], nil, parameters) -- raw parent value needed for while/black lists, lang for avoiding an error on types other than entity valueraw[idx], _, _ = getValueOfClaim(parent_claims[1], nil, {["formatting"]="raw", ["lang"]=parameters.lang}) end end end if value[1] then value_text = mw.text.listToText(value, parameters.qseparator, parameters.qconjunction) end return value_text, sortkey[1], valueraw[1] end -- see d:Help:Sources local function getReferences(claim, parameters) if not (parameters.references or parameters.onlysourced) then return '', false end local lang = parameters.lang local maxrefs = tonumber(parameters.references) or 1 local notproperref = { ["P143"] = true, -- imported from ["P3452"] = true, -- inferred from ["P887"] = true, -- based on heuristic ["P4656"] = true -- Wikimedia import URL } local result = {} -- traverse through all references for ref in pairs(claim.references or {}) do local refparts local refs = {} local validref = true local ref_id -- traverse through all parts of the current reference for snakkey, snakval in pairs(claim.references[ref].snaks or {}) do for partkey, _ in pairs(claim.references[ref].snaks[snakkey] or {}) do if notproperref[snakkey] then -- not a proper reference validref = false break end end if validref then for snakidx = 1, #snakval do if snakidx > 1 then refparts = refparts .. ", " end if snakval[snakidx].datatype == 'external-id' then refparts = refparts or '' .. (getSnakValue(snakval[snakidx], {formatting='externalid', property=snakval[snakidx].property, lang=lang}) or '') else refparts = refparts or '' .. (getSnakValue(snakval[snakidx], {lang=lang}) or '') end end refs[snakkey] = refparts refparts = nil if snakkey == "P248" then -- stated in ref_id = getSnak(snakval, {1, "datavalue", "value", "id"}) end end end -- fill missing values with parent item if ref_id then local function refParent(qid, pid, formatting) local snak = getSnak(mw.wikibase.getBestStatements(qid, pid), {1, "mainsnak"}) return snak and getSnakValue(snak, {formatting=formatting, lang=lang}) end refs['P50'] = refs['P50'] or refParent(ref_id, 'P50', 'label') -- author refs['P407'] = refs['P407'] or refParent(ref_id, 'P407', 'label') -- language of work refs['P123'] = refs['P123'] or refParent(ref_id, 'P123', 'label') -- publisher refs['P577'] = refs['P577'] or refParent(ref_id, 'P577') -- date refs['P1433'] = refs['P1433'] or refParent(ref_id, 'P1433', 'label') -- published in refs['P304'] = refs['P304'] or refParent(ref_id, 'P304') -- page(s) refs['P433'] = refs['P433'] or refParent(ref_id, 'P433') -- issue refs['P236'] = refs['P236'] or refParent(ref_id, 'P236') -- ISSN refs['P356'] = refs['P356'] or refParent(ref_id, 'P356') -- DOI end -- get title of local templates for citing references local template_web = mw.wikibase.getSitelink('Q5637226') or "" template_web = mw.text.split(template_web, ":")[2] -- split off namespace from front local template_journal = mw.wikibase.getSitelink('Q5624899') or "" template_journal = mw.text.split(template_journal, ":")[2] local citeParams = {} if refs['P854'] and (refs['P1476'] or refs['P248']) and template_web then -- if both "reference URL" and "title" (or "stated in") are present, then use cite web template citeParams[i18n['cite']['url']] = refs['P854'] if refs['P248'] and refs['P1476'] == nil then citeParams[i18n['cite']['title']] = refs['P248']:match("^%[%[.-|(.-)%]%]") else citeParams[i18n['cite']['title']] = refs['P1476'] citeParams[i18n['cite']['website']] = refs['P248'] end citeParams[i18n['cite']['author']] = refs['P50'] citeParams[i18n['cite']['language']] = refs['P407'] citeParams[i18n['cite']['publisher']] = refs['P123'] citeParams[i18n['cite']['date']] = refs['P577'] citeParams[i18n['cite']['pages']] = refs['P304'] citeParams[i18n['cite']['access-date']] = refs['P813'] citeParams[i18n['cite']['archive-url']] = refs['P1065'] citeParams[i18n['cite']['archive-date']] = refs['P2960'] citeParams[i18n['cite']['quote']] = refs['P1683'] refparts = mw.getCurrentFrame():expandTemplate{title=template_web, args=citeParams} elseif refs['P1433'] and (refs['P1476'] or refs['P248']) and template_journal then -- if both "published in" and "title" (or "stated in") are present, then use cite journal template citeParams[i18n['cite']['work']] = refs['P1433'] citeParams[i18n['cite']['title']] = refs['P1476'] or refs['P248'] citeParams[i18n['cite']['author']] = refs['P50'] citeParams[i18n['cite']['date']] = refs['P577'] citeParams[i18n['cite']['issue']] = refs['P433'] citeParams[i18n['cite']['pages']] = refs['P304'] citeParams[i18n['cite']['language']] = refs['P407'] citeParams[i18n['cite']['issn']] = refs['P236'] citeParams[i18n['cite']['doi']] = refs['P356'] refparts = mw.getCurrentFrame():expandTemplate{title=template_journal, args=citeParams} elseif validref then -- raw ouput local snaksorder = claim.references[ref]["snaks-order"] local function indexed(a) for _, b in ipairs(snaksorder) do if b == a then return true end end return false end for k, _ in pairs(refs or {}) do if not indexed(k) then table.insert(snaksorder, k) end end local italics = "''" local ref_label for _, k in ipairs(snaksorder) do if refs[k] then refparts = refparts and refparts .. " " or "" ref_label = case('infoboxlabel', getLabelByLangs(k, lang) or '') refparts = refparts .. mw.ustring.gsub(ref_label, "^%l", mw.ustring.upper) .. ": " refparts = refparts .. italics .. refs[k] .. italics .. "." italics = "" end end end if refparts then local ref_name = claim.references[ref].hash result[#result + 1] = mw.getCurrentFrame():extensionTag("ref", refparts, {name=ref_name}) if maxrefs and maxrefs == #result then break end end end if #result > 0 then if parameters.references then if isSet(i18n.categoryref) then result[#result + 1] = "[[" ..i18n.categoryref .. "]]" end return table.concat(result), true else return '', true end end return '', false end -- Set lists of filtered values local function setFilterLists(num_qual, args) local lists = {['whitelist']={}, ['blacklist']={}, ['ignorevalue']={}, ['selectvalue']={}} for i = 0, num_qual do for k, _ in pairs(lists) do if isSet(args[k .. i]) then lists[k][tostring(i)] = {} local pattern = 'Q%d+' if string.sub(args[k .. i], 1, 1) ~= 'Q' then pattern = '[^%p%s]+' end for q in string.gmatch(args[k .. i], pattern) do lists[k][tostring(i)][q] = true end end end end return lists['whitelist'], lists['blacklist'], lists['ignorevalue'], lists['selectvalue'] end local function tableParameters(args, parameters, column) local column_params = mw.clone(parameters) column_params.formatting = args["colformat"..column]; if column_params.formatting == "" then column_params.formatting = nil end column_params.convert = args["convert" .. column] if args["case" .. column] then column_params.case = args["case" .. column] end return column_params end local function getEntityId(args, pargs, unnamed) pargs = pargs or {} local id = args.item or args.from or (unnamed and mw.text.trim(args[1] or '') or nil) if not isSet(id) then id = pargs.item or pargs.from or (unnamed and mw.text.trim(pargs[1] or '') or nil) end if isSet(id) then if string.find(id, ":") then -- remove prefix as Property:Pid id = mw.text.split(id, ":")[2] end else id = mw.wikibase.getEntityIdForCurrentPage() end return id end local function getArg(value, default, aliases) if type(value) == 'boolean' then return value elseif value == "false" or value == "no" then return false elseif value == "true" or value == "yes" then return true elseif value and aliases and aliases[value] then return aliases[value] elseif isSet(value) then return value elseif default then return default else return nil end end -- Main function claim --------------------------------------------- -- on debug console use: =p.claim{item="Q...", property="P...", ...} function p.claim(frame) local args = frame.args or frame -- via invoke or require local pargs = frame.args and frame:getParent().args or {} local is_sandbox = isSet(pargs.sandbox) if not required and is_sandbox then return require(wiki.module_title .. "/" .. mw.message.new('Sandboxlink-subpage-name'):inLanguage(wiki.langcode):plain()).claim(frame) end --If a value is already set, use it if isSet(args.value) then if args.value == 'NONE' then return else return args.value end end -- arguments local parameters = {} parameters.id = getEntityId(args, pargs) if parameters.id == nil then return end parameters.property = string.upper(args.property or "") local qualifierId = {} qualifierId[1] = getArg(string.upper(args.qualifier or args.qualifier1 or "")) local i = 2 while isSet(args["qualifier" .. i]) do qualifierId[i] = string.upper(args["qualifier" .. i]) i = i + 1 end parameters.formatting = getArg(args.formatting) parameters.convert = getArg(args.convert) parameters.numformat = getArg(args.numformat) parameters.case = args.case parameters.list = getArg(args.list, true, {firstrank='bestrank'}) parameters.listmax = args.listmax parameters.listrank = getArg(args.listrank) if type(parameters.list) == "number" then -- backwards compatibility parameters.listmax = parameters.listmax or parameters.list parameters.list = true elseif parameters.list == "bestrank" then parameters.listrank = parameters.listrank or "bestrank" parameters.list = true end parameters.shownovalue = getArg(args.shownovalue, true) parameters.showsomevalue = getArg(args.showsomevalue, true) parameters.separator = getArg(args.separator) parameters.conjunction = getArg(args.conjunction, parameters.separator) parameters.qseparator = getArg(args.qseparator, parameters.separator) parameters.qconjunction = getArg(args.qconjunction, parameters.conjunction) local sorting_col = args.tablesort local sorting_up = (args.sorting or "") ~= "-1" local rowformat = args.rowformat parameters.references = getArg(args.references, false) parameters.onlysourced = getArg(args.onlysourced, false) local showerrors = args.showerrors local default = args.default if default then showerrors = nil end parameters.lang = findLang(args.lang) if parameters.formatting == "raw" then parameters.editicon, parameters.labelicon = false, false else parameters.editicon, parameters.labelicon = setIcons(args.editicon, pargs.editicon) -- needs loadI18n by findLand end -- fetch property local claims = {} local bestrank = parameters.listrank == 'bestrank' and parameters.list ~= 'lang' for p in string.gmatch(parameters.property, 'P[%d/P]+') do -- P123 or P45/P67 if string.find(p, ".+/.+") then local props = mw.text.split(p, "/") local claims_child claims_child = getStatements(parameters.id, props[1], bestrank) if #claims_child > 0 then local parent_id, _, _ = getValueOfClaim(claims_child[1], nil, {["formatting"]="raw", ["lang"]=parameters.lang}) if string.sub(parent_id or '', 1, 1) == "Q" then claims = getStatements(parent_id, props[2], bestrank) if #claims > 0 then parameters.property = props[1] break end end end else claims = getStatements(parameters.id, p, bestrank) if #claims > 0 then parameters.property = p break end end end if #claims == 0 then local ret = showerrors and printError("property-not-found") or default if required or args.query then -- Scribunto may fail returning "nil, ''" (phab:T439809) return ret, args.query == 'num' and 0 or '' end return ret or '' end -- defaults for table local preformat, postformat = "", "" local whitelisted = false local whitelist, blacklist, ignorevalue, selectvalue = {}, {}, {}, {} if parameters.formatting == "table" then parameters.separator = parameters.separator or "<br />" parameters.conjunction = parameters.conjunction or "<br />" parameters.qseparator = getArg(args.qseparator, mw.message.new('Comma-separator'):inLanguage(parameters.lang[1]):plain()) parameters.qconjunction = getArg(args.qconjunction, parameters.qseparator) if not rowformat then rowformat = "$0 ($1" i = 2 while qualifierId[i] do rowformat = rowformat .. ", $" .. i i = i + 1 end rowformat = rowformat .. ")" elseif mw.ustring.find(rowformat, "^[*#]") then parameters.separator = "</li><li>" parameters.conjunction = "</li><li>" if mw.ustring.match(rowformat, "^[*#]") == "*" then preformat = "<ul><li>" postformat = "</li></ul>" else preformat = "<ol><li>" postformat = "</li></ol>" end rowformat = mw.ustring.gsub(rowformat, "^[*#] ?", "") end -- set lists of filtered values whitelist, blacklist, ignorevalue, selectvalue = setFilterLists(#qualifierId, args) local next = next if next(whitelist) ~= nil then whitelisted = true end end -- set feminine case if gender is requested local itemgender = args.itemgender local idgender if itemgender then if string.match(itemgender, "^P%d+$") then local snak_id = getSnak(mw.wikibase.getBestStatements(parameters.id, itemgender), {1, "mainsnak", "datavalue", "value", "id"}) if snak_id then idgender = snak_id end elseif string.match(itemgender, "^Q%d+$") then idgender = itemgender end end local gender_requested = false if parameters.case == "gender" or idgender then gender_requested = true elseif parameters.formatting == "table" then for i=0, #qualifierId do if args["case" .. i] and args["case" .. i] == "gender" then gender_requested = true break end end end if gender_requested then if feminineGender(idgender or parameters.id) then parameters.gender = "feminineform" end end -- get initial sort indices local sortindices = {} for idx in pairs(claims) do sortindices[#sortindices + 1] = idx end -- sort by claim rank local comparator = function(a, b) local rankmap = { deprecated = 2, normal = 1, preferred = 0 } local ranka = rankmap[claims[a].rank or "normal"] .. string.format("%08d", a) local rankb = rankmap[claims[b].rank or "normal"] .. string.format("%08d", b) return ranka < rankb end table.sort(sortindices, comparator) local result, result2, result_query local error if parameters.list or parameters.formatting == "table" then -- convert LF to line feed, <br /> may not work on some cases parameters.separator = parameters.separator == "LF" and "\010" or parameters.separator parameters.conjunction = parameters.conjunction == "LF" and "\010" or parameters.conjunction -- i18n separators parameters.separator = parameters.separator or mw.message.new('Comma-separator'):inLanguage(parameters.lang[1]):plain() parameters.conjunction = parameters.conjunction or (mw.message.new('And'):inLanguage(parameters.lang[1]):plain() .. mw.message.new('Word-separator'):inLanguage(parameters.lang[1]):plain()) -- iterate over all elements and return their value (if existing) local value local sortkey local values = {} local sortkeys = {} local refs = {} local rowlist = {} -- rows to list with whitelist or blacklist for idx in pairs(claims) do local claim = claims[sortindices[idx]] local reference = {} if not whitelisted then rowlist[idx] = true end if parameters.formatting == "table" then local params = tableParameters(args, parameters, "0") value, sortkey, error = getValueOfClaim(claim, nil, params) if value then values[#values + 1] = {} sortkeys[#sortkeys + 1] = {} refs[#refs + 1] = {} if whitelist["0"] or blacklist["0"] then local valueraw, _, _ = getValueOfClaim(claim, nil, {["formatting"]="raw", ["lang"]=params.lang}) if whitelist["0"] and whitelist["0"][valueraw or ""] then rowlist[#values] = true elseif blacklist["0"] and blacklist["0"][valueraw or ""] then rowlist[#values] = false end end for i, qual in ipairs(qualifierId) do local j = tostring(i) params = tableParameters(args, parameters, j) local valueq, sortkeyq, valueraw if qual == parameters.property then -- hack for getting the property with another formatting, i.e. colformat1=raw valueq, sortkeyq, _ = getValueOfClaim(claim, nil, params) else for q in mw.text.gsplit(qual, '%s*OR%s*') do if string.find(q, ".+/.+") then valueq, sortkeyq, valueraw = getValueOfParentClaim(claim, q, params) elseif string.find(q, "^/.+") then local claim2 = getStatements(parameters.id, string.sub(q, 2), bestrank) if #claim2 > 0 then -- only first value of a property as alternative to a qualifier -- multiple values may not be related to a given raw of the table valueq, sortkeyq, _ = getValueOfClaim(claim2[1], nil, params) end else valueq, sortkeyq, _ = getValueOfClaim(claim, q, params) end if valueq then qual = q break end end end values[#values]["col" .. j] = valueq sortkeys[#sortkeys]["col" .. j] = sortkeyq or valueq if whitelist[j] or blacklist[j] or ignorevalue[j] or selectvalue[j] then valueq = valueraw or getValueOfClaim(claim, qual, {["formatting"]="raw", ["lang"]=params.lang, ["list"]=params.list}) if valueq then if whitelist[j] then for k, v in pairs(whitelist[j]) do if v and string.find(valueq, k, 1, true) then rowlist[#values] = true end end elseif blacklist[j] then for k, v in pairs(blacklist[j]) do if v and string.find(valueq, k, 1, true) then rowlist[#values] = false end end elseif ignorevalue[j] then for k, v in pairs(ignorevalue[j]) do if v and string.find(valueq, k, 1, true) then values[#values]["col" .. j] = nil end end elseif selectvalue[j] then local selected for k, v in pairs(selectvalue[j]) do if v and string.find(valueq, k, 1, true) then selected = true end end if selected == nil then values[#values]["col" .. j] = nil end end end end end end else value, sortkey, error = getValueOfClaim(claim, qualifierId[1], parameters) values[#values + 1] = {} sortkeys[#sortkeys + 1] = {} refs[#refs + 1] = {} end if not value and showerrors then value = error end if value then if (parameters.references or parameters.onlysourced) and claim.references then reference = claim.references end refs[#refs]["col0"] = reference values[#values]["col0"] = value sortkeys[#sortkeys]["col0"] = sortkey or value end end -- sort and format results sortindices = {} for idx in pairs(values) do sortindices[#sortindices + 1] = idx end if sorting_col then local sorting_table = mw.text.split(sorting_col, '%D+') local comparator = function(a, b) local valuea, valueb local i = 1 while valuea == valueb and i <= #sorting_table do valuea = sortkeys[a]["col" .. sorting_table[i]] or '' valueb = sortkeys[b]["col" .. sorting_table[i]] or '' i = i + 1 end if sorting_up then return valueb > valuea end return valueb < valuea end table.sort(sortindices, comparator) end local maxvals = tonumber(parameters.listmax) result = {} for idx in pairs(values) do local valuerow = values[sortindices[idx]] local reference, valid_ref = getReferences({["references"] = refs[sortindices[idx]]["col0"]}, parameters) value = valuerow["col0"] if parameters.formatting == "table" then if not rowlist[sortindices[idx]] then value = nil else local rowformatting = rowformat .. "$" -- fake end character added for easy gsub value = mw.ustring.gsub(rowformatting, "$0", {["$0"] = value}) value = mw.ustring.gsub(value, "$R0", reference) -- add reference for i, _ in ipairs(qualifierId) do local valueq = valuerow["col" .. i] if args["rowsubformat" .. i] and isSet(valueq) then -- add fake end character $ -- gsub $i not followed by a number so $1 doesn't match $10, $11... -- remove fake end character valueq = captureEscapes(valueq) valueq = mw.ustring.gsub(args["rowsubformat" .. i] .. "$", "$" .. i .. "(%D)", valueq .. "%1") valueq = string.sub(valueq, 1, -2) rowformatting = mw.ustring.gsub(rowformatting, "$" .. i .. "(%D)", args["rowsubformat" .. i] .. "%1") end valueq = valueq and captureEscapes(valueq) or '' value = mw.ustring.gsub(value, "$" .. i .. "(%D)", valueq .. "%1") end value = string.sub(value, 1, -2) -- remove fake end character value = expandBraces(value, rowformatting) end elseif value then value = expandBraces(value, parameters.formatting) value = value .. reference end if isSet(value) and (not parameters.onlysourced or (parameters.onlysourced and valid_ref)) then result[#result + 1] = value if not parameters.list or (maxvals and maxvals == #result) then break end end end if args.query == 'num' then result_query = #result end if #result > 0 then if parameters.formatting == 'table' then result = addEditIconTable(result, parameters) -- in a table, add edit icon on last element end result = preformat .. mw.text.listToText(result, parameters.separator, parameters.conjunction) .. postformat else result = '' end else -- return first element local claim = claims[sortindices[1]] result, result2, error = getValueOfClaim(claim, qualifierId[1], parameters) if result then local ref, valid_ref = getReferences(claim, parameters) if parameters.onlysourced and valid_ref == false then result = nil else result = result .. ref end end if args.query == 'num' then result_query = result and 1 or 0 end end if isSet(result) then if not (parameters.formatting == 'table' or (result2 and result2 == 'no-icon')) then -- add edit icon, except table added previously and except explicit no-icon internal flag result = result .. addEditIcon(parameters) end else if showerrors then result = error else result = default end end if args.query == 'untranslated' and required and not is_sandbox then result_query = untranslated end if required or args.query then -- Scribunto may fail returning "nil, ''" (phab:T439809) return result, result_query or '' end return result or '' end -- Local functions for getParentValues ----------------------- local function uc_first(word) if word == nil then return end return mw.ustring.upper(mw.ustring.sub(word, 1, 1)) .. mw.ustring.sub(word, 2) end local function getPropertyValue(id, property, parameter, langs, labelicon, case) local snaks = mw.wikibase.getBestStatements(id, property) local mysnak = getSnak(snaks, {1, "mainsnak"}) if mysnak == nil then return end local entity_id local result = '-' -- default for 'no value' if mysnak.datavalue then entity_id = "Q" .. tostring(mysnak.datavalue.value['numeric-id']) result, _ = getSnakValue(mysnak, {formatting=parameter, lang=langs, labelicon=labelicon, case=case}) end return entity_id, result end local function getParentObjects(id, prop_format, label_format, languages, propertySupString, propertyLabel, propertyLink, label_show, labelicon0, labelicon1, upto_number, upto_label, upto_value, last_only, grammatical_case, include_self) local propertySups = mw.text.split(propertySupString, '[^P%d]') local maxloop = 10 if upto_number then maxloop = upto_number elseif next(upto_label) or next(upto_value) then maxloop = 50 end local labels_filter = next(label_show) local result = {} local id_value = id for iter = 1, maxloop do local link, label, labelwicon, linktext, id_label for _, propertySup in pairs(propertySups) do local _id_value, _link = getPropertyValue(id_value, propertySup, prop_format, languages, labelicon1, grammatical_case) if _id_value and _link then id_value = _id_value; link = _link break end end if not id_value or not link then break end if propertyLink then _, linktext = getPropertyValue(id_value, propertyLink, "label", languages) if linktext then link = mw.ustring.gsub(link, "%[%[(.*)%|.+%]%]", "[[%1|" .. linktext .. "]]") end end id_label, label = getPropertyValue(id_value, propertyLabel, label_format, languages, false, "infoboxlabel") if labelicon0 then _, labelwicon = getPropertyValue(id_value, propertyLabel, label_format, languages, labelicon0, "infoboxlabel") else labelwicon = label end if labels_filter == nil or (label_show[id_label] or label_show[label]) then result[#result + 1] = {labelwicon, link} label_show[id_label or 'none'], label_show[label or 'none'] = nil, nil -- only first label found end if upto_label[id_label] or upto_label[label] or upto_value[id_value] then break end end if last_only then result = {result[#result]} end if include_self then local label_self, link_self _, label_self = getPropertyValue(id, propertyLabel, label_format, languages, labelicon0, "infoboxlabel") link_self, _ = getLabelByLangs(id, languages) table.insert(result, 1, {label_self, link_self}) end return result end local function parentObjectsToString(result, rowformat, cascade, sorting) local ret = {} local first = 1 local last = #result local iter = 1 if sorting == "-1" then first = #result; last = 1; iter = -1 end for i = first, last, iter do local rowtext = mw.ustring.gsub(rowformat, "$[01]", {["$0"] = result[i][1], ["$1"] = result[i][2]}) ret[#ret + 1] = expandBraces(rowtext, rowformat) end if cascade then local direction = mw.language.new(wiki.langcode):isRTL() and "right" or "left" local suffix = "" for i = 1, #ret do ret[i] = '<ul style="line-height:100%; margin-' .. direction .. ':0.45em; padding-' .. direction .. ':0;"><li>' .. ret[i] suffix = suffix .. '</li></ul>' end ret[#ret] = ret[#ret] .. suffix end return ret end -- Returns pairs of parent label and property value fetching a recursive tree function p.getParentValues(frame) local args = frame.args or frame -- via invoke or require local pargs = frame.args and frame:getParent().args or {} if not required and isSet(pargs.sandbox) then return require(wiki.module_title .. "/" .. mw.message.new('Sandboxlink-subpage-name'):inLanguage(wiki.langcode):plain()).getParentValues(frame) end local id = getEntityId(args, pargs) if id == nil then return end local languages = findLang(args.lang) local propertySup = getArg(args.property, "P131") --administrative entity local propertyLabel = getArg(args.label, "P31") --instance local propertyLink = getArg(args.valuetext) local property_format = getArg(args.formatting) local label_format = getArg(args.labelformat, "label") local upto_number = getArg(args.upto) local last_only = getArg(args.last_only, false) local editicon, labelicon = setIcons(args.editicon, pargs.editicon) local include_self = getArg(args.include_self, false) local case = getArg(args.case) local upto_label = {} for q in string.gmatch(args.uptolabelid or '', 'Q%d+') do upto_label[q] = true end if type(tonumber(upto_number)) == "number" then upto_number = tonumber(upto_number) elseif type(upto_number) == 'string' then upto_number = nil require(wiki.module_title .. '/debug').track('upto') -- replace upto by uptolabelid end local upto_value = {} for q in string.gmatch(args.uptovalueid or args.uptolinkid or '', 'Q%d+') do upto_value[q] = true end local label_show = {} for q in string.gmatch(args.showlabelid or '', 'Q%d+') do label_show[q] = true end for _, v in ipairs(mw.text.split(args.labelshow or '', "/")) do if v ~= '' then label_show[uc_first(v)] = true require(wiki.module_title .. '/debug').track('labelshow') -- replace labelshow by showlabelid end end local rowformat = args.rowformat; if not isSet(rowformat) then rowformat = "$0 = $1" end local labelicon0, labelicon1 = labelicon, labelicon if string.find(label_format, '{{.*$0.*}}') or (string.find(rowformat, '{{.*$0.*}}') and label_format ~= 'raw') then labelicon0 = false end local result = getParentObjects(id, property_format, label_format, languages, propertySup, propertyLabel, propertyLink, label_show, labelicon0, labelicon1, upto_number, upto_label, upto_value, last_only, case, include_self) if #result == 0 then return end local separator = args.separator; if not isSet(separator) then separator = "<br />" end local sorting = args.sorting; if sorting == "" then sorting = nil end local cascade = (args.cascade == "true" or args.cascade == "yes") local ret = parentObjectsToString(result, rowformat, cascade, sorting) ret = addEditIconTable(ret, {property=propertySup, editicon=editicon, id=id, lang=languages}) return mw.text.listToText(ret, separator, separator) end -- Link with a parent label -------------------- function p.linkWithParentLabel(frame) local pargs = frame.args and frame:getParent().args or {} if not required and isSet(pargs.sandbox) then return require(wiki.module_title .. "/" .. mw.message.new('Sandboxlink-subpage-name'):inLanguage(wiki.langcode):plain()).linkWithParentLabel(frame) end local args = {} if frame.args then for k, v in pairs(frame.args) do -- metatable args[k] = v end else args = frame -- via require end if isSet(args.value) then return args.value end -- get id value of property/qualifier local largs = mw.clone(args) largs.list = tonumber(args.list) and args.list or true largs.formatting = "raw" largs.separator = "/·/" largs.editicon = false local items_list, _ = p.claim(largs) if not isSet(items_list) then return end local items_table = mw.text.split(items_list, "/·/", true) -- get internal link of property/qualifier if isSet(args.formatting) then largs.formatting = nil -- default link if defined with any value else largs.formatting = "internallink" end local link_list, _ = p.claim(largs) local link_table = mw.text.split(link_list, "/·/", true) -- get label of parent property local parent_claim = getSnak(getStatements(items_table[1], args.parent, true), {1, "mainsnak", "datatype"}) if parent_claim == 'monolingualtext' then largs.formatting = nil largs.list = 'lang' else largs.formatting = "label" largs.list = false end largs.property = args.parent largs.qualifier = nil for i, v in ipairs(items_table) do largs.item = v local link_label, _ = p.claim(largs) if isSet(link_label) then link_table[i] = mw.ustring.gsub(link_table[i] or '', "%[%[(.*)%|.+%]%]", "[[%1|" .. link_label .. "]]") end end args.editicon, _ = setIcons(args.editicon, pargs.editicon) args.id = getEntityId(args, pargs) args.lang = findLang(args.lang) return mw.text.listToText(link_table) .. addEditIcon(args) end -- Calculate number of years old ---------------------------- function p.yearsOld(frame) if not required and frame.args and isSet(frame:getParent().args.sandbox) then return require(wiki.module_title .. "/" .. mw.message.new('Sandboxlink-subpage-name'):inLanguage(wiki.langcode):plain()).yearsOld(frame) end local args = frame.args or frame -- via invoke or require local pargs = frame.args and frame:getParent().args or {} local id = getEntityId(args, pargs) if id == nil then return end local lang = mw.language.new('en') local function getBestDate(id, prop) local mainsnak = getSnak(mw.wikibase.getBestStatements(id, prop), {1, "mainsnak"}) if mainsnak and mainsnak.snaktype then if mainsnak.snaktype == "somevalue" then return {time = nil, precision = 0} elseif mainsnak.snaktype == "value" then return getSnak(mainsnak, {"datavalue", "value"}) end end return {time = nil, precision = nil} end local birth = getBestDate(id, 'P569') if birth.time == nil or birth.precision < 8 then return end local death = getBestDate(id, 'P570') if death.precision and death.precision < 8 then -- includes somevalue return elseif death.time == nil then death = {time = lang:formatDate('c'), precision = 11} -- current date end local dates = {} dates[1] = {['min'] = {}, ['max'] = {}, ['precision'] = birth.precision} dates[1].min.year = tonumber(mw.ustring.match(birth.time, "^[+-]?%d+")) dates[1].min.month = tonumber(mw.ustring.match(birth.time, "-(%d%d)-")) dates[1].min.day = tonumber(mw.ustring.match(birth.time, "-(%d%d)T")) dates[1].max = mw.clone(dates[1].min) dates[2] = {['min'] = {}, ['max'] = {}, ['precision'] = death.precision} dates[2].min.year = tonumber(mw.ustring.match(death.time, "^[+-]?%d+")) dates[2].min.month = tonumber(mw.ustring.match(death.time, "-(%d%d)-")) dates[2].min.day = tonumber(mw.ustring.match(death.time, "-(%d%d)T")) dates[2].max = mw.clone(dates[2].min) for i, d in ipairs(dates) do if d.precision == 10 then -- month d.min.day = 1 local timestamp = string.format("%04d", tostring(math.abs(d.max.year))) .. string.format("%02d", tostring(d.max.month)) .. "01" d.max.day = tonumber(lang:formatDate("j", timestamp .. " + 1 month - 1 day")) elseif d.precision < 10 then -- year or decade d.min.day = 1 d.min.month = 1 d.max.day = 31 d.max.month = 12 if d.precision == 8 then -- decade d.max.year = d.max.year + 9 end end end local function age(d1, d2) local years = d2.year - d1.year if d2.month < d1.month or (d2.month == d1.month and d2.day < d1.day) then years = years - 1 end if d2.year > 0 and d1.year < 0 then years = years - 1 -- no year 0 end return years end local old_min = age(dates[1].max, dates[2].min) local old_max = age(dates[1].min, dates[2].max) if old_max > 200 then require(wiki.module_title .. '/debug').track('200yo') end local old, old_expr if old_min == 0 and old_max == 0 then old = "< 1" old_max = 1 -- expression in singular elseif old_min == old_max then old = old_min else old = old_min .. "/" .. old_max end if args.formatting == 'unit' then local langs = findLang(args.lang) local yo local yo_pl = {} if langs[1] == wiki.langcode then yo_pl = i18n["years-old"] end if not isSet(yo_pl[2]) then local yo_label, _ = getLabelByLangs('Q24564698', langs) yo_pl = {yo_label, yo_label} end yo = mw.language.new(langs[1]):plural(old_max, yo_pl) if mw.ustring.find(yo, '$1', 1, true) then old_expr = mw.ustring.gsub(yo, "$1", old) else old_expr = old .. '&nbsp;' .. yo end elseif args.formatting then old_expr = expandBraces(mw.ustring.gsub(args.formatting, '$1', old), args.formatting) else old_expr = old end return old_expr end -- Gets a label in a given language (content language by default) or its fallbacks, optionnally linked. function p.getLabel(frame) local args = frame.args or frame -- via invoke or require local pargs = frame.args and frame:getParent().args or {} if not required and isSet(pargs.sandbox) then return require(wiki.module_title .. "/" .. mw.message.new('Sandboxlink-subpage-name'):inLanguage(wiki.langcode):plain()).getLabel(frame) end local id = getEntityId(args, pargs, 1) if id == nil then return end local languages = findLang(args.lang) local labelicon = false if mw.wikibase.isValidEntityId(id) then _, labelicon = setIcons(args.editicon, pargs.editicon) end local label_icon = '' local label, lang if args.label then label = args.label else -- exceptions or labels fixed local exist, labels = pcall(require, wiki.module_title .. "/labels" .. (languages[1] == wiki.langcode and '' or '/' .. languages[1])) if exist and labels.infoboxLabelsFromId and next(labels.infoboxLabelsFromId) ~= nil then label = labels.infoboxLabelsFromId[id] end if label == nil then label, lang = getLabelByLangs(id, languages) if label then if isSet(args.itemgender) then if feminineGender(args.itemgender) then label = feminineForm(id, lang) or label end local _, items_g = string.gsub(args.itemgender, "Q%d+", "") if not isSet(args.case) and items_g > 1 then args.case = "plural" end end label = mw.language.new(lang):ucfirst(mw.text.nowiki(label)) -- sanitize if args.case then label = case(args.case, label, lang) end end label_icon = addLabelIcon(id, lang, languages[1], labelicon) end end local linked = args.linked local ret2 = required and untranslated or '' if isSet(linked) and linked ~= "no" then local article = mw.wikibase.getSitelink(id) or ("d:Special:EntityPage/" .. id) return "[[" .. article .. "|" .. (label or id) .. "]]" .. label_icon, ret2 else return (label or id) .. label_icon, ret2 end end function p.sitelinks(frame) local args = frame.args or frame -- via invoke or require local pargs = frame.args and frame:getParent().args or {} -- arguments local param = {} param.id = getEntityId(args, pargs) if param.id == nil then return end param.project = getArg(args.project) param.site = getArg(args.site) param.sitelang = getArg(args.sitelang) param.show = getArg(args.formatting, '[[$w:$l:$t|$s:$t]] $i') param.sep = getArg(args.separator, ', ') -- fetch sitelinks local sitelinks_obj = mw.wikibase.getEntity(param.id).sitelinks local slinks = {} -- do some clean up (commonswiki > commons) and add some data local iw = {['wikipedia'] = 'w', ['wikibooks'] = 'b', ['wikinews'] = 'n', ['wikiquote'] = 'q', ['wikisource'] = 's', ['wikiversity'] = 'v', ['wikivoyage'] = 'voy', ['wiktionary'] = 'wikt', ['commons'] = 'c', ['meta'] = 'm', ['mediawiki'] = 'mw', ['species'] = 'species', ['wikidata'] = 'd', ['wikifunctions'] = 'f'} for slink, sdata in pairs(sitelinks_obj) do -- langcode + wiki, wikibooks, wikinews, wikiquote, wikisource, wikiversity, wikivoyage, wiktionary local s_lang = string.match(slink, '(%l+)wik[it]') local s_project = string.match(slink, 'wik[it]%l*') if slink == 'commonswiki' or slink == 'metawiki' or slink == 'mediawikiwiki' or slink == 'specieswiki' or slink == 'wikidatawiki' or slink == 'wikifunctionswiki' then s_project = string.sub(slink, 1, -5) -- remove -wiki slinks[s_project] = {['lang'] = 'und', ['project'] = s_project, ['iw'] = iw[s_project], ['title'] = sdata.title, ['badges'] = sdata.badges} elseif s_project == 'wiki' then -- restore project full name slinks[slink] = {['lang'] = s_lang, ['project'] = 'wikipedia', ['iw'] = 'w', ['title'] = sdata.title, ['badges'] = sdata.badges} elseif s_project == 'wiktionary' then -- use short site name s_project = string.sub(slink, 1, -7) slinks[s_project] = {['lang'] = s_lang, ['project'] = 'wiktionary', ['iw'] = 'wikt', ['title'] = sdata.title, ['badges'] = sdata.badges} else slinks[slink] = {['lang'] = s_lang, ['project'] = s_project, ['iw'] = iw[s_project], ['title'] = sdata.title, ['badges'] = sdata.badges} end end -- select requested project, site, sitelang local slinks_req = {} if not (param.project or param.site or param.sitelang) then slinks_req = slinks else for pr in string.gmatch(param.project or '', '%l+') do -- lowercase letters, skip separators for sl, sd in pairs(slinks) do if sd.project == pr then slinks_req[sl] = sd end end end for s in string.gmatch(param.site or '', '%l+') do for sl, sd in pairs(slinks) do if sl == s then slinks_req[sl] = sd end end end for l in string.gmatch(param.sitelang or '', '%l+') do for sl, sd in pairs(slinks) do if sd.lang == l then slinks_req[sl] = sd end end end end -- sort table local sites_sorted = {} for sitex in pairs(slinks_req) do sites_sorted[#sites_sorted + 1] = sitex end local sort_project_lang = function(a, b) local key_a = slinks_req[a].project .. slinks_req[a].lang local key_b = slinks_req[b].project .. slinks_req[b].lang return key_a < key_b end table.sort(sites_sorted, sort_project_lang) -- format output local showtext = {} local shownum, showbnum = 0, 0 for _, sl in ipairs(sites_sorted) do local sd = slinks_req[sl] local show = param.show -- default '[[$w:$l:$t|$s:$t]] $i' iw:lang:title, site:title icon, also $p project show = string.gsub(show, '$w', sd.iw) show = string.gsub(show, '$p', sd.project) if sd.lang == 'und' then show = string.gsub(show, '$l:?', '') else show = string.gsub(show, '$l', sd.lang) end show = string.gsub(show, '$t', sd.title) show = string.gsub(show, '$s', sl) if next(sd.badges) then show = string.gsub(show, '$i', '[[File:Article de qualité.svg|15x15px]]') showbnum = showbnum + 1 else show = string.gsub(show, ' ?$i', '') end if show ~= param.show then table.insert(showtext, show) end shownum = shownum + 1 end local output if string.find(param.show, '$[nb]') then output = string.gsub(param.show, '$n', shownum) -- number of sites output = string.gsub(output, '$b', showbnum) -- number of badges else output = table.concat(showtext, param.sep) end return output end -- Utilities ----------------------------- -- See also module ../debug. -- Copied from Module:Wikibase function p.getSiteLink(frame) local args = frame.args or frame -- via invoke or require local pargs = frame.args and frame:getParent().args or {} local id = getEntityId(args, pargs, 1) if id == nil then return end return mw.wikibase.getSitelink(id, mw.text.trim(args[2] or '')) end -- Helper function for the default language code used function p.lang(frame) local lang = frame and frame.args[1] -- nil via require return findLang(lang)[1] end -- Number of statements function p.numStatements(frame) local args = frame.args or frame -- via invoke or require local pargs = frame.args and frame:getParent().args or {} local id = getEntityId(args, pargs) if id == nil then return 0 end local prop = mw.text.trim(args[1] or '') local num = {} if not isSet(prop) then -- named parameters local largs = {} for k, v in pairs(pargs) do largs[k] = v end for k, v in pairs(args) do largs[k] = v end largs.query = 'num' _, num = p.claim(largs) return num elseif args[2] then -- qualifier local qual = mw.text.trim(args[2]) local values = p.claim{item=id, property=prop, qualifier=qual, formatting='raw', separator='/·/'} if values then num = mw.text.split(values, '/·/') end else -- property num = mw.wikibase.getBestStatements(id, prop) end return #num end -- Returns true if property datavalue is found excluding novalue/somevalue function p.validProperty(frame) local args = frame.args or frame -- via invoke or require local pargs = frame.args and frame:getParent().args or {} local item = getEntityId(args, pargs) if item == nil then return end local property = mw.text.trim(args[1]) local prop_data = getSnak(mw.wikibase.getBestStatements(item, property), {1, "mainsnak", "datavalue"}) return prop_data and true or nil end function p.editAtWikidata(frame) local args = frame.args or frame -- via invoke or require local pargs = frame.args and frame:getParent().args or {} local value = isSet(args[1]) if value then return end local param = {} param.id = getEntityId(args, pargs) param.property = args.property param.lang = findLang(args.lang) param.editicon, _ = setIcons(args.editicon) return addEditIcon(param) end function p.formatNum(frame) local num = tonumber(mw.text.trim(frame.args[1])) local lang = findLang(mw.text.trim(frame.args[2])) return mw.language.new(lang[1]):formatNum(num) end return p 2v5c78muheudanp0kusx3dat611suku پگوئان‌ئون 0 46723 416622 189862 2026-10-13T16:46:19Z محک 1023 416622 wikitext text/x-wiki {{صندخ/نژاد}} '''پگوئان‌ئون''' یا '''مون مردمئون''' مردومی هسنه گا برمه ، [[تایلند]] دله زیوش کندنه و پگوئان زوون جا گپ زندنه == ممبعئون == * اینگیلیسی ویکیپیدیا [[رج:تایلند]] gv1w8ldslphgy84fdkle7a1vqghjgxh اوبیدوس 0 107873 416618 314625 2026-10-13T16:45:22Z محک 1023 کارور محک، [[وبیدوس]] ِصفحه ره دَکشی‌یه [[اوبیدوس]] دله 314625 wikitext text/x-wiki {{صندخ/شهرستان}} '''وبیدوس''' ({{langx|pt|Óbidos}}) اتا [[برزیل]] ره [[شهر]] هسته که [[پارا]] منطقه شٮنه. وبیدوس [[گتی]] ۲۸۰۲۱٫۲۸۷ ک‌م<sup>۲</sup> هسته و ونه جمیعت ۵۲۲۲۹ نفر هسته. == منابع == * {{وب منبع|عنوان = Óbidos |لینک= https://www.wikidata.org/wiki/Q577167 |زوون = چن زوونه | بازیابی = ۲۱ مه ۲۰۲۵ |ناشر= [[ویکی‌دیتا]]}} <!-- * {{ویکی منبع|عنوان = {{{اصل}}} |لینک= https://{{{زک}}}.wikipedia.org/wiki/{{{اصل}}} |زوون = {{{زک}}} | بازیابی = ۲۱ مه ۲۰۲۵ }} --> {{په‌نویس}} <!-- رج: --> [[رج:پارا شهرون]] tr8qwjzizeow6s9pgc37twensg2o43i اویاپوکو 0 108492 416623 317548 2026-10-13T16:46:43Z محک 1023 کارور محک، [[ویاپوکو]] ِصفحه ره دَکشی‌یه [[اویاپوکو]] دله 317548 wikitext text/x-wiki {{صندخ/شهرستان}} '''ویاپوکو''' ({{langx|pt|Oiapoque}}) اتا [[برزیل]] ره [[شهر]] هسته که [[آماپا]] منطقه شٮنه. ویاپوکو [[گتی]] ۲۲۶۲۵٫۰۱۸ ک‌م<sup>۲</sup> هسته و ونه جمیعت ۲۷۴۸۲ نفر هسته. == منابع == * {{وب منبع|عنوان = Oiapoque |لینک= https://www.wikidata.org/wiki/Q906717 |زوون = چن زوونه | بازیابی = ۲۱ مه ۲۰۲۵ |ناشر= [[ویکی‌دیتا]]}} <!-- * {{ویکی منبع|عنوان = {{{اصل}}} |لینک= https://{{{زک}}}.wikipedia.org/wiki/{{{اصل}}} |زوون = {{{زک}}} | بازیابی = ۲۱ مه ۲۰۲۵ }} --> {{په‌نویس}} <!-- رج: --> [[رج:آماپا شهرون]] eqen299bum6yb26wr0nrorn6sqnkciu شابلون:صندخ/اتفاق 10 112695 416616 319661 2026-10-13T16:01:11Z محک 1023 416616 wikitext text/x-wiki {{Infobox event | item = {{{item|}}} | lang = {{{lang|}}} | v_cllps_judiciary = {{{v_cllps_judiciary|{{{desplega_judicial|}}}}}} | v_cllps_award = {{{v_cllps_award|{{{desplega_premis|}}}}}} | v_cllps_participant = {{{v_cllps_participant|{{{desplega_participants|}}}}}} | v_cllps_signatory = {{{v_cllps_signatory|{{{desplega_signataris|}}}}}} | v_cllps_ratified = {{{v_cllps_ratified|{{{desplega_ratificacio|}}}}}} | v_cllps_haspart = {{{v_cllps_haspart|}}} | v_icon = {{{v_icon|{{{icona|}}}}}} | v_name = {{{v_name|{{{nom|{{{esdeveniment|}}}}}}}}} | v_p154 = {{{v_p154|{{{v_p2425|{{{v_logo|{{{logo|{{{escut|}}}}}}}}}}}}}}} | v_p18 = {{{v_p18|{{{v_p6802|{{{v_image|{{{imatge|}}}}}}}}}}}} | v_p18_caption = {{{v_p18_caption|{{{v_image_caption|{{{peu|}}}}}}}}} | v_p8592= {{{v_p8592|}}} | v_p1801= {{{v_p1801|}}} | v_p2716= {{{v_p2716|}}} | v_p3451= {{{v_p3451|}}} | v_image_map = {{{v_image_map|{{{imatge_mapa|{{{mapa|}}}}}}}}}<!-- mapa, per conflicte militar: eliminar post-integració --> | v_caption_map = {{{v_caption_map|{{{peu_mapa|}}}}}} | nocateg_coord= {{{nocateg_coord|NONE}}}<!-- coordenades no obligatòries en aquesta infotaula. Indicat amb NONE --> | v_basic_maps= {{{v_basic_maps|}}} | v_p131= {{{v_p131|{{{localitat|}}}}}} | v_switched_images= {{{v_switched_images|}}} | v_draw_map = {{{v_draw_map|{{{draw_mapa|}}}}}} | v_draw_layer = {{{v_draw_layer|{{{draw_layer|}}}}}} | v_coord_display = {{{v_coord_display|{{{coord_display|}}}}}} | v_P625_lat_dec = {{{v_P625_lat_dec|{{{lat_dec|}}}}}} | v_P625_lon_dec = {{{v_P625_lon_dec|{{{lon_dec|}}}}}} | v_p242 = {{{v_p242|{{{v_locator_map|{{{mapa_localitzador|}}}}}}}}} | v_zoom_map = {{{v_zoom_map|{{{zoom|}}}}}} | v_marker = {{{v_marker|{{{marcador|}}}}}} | v_marker_name = {{{v_marker_name|{{{nom_marcador|}}}}}} | v_marker_color = {{{v_marker_color|{{{marcador_color|}}}}}} | v_marker_size = {{{v_marker_size|{{{marcador_mida|}}}}}} | v_size_map = {{{v_size_map|{{{mapa_mida|}}}}}} | v_blacklist_layer = {{{v_blacklist_layer|{{{blacklist_layer|}}}}}} | v_p1705 = {{{v_p1705|{{{v_p1559|{{{v_original_name|{{{nom_original|}}}}}}}}}}}} | v_original_lang = {{{v_original_lang|{{{nom_original_lleng|}}}}}} | v_p1813 = {{{v_p1813|{{{v_short_name|{{{nom_curt|}}}}}}}}} | v_p1449 = {{{v_p1449|{{{v_nickname|{{{altre_nom|{{{alies|}}}}}}}}}}}}<!-- alies, per conflicte militar: eliminar post-integració --> | v_p31 = {{{v_p31|{{{v_type|{{{tipus|}}}}}}}}} | v_p6208 = {{{v_p6208|{{{v_award_rationale|{{{descripcio|}}}}}}}}} | v_p138 = {{{v_p138|{{{v_named_after|{{{anomenat|}}}}}}}}} | v_p571 = {{{v_p571|{{{v_inception|{{{data_creacio|}}}}}}}}} | v_p576 = {{{v_p576|{{{v_dissolved|{{{data_dissolucio|}}}}}}}}} | v_p2894 = {{{v_p2894|{{{v_day|{{{dia|}}}}}}}}} | v_p837 = {{{v_p837|{{{v_peak_day|{{{dia_punta|}}}}}}}}} | v_p585 = {{{v_p585|{{{v_date|{{{data|}}}}}}}}} | v_p580 = {{{v_p580|{{{v_start_time|{{{inici|}}}}}}}}} | v_p582 = {{{v_p582|{{{v_end_time|{{{fi|}}}}}}}}} | v_point_time = {{{v_point_time|{{{hora|}}}}}} | v_start_time = {{{v_start_time|{{{hora_inici|}}}}}} | v_end_time = {{{v_end_time|{{{hora_final|}}}}}} | v_open_time = {{{v_open_time|{{{horari|}}}}}} | v_p467 = {{{v_p467|{{{v_legislated_by|{{{promulgada_per|}}}}}}}}} | v_p7589 = {{{v_p7589|{{{v_date_assent|{{{data_promulgada|}}}}}}}}} | v_date_signature = {{{v_date_signature|{{{data_signatura|}}}}}} | v_p6193 = {{{v_p6193|{{{v_ratified_by|{{{ratificacio|}}}}}}}}} | v_p7588 = {{{v_p7588|{{{v_effective_date|{{{efectivitat|}}}}}}}}} | v_p577 = {{{v_p577|{{{v_publication|{{{publicacio|}}}}}}}}} | v_p2047 = {{{v_p2047|{{{v_duration|{{{durada|}}}}}}}}} | v_p2257 = {{{v_p2257|{{{v_event_interval|{{{frequencia|{{{freq|}}}}}}}}}}}} | v_p2348 = {{{v_p2348|{{{v_time_period|{{{periode|}}}}}}}}} | v_p144 = {{{v_p144|{{{v_based_on|{{{basat_en|}}}}}}}}} | v_p393 = {{{v_p393|{{{v_edition|{{{edicio|}}}}}}}}} | v_p112 = {{{v_p112|{{{v_founded|{{{instaurador|}}}}}}}}} | v_antecedent = {{{v_antecedent|{{{antecedents|}}}}}} | v_p155 = {{{v_p155|{{{v_p1365|{{{v_previous|{{{precedit|}}}}}}}}}}}} | v_p156 = {{{v_p156|{{{v_p1366|{{{v_next|{{{succeit|}}}}}}}}}}}} | v_p2596 = {{{v_p2596|{{{v_culture|{{{cultura|}}}}}}}}} | v_p6375 = {{{v_p6375|{{{v_address|{{{lloc|}}}}}}}}} | v_p706 = {{{v_p706|{{{v_drainage_basin|{{{conca|}}}}}}}}} | v_p17 = {{{v_p17|{{{v_country|{{{estat|}}}}}}}}} | v_p4777 = {{{v_p4777|{{{v_border|{{{frontera|}}}}}}}}} | v_p30 = {{{v_p30|{{{v_continent|{{{continent|}}}}}}}}} | v_p2046 = {{{v_p2046|{{{v_area|{{{superficie|}}}}}}}}} | v_p1451 = {{{v_p1451|{{{v_motto|{{{lema|}}}}}}}}} | v_p3730 = {{{v_p3730|{{{v_higher_rank|{{{rang_sup|}}}}}}}}} | v_p3729 = {{{v_p3729|{{{v_lower_rank|{{{rang_inf|}}}}}}}}} | v_p361 = {{{v_p361|{{{v_part_of|{{{partde|}}}}}}}}} | v_p2121 = {{{v_p2121|{{{v_prize_money|{{{premi|}}}}}}}}} | v_p822 = {{{v_p822|{{{v_mascot|{{{mascota|}}}}}}}}} | v_p921 = {{{v_p921|{{{v_subject|{{{tema|}}}}}}}}} | v_p533 = {{{v_p533|{{{v_p3712|{{{v_target|{{{objectiu|}}}}}}}}}}}} | v_p1478 = {{{v_p1478|{{{v_p828|{{{v_immediate_cause|{{{causa|}}}}}}}}}}}} | v_p1542 = {{{v_p1542|{{{v_p1536|{{{v_effect|{{{consequencia|}}}}}}}}}}}} | v_p2895 = {{{v_p2895|{{{v_wind|{{{vent|}}}}}}}}} | v_p2532 = {{{v_p2532|{{{v_pressure|{{{pressio|}}}}}}}}} | v_action = {{{v_action|{{{accions|}}}}}} | v_conditions = {{{v_conditions|{{{condicio|}}}}}} | v_results = {{{v_results|{{{resultat|}}}}}} | v_p607 = {{{v_p607|{{{v_conflict|{{{conflicte|}}}}}}}}} | v_p407 = {{{v_p407|{{{v_llengua|{{{llengua|}}}}}}}}} | v_p140 = {{{v_p140|{{{v_religion|{{{religio|}}}}}}}}} | v_p136 = {{{v_p136|{{{v_genre|{{{genere|}}}}}}}}} | v_p175 = {{{v_p175|{{{v_performer|{{{interpret|}}}}}}}}} | v_p5027 = {{{v_p5027|{{{v_representations|{{{representacions|}}}}}}}}} | v_p2769 = {{{v_p2769|{{{v_budget|{{{pressupost|}}}}}}}}} | v_p2320 = {{{v_p2320|{{{v_aftershocks|{{{repliques|}}}}}}}}} | v_p1120 = {{{v_p1120|{{{v_deaths|{{{morts|}}}}}}}}} | v_p1339 = {{{v_p1339|{{{v_injured|{{{ferits|}}}}}}}}} | v_p8032 = {{{v_p8032|{{{v_victim|{{{victimes|}}}}}}}}} | v_p1446 = {{{v_p1446|{{{v_missing|{{{desapareguts|}}}}}}}}} | v_p1561 = {{{v_p1561|{{{v_survivor|{{{supervivents|}}}}}}}}} | v_p3081 = {{{v_p3081|{{{v_damaged|{{{danys|}}}}}}}}} | v_p2630 = {{{v_p2630|{{{v_damage_cost|{{{danys_economics|}}}}}}}}} | v_p3082 = {{{v_p3082|{{{v_destroyed|{{{destruccio|{{{habitatges_destruits|}}}}}}}}}}}} | v_p641 = {{{v_p641|{{{v_sport|{{{esport|}}}}}}}}} | v_p1027 = {{{v_p1027|{{{v_host|{{{concedit_per|}}}}}}}}} | v_p664 = {{{v_p664|{{{v_organizer|{{{organitzacio|}}}}}}}}} | v_p1001 = {{{v_p1001|{{{v_jurisdiction|{{{jurisdiccio|}}}}}}}}} | v_p371 = {{{v_p371|{{{v_presenter|{{{presentador|}}}}}}}}} | v_p57 = {{{v_p57|{{{v_director|{{{director|}}}}}}}}} | v_p162 = {{{v_p162|{{{v_producer|{{{productor|}}}}}}}}} | v_p61 = {{{v_p61|{{{v_discovered|{{{descobridor|}}}}}}}}} | v_p4971 = {{{v_p4971|{{{v_commander|{{{comandament|}}}}}}}}} | v_p823 = {{{v_p823|{{{v_speaker|{{{locutor|}}}}}}}}} | v_p3342 = {{{v_p3342|{{{v_coordinator|{{{coordinador|}}}}}}}}} | v_p1128 = {{{v_p1128|{{{v_employees|{{{empleats|}}}}}}}}} | v_p6125 = {{{v_p6125|{{{v_volunteers|{{{voluntaris|}}}}}}}}} | v_p1875 = {{{v_p1875|{{{v_represented_by|{{{representat_per|}}}}}}}}} | v_p710 = {{{v_p710|{{{v_participant|{{{participants|}}}}}}}}} | v_p8550 = {{{v_p8550|{{{v_law_number|{{{identificador_llei|}}}}}}}}} | v_p9376 = {{{v_p9376|{{{v_law_digest|{{{resum_llei|}}}}}}}}} | v_p3148 = {{{v_p3148|{{{v_repeals|{{{revoca|}}}}}}}}} | v_p2568 = {{{v_p2568|{{{v_repealed_by|{{{revocat_per|}}}}}}}}} | v_p50 = {{{v_p50|{{{v_author|{{{autor|}}}}}}}}} | v_p1891 = {{{v_p1891|{{{v_signatory|{{{signataris|}}}}}}}}} | v_p4032 = {{{v_p4032|{{{v_reviewed_by|{{{revisat_per|}}}}}}}}} | v_p9681 = {{{v_p9681|{{{v_voted_by|{{{votat_per|}}}}}}}}} | v_p2058 = {{{v_p2058|{{{v_depositor|{{{dipositari|}}}}}}}}} | v_p859 = {{{v_p859|{{{v_sponsor|{{{impulsors|}}}}}}}}} | v_first_informant = {{{v_first_informant|{{{primer_informador|}}}}}} | v_p2284 = {{{v_p2284|{{{v_price|{{{preu|}}}}}}}}} | v_recording = {{{v_recording|{{{filmat_per|}}}}}} | v_p5436 = {{{v_p5436|{{{v_viewers|{{{espectadors|}}}}}}}}} | v_p1110 = {{{v_p1110|{{{v_attendance|{{{assistents|}}}}}}}}} | v_p1132 = {{{v_p1132|{{{v_participants|{{{num_participants|}}}}}}}}} | v_p1346 = {{{v_p1346|{{{v_winner|{{{guanyador|}}}}}}}}} | v_p2142 = {{{v_p2142|{{{v_box_office|{{{recaptacio|}}}}}}}}} | v_color_map_part_1 = {{{v_color_map_part_1|{{{color_map_part_1|}}}}}} | v_color_map_part_2 = {{{v_color_map_part_2|{{{color_map_part_2|}}}}}} | v_p541 = {{{v_p541|{{{v_office_contested|{{{carrec|}}}}}}}}} | v_p726 = {{{v_p726|{{{v_candidate|{{{candidats|}}}}}}}}} | v_p991 = {{{v_p991|{{{v_elected|{{{elegit|}}}}}}}}} | v_p547 = {{{v_p547|{{{v_commemorates|{{{commemora|}}}}}}}}} | v_ritual = {{{v_ritual|{{{ritual|}}}}}} | v_p2541 = {{{v_p2541|{{{v_operating_area|{{{opera_celebra|}}}}}}}}} | v_p1840 = {{{v_p1840|{{{v_investigated_by|{{{investigacio|}}}}}}}}} | v_judicial_investigation = {{{v_judicial_investigation|{{{investigacio_judicial|}}}}}} | v_p1592 = {{{v_p1592|{{{v_prosecutor|{{{instructor|}}}}}}}}} | v_suspect = {{{v_suspect|{{{sospitosos|}}}}}} | v_p8031 = {{{v_p8031|{{{v_perpetrator|{{{perpetrador|}}}}}}}}} | v_p520 = {{{v_p520|{{{v_armament|{{{armes|}}}}}}}}} | v_p5582 = {{{v_p5582|{{{v_arrests|{{{detinguts|}}}}}}}}} | v_trial = {{{v_trial|{{{litigi|}}}}}} | v_p1620 = {{{v_p1620|{{{v_claimant|{{{demandant|}}}}}}}}} | v_p1591 = {{{v_p1591|{{{v_defendant|{{{acusats|}}}}}}}}} | v_p1595 = {{{v_p1595|{{{v_charge|{{{carrecs|}}}}}}}}} | v_p1593 = {{{v_p1593|{{{v_defender|{{{defensor|}}}}}}}}} | v_p4884 = {{{v_p4884|{{{v_court|{{{tribunal|}}}}}}}}} | v_p1594 = {{{v_p1594|{{{v_judge|{{{jutge|}}}}}}}}} | v_verdict = {{{v_verdict|{{{veredicte|}}}}}} | v_convict = {{{v_convict|{{{condemnats|}}}}}} | v_p1596 = {{{v_p1596|{{{v_penalty|{{{condemna|}}}}}}}}} | v_p121 = {{{v_p121|{{{v_item_operat|{{{tipus_aeronau|{{{tipus_vehicle|}}}}}}}}}}}} | v_p81 = {{{v_p81|{{{v_connecting_line|{{{linia|}}}}}}}}} | v_p1427 = {{{v_p1427|{{{v_start_point|{{{origen|}}}}}}}}} | v_p1444 = {{{v_p1444|{{{v_destination_point|{{{destinacio|}}}}}}}}} | v_last_layover = {{{v_last_layover|{{{ultima_escala|}}}}}} | v_p137 = {{{v_p137|{{{v_operator|{{{operador|}}}}}}}}} | v_p426 = {{{v_p426|{{{v_aircraft_registration|{{{matricula|}}}}}}}}} | v_p3090 = {{{v_p3090|{{{v_flight|{{{vol|}}}}}}}}} | v_passenger = {{{v_passenger|{{{passatgers|}}}}}} | v_crew = {{{v_crew|{{{tripulacio|}}}}}} | v_p2528 = {{{v_p252|{{{v_richter|{{{richter|}}}}}}}}} | v_p2527 = {{{v_p2527|{{{v_earthquake_magnitude|{{{magnitud|}}}}}}}}} | v_p2784 = {{{v_p2784|{{{v_mercalli|{{{mercalli|}}}}}}}}} | v_p4511 = {{{v_p4511|{{{v_depth|{{{profunditat|}}}}}}}}} | v_p449 = {{{v_p449|{{{v_network|{{{canal|}}}}}}}}} | v_p10 = {{{v_p10|{{{v_video|{{{video|}}}}}}}}} | v_p3301 = {{{v_p3301|{{{v_broadcast|{{{transmes_per|}}}}}}}}} | v_p51 = {{{v_p51|{{{v_audio|{{{audio|}}}}}}}}} | v_p2670 = {{{v_p2670|{{{v_elements|{{{elements|}}}}}}}}} | v_p527 = {{{v_p527|{{{v_has_part|{{{formatper|}}}}}}}}} | v_p793 = {{{v_p793|{{{v_significant_event|{{{cronologia|}}}}}}}}} | v_label = {{{v_label|{{{etiqueta|}}}}}} | v_data = {{{v_data|{{{dada|}}}}}} | v_label1 = {{{v_label1|{{{etiqueta1|}}}}}} | v_data1 = {{{v_data1|{{{dada1|}}}}}} | v_label2 = {{{v_label2|{{{etiqueta2|}}}}}} | v_data2 = {{{v_data2|{{{dada2|}}}}}} | v_p3259 = {{{v_p3259|{{{v_intangible_heritage|{{{bloc_proteccions|}}}}}}}}} | v_below_image = {{{v_below_image|{{{vista|}}}}}} | v_below_image_caption = {{{v_below_image_caption|{{{peu_vista|}}}}}} | v_notes = {{{v_notes|{{{notes|}}}}}} | v_p953 = {{{v_p953|{{{v_full_work|{{{text_complet|}}}}}}}}} | v_p856 = {{{v_p856|{{{v_website|{{{lloc_web|}}}}}}}}} | v_hashtag = {{{v_hashtag|{{{etiqueta|}}}}}} | v_identifiers = {{{v_identifiers|{{{xarxes|}}}}}} | v_p8204 = {{{v_p8204|{{{v_tabular_case|{{{taula_casos|}}}}}}}}} | v_p1660 = {{{v_p1660|{{{v_index_case|{{{cas_index|}}}}}}}}} | v_p8011 = {{{v_p8011|{{{v_medical_tests|{{{examen_medic|}}}}}}}}} | v_p1603 = {{{v_p1603|{{{v_number_cases|{{{nombre_casos|}}}}}}}}} | v_p8049 = {{{v_p8049|{{{v_hospitalized_cases|{{{casos_hospital|}}}}}}}}} | v_p8010 = {{{v_p8010|{{{v_number_recoveries|{{{nombre_recuperacions|}}}}}}}}} | v_p9107 = {{{v_p9107|{{{v_number_vaccinations|{{{nombre_vacunacions|}}}}}}}}} | v_p8045 = {{{v_p8045|{{{v_response_outbreak|{{{resposta_brot|}}}}}}}}} | v_p59 = {{{v_p59|{{{v_constellation|{{{constellacio|}}}}}}}}} | v_p575 = {{{v_p575|{{{v_discovery_time|{{{data_descobriment|}}}}}}}}} | v_p65 = {{{v_p65|{{{v_discovery_place|{{{lloc_descobriment|}}}}}}}}} | v_p215 = {{{v_p215|{{{v_spectral_class|{{{tipus_espectral|}}}}}}}}} | v_p528 = {{{v_p528|{{{v_catalog|{{{codi_cataleg|}}}}}}}}} | v_p397 = {{{v_p397|{{{v_parent_astronomical|{{{pare|}}}}}}}}} | v_p2583 = {{{v_p2583|{{{v_earth_distance|{{{distance|}}}}}}}}} | v_p6257 = {{{v_p6257|{{{v_right_ascension|{{{ra|}}}}}}}}} | v_p6258 = {{{v_p6258|{{{v_declination_astro|{{{dec|}}}}}}}}} | v_p6259 = {{{v_p6259|{{{v_epoch_astro|{{{epoch|}}}}}}}}} | v_p1458 = {{{v_p1458|{{{v_color_index|{{{b-v|}}}}}}}}} | v_p1215 = {{{v_p1215|{{{v_apparent_magnitude|{{{mag_v|}}}}}}}}} | v_p2052 = {{{v_p2052|{{{v_speed|{{{velocitat|}}}}}}}}} | v_p3027 = {{{v_p3027|{{{v_meteor_period|{{{periode_meteors|}}}}}}}}} | v_p1090 = {{{v_p1090|{{{v_redshift|}}}}}} | v_p2922 = {{{v_p2922|}}} | v_p12995 = {{{v_p12995|}}} }}<noinclude>{{توضیحات}}</noinclude> 75igriu78etb44th68c197csw37oppm گپ:اوبیدوس 1 159747 416620 377054 2026-10-13T16:45:23Z محک 1023 کارور محک، [[گپ:وبیدوس]] ِصفحه ره دَکشی‌یه [[گپ:اوبیدوس]] دله 377054 wikitext text/x-wiki {{شاپ‌زن}} {{گپ صفحه}} 1vjigdfx9z1fnd3v7eklhi54qleb3gu گپ:اویاپوکو 1 160808 416625 378172 2026-10-13T16:46:43Z محک 1023 کارور محک، [[گپ:ویاپوکو]] ِصفحه ره دَکشی‌یه [[گپ:اویاپوکو]] دله 378172 wikitext text/x-wiki {{شاپ‌زن}} {{گپ صفحه}} 1vjigdfx9z1fnd3v7eklhi54qleb3gu ویکی‌پدیا:هفتگی بنویشته/سال ۲۰۲۶/هفته ۴۶ 4 184314 416614 416108 2026-10-13T15:56:42Z محک 1023 محک صفحهٔ [[ویکی‌پدیا:هفتگی بنویشته/سال ۲۰۲۶/هفته ۴۳]] را بدون برجای‌گذاشتن تغییرمسیر به [[ویکی‌پدیا:هفتگی بنویشته/سال ۲۰۲۶/هفته ۴۶]] منتقل کرد 416108 wikitext text/x-wiki [[پرونده:Euno_Enna_1.jpg|100پیکسل|چپ|یونوس موجستمه]] '''[[یونوس (گلادیاتور)|یونوس]]''' ([[لاتین]] جه: Eunus – بمردهٔ ۱۳۲ پیش از میلاد) اتا [[روم امپراتوری|رومی]] برده بی‌یه که اپامیا، [[سوریه]] دله دنیا بمو و [[برده‌ئون اولین جنگ]] (۱۳۵ پیش از میلاد–۱۳۲ پیش از میلاد) گدر، [[سیسیلی|سیسیلِ]] رومی اوستان دله، برده‌ئونِ شورشِ رهبر و شاه بیّه. تاریخ‌نویس فلوروس گنه که ونه نوم رومیون ره نخش-نخش شکست هادا وسّه، یاد بموندسته. یونوس، این قیام گِدِر، شه ره پیغمبر و معجزه‌کرِ معرفی هاکرد بی‌یه و آخرسر شه ره شاه بخوندسته. وه ادعا کارده که آتارگاتیسِ خدا، که ونه سامون دله اتا معروف الاهه بی‌یه، جه پیغوم گیرنه و وه ره وَحی وونه. وه اینتا الاهه ره سیسیلیِ دمتر و رومی‌شونِ سرس جه اتا دونسته. یونوسِ بعضی پیش‌بینیون، یعنی این که شورشی برده‌ئون موفق وانّه انا شهر ره بَیرن و وه اتا روز شاه وانه، حقیقت پیدا هاکردنه. یونوس و ونه شورش، چن سال موفق بینه، مکرراً پریتوریِ ارتشون ره شکست هدانه و لازم بی‌یه که ۱۳۴–۱۳۲ پیش از میلاد دله، روم کنسول ونه جنگ وسه لشکر برسنن. وه آخرسری شکست بخرده و ۱۳۲ پیش از میلاد، اسیری دله بمرده. [[اسپارتاکوس]] دمبال‌ته ونه شیوه ره پیش هایته و [[برده‌ئون جنگ]] ره إدامه هدا. {{هب/تلمبار|یونوس (گلادیاتور)}} dec9ih80wsl8524iji4d3bz4fshqpq7 افرا گوشک 0 184450 416612 416608 2026-10-13T15:53:19Z محک 1023 416612 wikitext text/x-wiki {{صندخ/موجود}} '''اِفرا گوشِک''' یا '''[[پلت]] گوشک''' {{علمی نوم|Agrocybe aegerita}} ات‌جور [[گوشک]] هسته که [[افرا|افرا دار]] تن درإنه؛ همینسه وه ره اتا جور '''دار گوشک''' هم إشناسنّه. == منابع == {{په‌نویس}} {{گیاهون-پچیک}} <!--- رج‌ئون: ---> [[رج:گوشکون]] 6xxhrh278chjw6xcob1v4xm967pzdek پلت گوشک 0 184452 416613 2026-10-13T15:55:09Z محک 1023 ونه مسیر ره دکشی‌یه [[افرا گوشک]] دله 416613 wikitext text/x-wiki #بور [[افرا گوشک]] jlvkdz39hue7vaja73nojo4c8f9uhej ویکی‌پدیا:هفتگی بنویشته/سال ۲۰۲۶/هفته ۴۳ 4 184453 416615 2026-10-13T15:56:58Z محک 1023 مناسبتی 416615 wikitext text/x-wiki [[پرونده:Lal shu.jpg|90px|left]] '''[[لال شو|تیرمای سیزده]] ''' یا '''[[لال شو]]''' اتا گتِ جشن هسته که [[تيرما]]ی تبریِ سيزدهمين روز گدر جشن گیرنه. این مراسم [[مازرونی مردمون|مازرون]] و [[گیلک|گیلان]] مردم میون جشن بهیت بی‌یه. تیرمای سینزهِ اصل-ریشه دقیقاً میّن نی‌یه ولی افسانه‌ئون دله روایت خلوئه؛ اتاشون که ویشته طرفدار دارنه، این هسته که [[آرش |آرش کمانگیر]] این شو بورده دماوند تک جه تیر ووشا تا ایران و تورانِ سامون ره اینتی رسد هاکنه. تیرمایِ شو رسم-رسوم زیاد هستنه. اتاشون «لال» مراسم هسته که ات‌نفر شه دیم ره سیو کنده و بصتینکلا لال وونه و مله‌گردی کنده و بخوند-بخوند همراهی، مردم سره جه شیرنی جمع کننه. این شویِ سفره و شوچره هم معروف هسته و محلی خراک و شیرنی آماده کنه و سفره په شعر خوندنه و امیری جه فال گیرنه. دقیقاً میّن نی‌یه کجه جه این جشن شروع بیه و ونه تاریخی یا اساطیری ریشه چچی هسته؟ اپار (بعضی) اعتقاد دارنه که این جشن [[آرش]]ِ تیر ووشائن جه ربط دارنه و سالروزی هسته که آرش بورده دماوند چکل و اونجه جه تیر رها هکرده تا ایران و تورانِ سامون ره میّن هاکنه. ات دسته هم گنّه که این روز دله [[کاوه]] بزو [[ضحاک]] ره بکوشته و «مهرگان» جشن دسوری هسته. یا وه ره [[امام علی]] دنیا بموئن جه ربط دنّه. نماشون وری که بی‌یه، جوون‌ها شیش‌چو گیتنه شه دست و ونه بن ره کیسه وندستنه و وچ‌وچون ره پیش اینگونه و مردمِ سِره در ره زونه و لال‌بازی و شعرخونی جه، صاحاب‌خنه جه شیرنی‌بخاه بینه. ات نفر که وه ره گتنه «لال»، شه دیم ره سیو کرده و دستمال وندسته شه سر و دکِّل گپ نزو. لال اکثراً مرد آدم بی‌یه و کم پیش إنه که کیجائون لال بون. لال وسّه کسی بوئه که مردم وه ره خار آدم بشنوسن. وه ره گتنه دوازدهم شو قارمرض دله [[غسل]] هکنه و پاک تن داره و گپ نزنه تا ات‌موقع خطایی (غیب و دِرو-دَون دسوری) ونجه پیش نئه. البته اتی نظر این هسته که بچا ئو کته تا ونه زىوون بند بئه و نتونه گپ بزنه. لال اتا شیش‌چو داشته که وه ره «لال شیش» گتنه و مردم ره بزو-بوشه، گتنه شگین دارنه و برکت یارنه و تا سال دیگه مریضی و ناخشی نییرنه. لال ره وردنه زنان که حامله نئینه یا کیجائون که خاستگارچی نداشتنه یا دار که میوه ندا ره تن‌سُسنه که وشون تن برکت دکفه... {{هب/تلمبار|لال شو}} 39etko0gfqizuw5201rbsjohp65r1jb وبیدوس 0 184454 416619 2026-10-13T16:45:22Z محک 1023 کارور محک، [[وبیدوس]] ِصفحه ره دَکشی‌یه [[اوبیدوس]] دله 416619 wikitext text/x-wiki #بور [[اوبیدوس]] qrkssoht54x5lp270nu08fu5f01faso گپ:وبیدوس 1 184455 416621 2026-10-13T16:45:23Z محک 1023 کارور محک، [[گپ:وبیدوس]] ِصفحه ره دَکشی‌یه [[گپ:اوبیدوس]] دله 416621 wikitext text/x-wiki #بور [[گپ:اوبیدوس]] 659q2ej2ldsribexwewe4i6ub0yd9jt ویاپوکو 0 184456 416624 2026-10-13T16:46:43Z محک 1023 کارور محک، [[ویاپوکو]] ِصفحه ره دَکشی‌یه [[اویاپوکو]] دله 416624 wikitext text/x-wiki #بور [[اویاپوکو]] i7nqmnu0b2sjii073aifx2rdrd1fbsg گپ:ویاپوکو 1 184457 416626 2026-10-13T16:46:43Z محک 1023 کارور محک، [[گپ:ویاپوکو]] ِصفحه ره دَکشی‌یه [[گپ:اویاپوکو]] دله 416626 wikitext text/x-wiki #بور [[گپ:اویاپوکو]] 9z63nsuewvlrktx1qh2st1w6eo20pjt وجتیوس 0 184458 416627 2026-10-13T16:56:25Z محک 1023 اتا نو ولگ بساته که ونه دله «{{صندخ/شخص | embed = | honorific_prefix = | name = Vegetius | honorific_suffix = | image = Publius Flavius Vegetius Renatus - DPLA - acf9274ab8e54ff66a708908b7b969d8.jpg | image_size = | image_upright = | alt = | caption = Fanciful portrait from a 1529 edition | native_name = | native_name_lang = | pen_name = | birth_name = | birth_...» دره 416627 wikitext text/x-wiki {{صندخ/شخص | embed = | honorific_prefix = | name = Vegetius | honorific_suffix = | image = Publius Flavius Vegetius Renatus - DPLA - acf9274ab8e54ff66a708908b7b969d8.jpg | image_size = | image_upright = | alt = | caption = Fanciful portrait from a 1529 edition | native_name = | native_name_lang = | pen_name = | birth_name = | birth_date = 4th century AD<!-- {{Birth date and age|YYYY|MM|DD}} for living people supply only the year with {{Birth year and age|YYYY}} unless the exact date is already widely published, as per [[WP:DOB]]. For people who have died, use {{Birth date|YYYY|MM|DD}}. --> | birth_place = | death_date = After 383<!-- {{Death date and age|YYYY|MM|DD|YYYY|MM|DD}} (DEATH date then BIRTH date) --> | death_place = | resting_place = | occupation = | language = [[Latin]] | citizenship = [[Roman Empire]]<!-- use only when necessary per [[WP:INFONAT]] --> | education = | period = | genre = <!-- or: | genres = --> | subject = [[Military]] affairs, [[Veterinary medicine]] <!-- or: | subjects = --> | movement = | notable_works = ''[[De re militari]]'' | spouse = <!-- or: | spouses = --> | partner = <!-- or: | partners = --> | children = | relatives = | awards = | signature = | signature_alt = | signature_size = | signature_type = | years_active = | module = | website = <!-- {{URL|example.org}} --> }} '''پوبلیوس''' (یا '''فلاویوس''') '''وجتیوس رناتوس''',<ref>His name appears both as Publius Vegetius Renatus and Flavius Vegetius Renatus. Milner, ''Vegetius: Epitome of Military Science'' (Liverpool University Press, 1993), pp. xxxi–xxxiii, believes the evidence favors Publius.</ref> ({{IPA|la|u̯ɛˈɡɛtiʊs|lang}}), اتا [[روم امپراتوری]] (قرن چاروم میلادی) نویسنده هسته که ونه زندگی جه تقریباً هچّی ندومبی. فقط ونه ات-دِ تا کتاب هنتا دره که نظامی‌کَری خَوِر هسته. ونه ''[[De Re Militari|De re militari]]'' خطی نسخه حلا باقی بموندسته. وه شه مقدمه دله شه خد ره اتا [[مسیحیت|مسیحی]] معرفی کنده.<ref>{{cite book|author=Lipowsky, Felix Joseph |title=Des Flavius Vegetius Renatus fünf Bücher über Kriegswissenschaft und Kriegskunst der Römer |url=https://books.google.com/books?id=Cao9AAAAcAAJ&q=Vegetius&pg=PR7 |year=1827 |publisher=Seidel}}</ref> == منابع== {{په‌نویس}} [[رج:روم نویسندگون]] kkz1n4bvkkqc0wtlzgt6wkowz5kbw5t 416628 416627 2026-10-13T16:57:17Z محک 1023 416628 wikitext text/x-wiki {{صندخ/شخص | embed = | honorific_prefix = | name = Vegetius | honorific_suffix = | image = Publius Flavius Vegetius Renatus - DPLA - acf9274ab8e54ff66a708908b7b969d8.jpg | image_size = | image_upright = | alt = | caption = Fanciful portrait from a 1529 edition | native_name = | native_name_lang = | pen_name = | birth_name = | birth_date = 4th century AD<!-- {{تاریخ تولد و سن|YYYY|MM|DD}} for living people supply only the year with {{Birth year and age|YYYY}} unless the exact date is already widely published, as per [[WP:DOB]]. For people who have died, use {{تولد تاریخ|YYYY|MM|DD}}. --> | birth_place = | death_date = After 383<!-- {{تاریخ مرگ و سن|YYYY|MM|DD|YYYY|MM|DD}} (DEATH date then BIRTH date) --> | death_place = | resting_place = | occupation = | language = [[لاتین]] | citizenship = [[روم امپراتوری]]<!-- use only when necessary per [[WP:INFONAT]] --> | education = | period = | genre = <!-- or: | genres = --> | subject = [[Military]] affairs, [[Veterinary medicine]] <!-- or: | subjects = --> | movement = | notable_works = ''[[De re militari]]'' | spouse = <!-- or: | spouses = --> | partner = <!-- or: | partners = --> | children = | relatives = | awards = | signature = | signature_alt = | signature_size = | signature_type = | years_active = | module = | website = <!-- {{URL|example.org}} --> }} '''پوبلیوس''' (یا '''فلاویوس''') '''وجتیوس رناتوس''',<ref>His name appears both as Publius Vegetius Renatus and Flavius Vegetius Renatus. Milner, ''Vegetius: Epitome of Military Science'' (Liverpool University Press, 1993), pp. xxxi–xxxiii, believes the evidence favors Publius.</ref> ({{IPA|la|u̯ɛˈɡɛtiʊs|lang}}), اتا [[روم امپراتوری]] (قرن چاروم میلادی) نویسنده هسته که ونه زندگی جه تقریباً هچّی ندومبی. فقط ونه ات-دِ تا کتاب هنتا دره که نظامی‌کَری خَوِر هسته. ونه ''[[De Re Militari|De re militari]]'' خطی نسخه حلا باقی بموندسته. وه شه مقدمه دله شه خد ره اتا [[مسیحیت|مسیحی]] معرفی کنده.<ref>{{cite book|author=Lipowsky, Felix Joseph |title=Des Flavius Vegetius Renatus fünf Bücher über Kriegswissenschaft und Kriegskunst der Römer |url=https://books.google.com/books?id=Cao9AAAAcAAJ&q=Vegetius&pg=PR7 |year=1827 |publisher=Seidel}}</ref> == منابع== {{په‌نویس}} [[رج:روم نویسندگون]] k9uluvinqr2jazfjq6lpl09jvxhfgw3 رج:روم نویسندگون 14 184459 416629 2026-10-13T16:58:11Z محک 1023 اتا نو ولگ بساته که ونه دله «[[رج:روم گت آدمون|نویسندهُُ]] [[رج:نویسندگون|روم]]» دره 416629 wikitext text/x-wiki [[رج:روم گت آدمون|نویسندهُُ]] [[رج:نویسندگون|روم]] h5cc67mnb0injj0z0lpsrb3561f5z2p