require('Module:No globals') -- local genitive = require('Module:Genitive')._genitive local contLang = mw.language.getContentLanguage() local cmodule = {} local conf = require 'Module:Dış bağlantılar/conf'(contLang:getCode()) local hasdatafromwikidata = false local hasdatafromlocal = false local haswikidatalink = true -- we assume it's connected local p = {} local function getLabel(entity, use_genitive, pagetitle) local label = (pagetitle and pagetitle ~= '') and pagetitle or nil if not label and not entity then label = mw.title.getCurrentTitle().text elseif not label then label = mw.wikibase.label(entity.id) or mw.title.getCurrentTitle().text end --return use_genitive and genitive(label, 'sitt') or label return use_genitive and label .. "'s" or label end -- @todo cleanup, this is in production, use the console local function dump(obj) return "<pre>" .. mw.dumpObject(obj) .. "</pre>" end local function stringFormatter( datavalue ) if datavalue == nil or datavalue['type'] ~= 'string' then return nil end return datavalue.value end local pval = {} pval.P1793 = { -- format as a regular expression types = { snaktype = 'value', datatype = 'string', }, } pval.P407 = { -- language of work or name types = { snaktype = 'value', datatype = 'wikibase-item', datavalue = { type = 'wikibase-entityid', } }, } pval.P364 = { -- original language of work types = { snaktype = 'value', datatype = 'wikibase-item', datavalue = { type = 'wikibase-entityid', } }, } pval.P218 = { -- ISO 639-1 language types = { snaktype = 'value', datatype = 'external-id', datavalue = { type = 'string', } }, } pval.P305 = { -- IETF language tag types = { snaktype = 'value', datatype = 'external-id', datavalue = { type = 'string', } }, } pval.P582 = { -- end time types = { snaktype = 'value', datatype = 'time', datavalue = { type = 'string', } }, } -- This is a really makeshift crappy converter, but it'll do some basic -- conversion from PCRE to Lua-style patterns (note that this only work -- in very few cases) local function regexConverter( regex ) local output = regex output = string.gsub(output, "\\d{2}", "%%d%%d") output = string.gsub(output, "\\d{3}", "%%d%%d%%d") output = string.gsub(output, "\\d{4}", "%%d%%d%%d%%d") output = string.gsub(output, "\\d{5}", "%%d%%d%%d%%d%%d") output = string.gsub(output, "\\d{6}", "%%d%%d%%d%%d%%d%%d") output = string.gsub(output, "\\d{7}", "%%d%%d%%d%%d%%d%%d%%d") output = string.gsub(output, "\\d{8}", "%%d%%d%%d%%d%%d%%d%%d%%d") output = string.gsub(output, "\\d", "%%d") return output end local function getFormatterUrl( prop, value ) local head = "" local tail = "" local entity = mw.wikibase.getEntity(prop) -- to avoid deep tests if not entity or not entity.claims then return head end -- get the claims for this entity local statements = entity.claims['P1630'] -- formatter URL -- to avoid deep tests if not statements then return head end local formatters = {} -- let's go through the claims for _, claim in ipairs( statements ) do -- to avoid deep tests if not claim then claim = {} end local valid = claim['type'] == 'statement' and claim['rank'] ~= 'deprecated' if valid then local mainsnak = claim.mainsnak or {} local preferred = claim['rank'] == 'preferred' -- get any qualifiers for this claim (we are interested in P1793 for -- indication of which claim is correct) local qualifiers = claim.qualifiers or {} -- now let's check the qualifier we are interested in local qualid = 'P1793' -- format as a regular expression -- if the claim has this qualifier if qualifiers[qualid] then -- it's here, let's check it out! local items = {} -- traverse all snaks in this qualifier for _, qualsnak in ipairs( qualifiers[qualid] ) do if qualsnak and pval[qualid] then --mw.log("qualsnak = " .. dump(qualsnak)) -- check if the snak is of the correct snaktype and datatype local valid = qualsnak.snaktype == pval[qualid].types.snaktype and qualsnak.datatype == pval[qualid].types.datatype if valid then -- we'll have to convert the regex to Lua-style local regex = regexConverter(qualsnak.datavalue.value) local test = string.match( value, '^'..regex..'$' ) if test then -- it matched, this is correct and overrides any other. if preferred then head = mainsnak.datavalue.value else tail = mainsnak.datavalue.value end end end end end else -- we don't have any qualifier, is it preferred? if (head == '' and preferred) or (tail == '' and not preferred) then -- if we don't have any other, use this one if preferred and head == '' then head = mainsnak.datavalue.value elseif not preferred and tail == '' then tail = mainsnak.datavalue.value end end end end end return head ~= '' and head or tail end local function getLanguageData(prop, qid) local head = {} local tail = {} -- mw.log("getLanguageData, prop="..dump(prop).." qid="..dump(qid)) -- get the entity we are checking local entity = mw.wikibase.getEntityObject(qid) -- to avoid deep tests if not entity then return nil end if not entity.claims then return {} end -- get the claims for this entity local statements = entity.claims[prop] -- to avoid deep tests if not statements then return {} end -- mw.log("getLanguageData going through claims="..dump(statements)) -- let's go through the claims for _, claim in ipairs( statements ) do -- to avoid deep tests if not claim then claim = {} end local valid = claim['type'] == 'statement' and claim['rank'] ~= 'deprecated' if valid then local mainsnak = claim.mainsnak or {} local preferred = claim['rank'] == 'preferred' -- verify the item is what we expect local valid = mainsnak.snaktype == pval[prop].types.snaktype and mainsnak.datatype == pval[prop].types.datatype and mainsnak.datavalue.type == pval[prop].types.datavalue.type if valid then -- mw.log("getLanguageData claim is valid="..dump(claim)) -- if this is the correct P-value, dive into it and get P218 (ISO 639-1) if mainsnak.property == 'P364' then -- original language of work if preferred then head[#head+1] = table.concat(getLanguageData('P218', 'Q'..mainsnak.datavalue.value['numeric-id']), conf:a('mod-filter-separator')) else tail[#tail+1] = table.concat(getLanguageData('P218', 'Q'..mainsnak.datavalue.value['numeric-id']), conf:a('mod-filter-separator')) end elseif mainsnak.property == 'P218' or mainsnak.property == 'P305' then -- ISO 639-1 code or IETF language tag if preferred then head[#head+1] = stringFormatter(mainsnak.datavalue) else tail[#tail+1] = stringFormatter(mainsnak.datavalue) end end end end end -- mw.log("getLanguageData returning head="..dump(head).." tail="..dump(tail)) return #head>0 and head or tail end local langqvalorder = {'P407','P364'} local otherqvalorder = {'P582'} local function getValuesFromWikidata(props) local head = {} local tail = {} -- mw.log("getValuesFromWikidata, props="..dump(props)) -- get the entity we are checking local entity = mw.wikibase.getEntityObject() -- to avoid deep tests if not entity then --mw.log("getValuesFromWikidata no entity") return nil end if not entity.claims or not props or not props.prop or props.prop == '' then --mw.log("getValuesFromWikidata no claims or no props") return {} end -- get the claims for this entity local statements = entity.claims[props.prop] -- to avoid deep tests if not statements then return {} end -- let's go through the claims for _, claim in ipairs( statements ) do -- to avoid deep tests if not claim then claim = {} end local valid = claim['type'] == 'statement' and claim['rank'] ~= 'deprecated' if valid then -- mw.log("getValuesFromWikidata valid claim="..dump(claim)) local mainsnak = claim.mainsnak or {} local preferred = claim['rank'] == 'preferred' -- get the content of the claim (the identifier) local langcode = props.langcode local checklangcode = nil if props.langcode and props.langcode ~= '' then checklangcode = string.find(langcode, "([pP]%d+)") end if checklangcode and checklangcode ~= "" then -- this is a P-value for language-code, so we'll check qualifiers for languagedata -- first get any qualifiers local qualifiers = claim.qualifiers or {} for _, qualid in ipairs( langqvalorder ) do -- if the claim has this qualifier if qualifiers[qualid] then -- it's here, let's check it out! local items = {} -- traverse all snaks in this qualifier for _, qualsnak in ipairs( qualifiers[qualid] ) do if qualsnak and pval[qualid] then -- mw.log("qualsnak = " .. dump(qualsnak)) -- check if the snak is of the correct snaktype and datatype local valid = qualsnak.snaktype == pval[qualid].types.snaktype and qualsnak.datatype == pval[qualid].types.datatype if valid then -- now get the actual data langcode = table.concat(getLanguageData('P305', 'Q'..qualsnak.datavalue.value['numeric-id']), '') end end end end -- mw.log("langcode is now="..dump(langcode)) end if string.find(langcode, "([pP]%d+)") then -- we still don't have any langcode, so we default to "en" langcode = nil end end local stillvalid = true -- we should check a couple of other qualifiers as well -- first get any qualifiers local qualifiers = claim.qualifiers or {} for _, qualid in ipairs( otherqvalorder ) do -- if the claim has this qualifier if qualifiers[qualid] then -- it's here, let's check it out! local items = {} -- traverse all snaks in this qualifier for _, qualsnak in ipairs( qualifiers[qualid] ) do if qualsnak and pval[qualid] then -- mw.log("qualsnak = " .. dump(qualsnak)) -- check if the snak is of the correct snaktype and datatype local valid = qualsnak.snaktype == pval[qualid].types.snaktype and qualsnak.datatype == pval[qualid].types.datatype if not valid then -- sorry, this is not correct mw.log("qualsnak = INCORRECT") stillvalid = false end end end end -- mw.log("langcode is now="..dump(langcode)) end if stillvalid then if preferred then head[#head+1] = { value=stringFormatter(mainsnak.datavalue) } if langcode and langcode ~= '' then head[#head]['langcode'] = langcode end else tail[#tail+1] = { value=stringFormatter(mainsnak.datavalue) } if langcode and langcode ~= '' then tail[#tail]['langcode'] = langcode end end end end end -- mw.log("getValuesFromWikidata returning head="..dump(head).." tail="..dump(tail)) return #head>0 and head or tail end local function findMainLinksOnWikidata(props, pagetitle, short_links) local output = {} local pid = nil -- get the entity we are checking local entity = mw.wikibase.getEntityObject() -- to avoid deep tests if not entity then return nil end local values = getValuesFromWikidata(props) for _, value in ipairs( values ) do local verified_value = nil if props.regex then -- we have a local defined regex, so this will have to pass first -- maybe we'll have to convert the regex to Lua-style local regex = regexConverter(props.regex) local test = string.match( value.value, '^'..regex..'$' ) --mw.log("testing with "..regex.. " and test="..dump(test).." and value="..id) if test then -- it matched, this is correct and overrides any other. verified_value = value.value end else verified_value = value.value end if verified_value then local url = '' output[#output+1] = {} output[#output].langcode = value.langcode output[#output].category = {} if props.url_f then -- we have a local defined url-formatter function, use it as first priority url = props.url_f(verified_value) if props.track and not string.find(props.langcode, "([pP]%d+)") then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-local-wd'), props.prop):plain() elseif props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-wd-wd'), props.prop):plain() end elseif props.url then -- we have a local defined url-formatter string, use it as second priority url = mw.message.newRawMessage(props.url, verified_value):plain() if props.track and not string.find(props.langcode, "([pP]%d+)") then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-local-wd'), props.prop):plain() elseif props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-wd-wd'), props.prop):plain() end else -- get the formatvalue from the property, if it exists local formatterUrl = getFormatterUrl(props.prop, verified_value) if formatterUrl ~= '' then url = mw.message.newRawMessage(formatterUrl, verified_value):plain() if props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-wd-wd'), props.prop):plain() end end end if url ~= '' then local this_wiki = mw.getContentLanguage() local this_wiki_code = this_wiki:getCode() local langlink = (value.langcode and value.langcode ~= '' and value.langcode ~= this_wiki_code) and mw.message.newRawMessage(conf:g('msg-langcode'), value.langcode, mw.language.fetchLanguageName(value.langcode, this_wiki_code)) or "" if short_links and props.short then output[#output].text = mw.message.newRawMessage(props.short, getLabel(entity, props.genitive, pagetitle), url, langlink, verified_value, mw.uri.encode(verified_value, 'PATH')) :plain() else output[#output].text = mw.message.newRawMessage(props.message, getLabel(entity, props.genitive, pagetitle), url, langlink, verified_value, mw.uri.encode(verified_value, 'PATH')) :plain() end end end end --mw.log("findMainLinksOnWikidata returning="..dump(output)) return output end local function getSitelinksFromWikidata(props, entity) local output = {} --mw.log("getSitelinksFromWikidata, props="..dump(props)) -- to avoid deep tests if not entity then entity = mw.wikibase.getEntityObject() if not entity then --mw.log("getSitelinksFromWikidata no entity") return nil end end local requested_sitelink = string.match(props.prop, "SL(%l+)") local sitelinks = entity:getSitelink(requested_sitelink) if sitelinks and sitelinks ~= '' then output[#output+1] = { value = sitelinks } end --mw.log("getSitelinksFromWikidata returning output="..dump(output)) return output end local function findSiteLinksOnWikidata(props, pagetitle, short_links) local output = {} local pid = nil -- get the entity we are checking local entity = mw.wikibase.getEntityObject() -- to avoid deep tests if not entity then return nil end local values = getSitelinksFromWikidata(props) for _, value in ipairs( values ) do local verified_value = nil if props.regex then -- we have a local defined regex, so this will have to pass first -- maybe we'll have to convert the regex to Lua-style local regex = regexConverter(props.regex) local test = string.match( value.value, '^'..regex..'$' ) --mw.log("testing with "..regex.. " and test="..dump(test).." and value="..id) if test then -- it matched, this is correct and overrides any other. verified_value = value.value end else verified_value = value.value end if verified_value then --mw.log("it's verified..") local url = '' output[#output+1] = {} output[#output].langcode = value.langcode output[#output].category = {} if props.url_f then -- we have a local defined url-formatter function, use it as first priority url = props.url_f(verified_value) if props.track and not string.find(props.langcode, "(SL%l+)") then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-local-wd'), props.prop):plain() elseif props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-wd-wd'), props.prop):plain() end elseif props.url then -- we have a local defined url-formatter string, use it as second priority url = mw.message.newRawMessage(props.url, verified_value):plain() if props.track and not string.find(props.langcode, "(SL%l+)") then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-local-wd'), props.prop):plain() elseif props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-wd-wd'), props.prop):plain() end else url = verified_value:gsub(' ','_') if props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-wd-wd'), props.prop):plain() end end if url ~= '' then local this_wiki = mw.getContentLanguage() local this_wiki_code = this_wiki:getCode() local langlink = (value.langcode and value.langcode ~= '' and value.langcode ~= this_wiki_code) and mw.message.newRawMessage(conf:g('msg-langcode'), value.langcode, mw.language.fetchLanguageName(value.langcode, this_wiki_code)) or "" if short_links and props.short then output[#output].text = mw.message.newRawMessage(props.short, getLabel(entity, props.genitive, pagetitle), url, langlink, verified_value, mw.uri.encode(verified_value, 'PATH')) :plain() else output[#output].text = mw.message.newRawMessage(props.message, getLabel(entity, props.genitive, pagetitle), url, langlink, verified_value, mw.uri.encode(verified_value, 'PATH')) :plain() end end end end --mw.log("findSiteLinksOnWikidata returning="..dump(output)) return output end local function findMainLinksLocal(props, pagetitle, short_links, local_value) local output = {} -- to avoid deep tests if not props.prop then return nil end if not (local_value or local_value == '') then -- bail out if no value is present return output end -- get the formatvalue from the property local verified_value = local_value if props.regex and props.regex ~= '' then -- let's verify the id -- maybe we'll have to convert the regex to Lua-style local regex = regexConverter(props.regex) local test = string.match( local_value, '^'..regex..'$' ) if test then -- it matched, this is correct verified_value = local_value else verified_value = nil end end if not verified_value then return output end local wikidata_property = string.find(props.prop, "([pP]%d+)") local wikidata_values = {} if wikidata_property then -- get any wikidata values to see if they are equal to local values wikidata_values = getValuesFromWikidata(props) end if wikidata_property or (props.url and props.url ~= '') or (props.url_f) then output[#output+1] = {} output[#output].langcode = string.find(props.langcode, "([pP]%d+)") and "" or props.langcode --mw.log("findMainLinksLocal - props="..dump(props).." langcode="..output[#output].langcode) output[#output].category = {} local url = '' if props.track and wikidata_property and wikidata_values and #wikidata_values then local local_value_in_wikidata = false for _,value in ipairs( wikidata_values ) do if value.value == verified_value then local_value_in_wikidata = true end end output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), (local_value_in_wikidata and 'track-cat-local-wd-equal' or 'track-cat-local-wd-unequal')), props.prop):plain() end if wikidata_property and wikidata_values and #wikidata_values then hasdatafromwikidata = true -- signal up the chain this article has a wikidata claim end if props.url_f then -- we have a local defined url-formatter function, use it as first priority url = props.url_f(verified_value) if props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-local-local'), props.prop):plain() end elseif props.url then -- we have a local defined url-formatter string, use it as second priority url = mw.message.newRawMessage(props.url, verified_value):plain() if props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-local-local'), props.prop):plain() end elseif wikidata_property then -- get the formatvalue from the property, if it exists local formatterUrl = getFormatterUrl(props.prop, verified_value) if formatterUrl ~= '' then url = mw.message.newRawMessage(formatterUrl, verified_value):plain() if props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-wd-local'), props.prop):plain() end end else -- no other choice, bail out return {} end local this_wiki = mw.getContentLanguage() local this_wiki_code = this_wiki:getCode() local langlink = (output[#output].langcode and output[#output].langcode ~= '' and output[#output].langcode ~= this_wiki_code) and mw.message.newRawMessage(conf:g('msg-langcode'), props.langcode, mw.language.fetchLanguageName(props.langcode, this_wiki_code)) or "" if short_links and props.short then output[#output].text = mw.message.newRawMessage(props.short, getLabel(nil, props.genitive, pagetitle), url, langlink, verified_value, mw.uri.encode(verified_value, 'PATH')) :plain() else output[#output].text = mw.message.newRawMessage(props.message, getLabel(nil, props.genitive, pagetitle), url, langlink, verified_value, mw.uri.encode(verified_value, 'PATH')) :plain() end end --mw.log("findMainLinksLocal returning="..dump(output)) return output end local function findSiteLinksLocal(props, pagetitle, short_links, local_value) local output = {} -- to avoid deep tests if not props.prop then return nil end if not (local_value or local_value == '') then -- bail out if no value is present return output end -- get the formatvalue from the property local verified_value = local_value if props.regex and props.regex ~= '' then -- let's verify the id -- maybe we'll have to convert the regex to Lua-style local regex = regexConverter(props.regex) local test = string.match( local_value, '^'..regex..'$' ) if test then -- it matched, this is correct verified_value = local_value else verified_value = nil end end if not verified_value then return output end local wikidata_property = string.find(props.prop, "(SL.+)") local wikidata_values = {} if wikidata_property then -- get any wikidata values to see if they are equal to local values wikidata_values = getSitelinksFromWikidata(props) end if wikidata_property or (props.url and props.url ~= '') or (props.url_f) then output[#output+1] = {} output[#output].langcode = string.find(props.langcode, "(SL.+)") and "" or props.langcode --mw.log("findSiteLinksLocal - props="..dump(props).." langcode="..output[#output].langcode .." wikidata_values="..dump(wikidata_values)) output[#output].category = {} local url = '' if props.track and wikidata_property and wikidata_values and #wikidata_values then local local_value_in_wikidata = false for _,value in ipairs( wikidata_values ) do if value.value == verified_value then local_value_in_wikidata = true end end output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), (local_value_in_wikidata and 'track-cat-local-wd-equal' or 'track-cat-local-wd-unequal')), props.prop):plain() end if wikidata_property and wikidata_values and #wikidata_values then hasdatafromwikidata = true -- signal up the chain this article has a wikidata claim end if props.url_f then -- we have a local defined url-formatter function, use it as first priority url = props.url_f(verified_value) if props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-local-local'), props.prop):plain() end elseif props.url then -- we have a local defined url-formatter string, use it as second priority url = mw.message.newRawMessage(props.url, verified_value):plain() if props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-local-local'), props.prop):plain() end elseif wikidata_property then url = verified_value:gsub(' ','_') if props.track then output[#output].category[#output[#output].category+1] = mw.message.newRawMessage(cmodule:getMessage(contLang:getCode(), 'track-cat-wd-local'), props.prop):plain() end else -- no other choice, bail out return {} end local this_wiki = mw.getContentLanguage() local this_wiki_code = this_wiki:getCode() local langlink = (output[#output].langcode and output[#output].langcode ~= '' and output[#output].langcode ~= this_wiki_code) and mw.message.newRawMessage(conf:g('msg-langcode'), props.langcode, mw.language.fetchLanguageName(props.langcode, this_wiki_code)) or "" if short_links and props.short then output[#output].text = mw.message.newRawMessage(props.short, getLabel(nil, props.genitive, pagetitle), url, langlink, verified_value, mw.uri.encode(verified_value, 'PATH')) :plain() else output[#output].text = mw.message.newRawMessage(props.message, getLabel(nil, props.genitive, pagetitle), url, langlink, verified_value, mw.uri.encode(verified_value, 'PATH')) :plain() end end --mw.log("findSiteLinksLocal returning="..dump(output)) return output end local function addLinkback(str, property) local id = mw.wikibase.getEntityObject() if not id then return str end if type(id) == 'table' then id = id.id end local class = '' local url = '' if property then class = 'wd_' .. string.lower(property) url = mw.uri.fullUrl('d:' .. id .. '#' .. property) url.fragment = property else url = mw.uri.fullUrl('d:' .. id ) end local title = conf:g('wikidata-linkback-edit') local icon = '[%s [[File:Blue pencil.svg|%s|10px|text-top|link=]] ]' url = tostring(url) local v = mw.html.create('span') :addClass(class) :wikitext(str) :tag('span') :addClass('noprint plainlinks wikidata-linkback') :css('padding-left', '.3em') :wikitext(icon:format(url, title)) :allDone() return tostring(v) end local function getArgument(frame, argument) local args = frame.args if args[1] == nil then local pFrame = frame:getParent(); args = pFrame.args; for k,v in pairs( frame.args ) do args[k] = v; end end if args[argument] then return args[argument] end return nil end local function removeEntry(conf_claims, identifier, property) for i, props in ipairs(conf_claims) do if props[identifier] == property then table.remove(conf_claims, i) end end return conf_claims end function p.getLinks(frame) local configured_conf = getArgument(frame, conf:a('arg-conf')) if configured_conf then cmodule = require ('Module:Dış_bağlantılar/conf/'..configured_conf) else error(mw.message.newRawMessage(conf:g('missing-conf'), configured_conf):plain()) end local output = {} local category = {} local conf_claims = cmodule:getConfiguredClaims(contLang:getCode()) local limits = cmodule:getLimits() assert(limits, mw.message.newRawMessage(conf:g('missing-limits'), configured_conf):plain()) local links_shown = getArgument(frame, conf:a('arg-maxlink')) local pagetitle = getArgument(frame, conf:a('arg-title')) -- get a list of tracked properties from the article itself local requested_tracking = getArgument(frame, conf:a('arg-track')) if requested_tracking and requested_tracking ~= '' then -- the properties should be written as P1234, P2345 and other -- version corresponding to the applicable property-identifiers in the config for track_prop in string.gmatch(requested_tracking,"([^ ,;:]+)") do -- get the requested properties and be able to access them -- like req_prop['P345'] to verify if it was requested local remove_track = string.match(track_prop, "^\-(.*)") for i,claim in ipairs ( conf_claims ) do if remove_track == claim.prop or remove_track == conf:a('mod-filter-all') then -- if a property starts with "-", then we'll simply remove that -- property from the conf_claims conf_claims[i]['track'] = false elseif track_prop == claim.prop or track_prop == conf:a('mod-filter-all') then conf_claims[i]['track'] = true end end end end -- get a list of "approved" properties from the article itself local requested_properties = getArgument(frame, conf:a('arg-properties')) --mw.log("requested_properties="..dump(requested_properties)) -- assume all properties are allowed local req_prop = {} local no_req_prop = false -- we'll allow properties to be filtered for now if requested_properties and requested_properties ~= '' then -- the properties should be written as P1234, P2345 and other -- version corresponding to the applicable property-identifiers in the config for i in string.gmatch(requested_properties,"([^ ,;:]+)") do -- get the requested properties and be able to access them -- like req_prop['P345'] to verify if it was requested if i == conf:a('mod-filter-all') then -- this is a special modifier, saying we should ignore -- all previous and future positive filters and remove the -- filter (with exception of negative filters) req_prop = {} no_req_prop = true end local remove_prop = string.match(i, "^\-(.*)") if remove_prop then -- if a property starts with "-", then we'll simply remove that -- property from the conf_claims conf_claims = removeEntry(conf_claims, 'prop', remove_prop) elseif not no_req_prop then -- only if we are allowing properties to be filtered req_prop[i] = 1 -- cheat to make #req_prop indicate populated table req_prop[1] = 1 end end end local requested_langs = getArgument(frame, conf:a('arg-languages')) --mw.log("requested_langs="..dump(requested_langs)) -- assume all languages are allowed local req_lang = {} local no_req_lang = false -- we'll allow languages to be filtered for now if requested_langs and requested_langs ~= '' then -- the languages should be written as langcodes as used in the conf_claims for i in string.gmatch(requested_langs,"([^ ,;:]+)") do -- get the requested languages and be able to access them if i == conf:a('mod-filter-all') then -- this is a special modifier, saying we should ignore -- all previous and future positive filters and remove the -- filter (with exception of negative filters) req_lang = {} no_req_lang = true end -- like req_lang['en'] to verify if it was requested local remove_lang = string.match(i, "^\-(.*)") if remove_lang then -- if a language starts with "-", then we'll simply remove that -- language from the conf_claims conf_claims = removeEntry(conf_claims, 'langcode', remove_lang) elseif not no_req_lang then -- only if we are allowing languages to be filtered req_lang[i] = 1 -- cheat to make #req_lang indicate populated table req_lang[1] = 1 end end end local short_links = getArgument(frame, conf:a('arg-short')) if short_links and short_links ~= '' then short_links = true else short_links = false end local showinline = getArgument(frame, conf:a('arg-inline')) if showinline and showinline ~= '' then showinline = true else showinline = false end if not links_shown or links_shown == '' then links_shown = limits['links-shown'] and limits['links-shown'] or 10 else links_shown = tonumber(links_shown) end local somedataonwikidata = (short_links and false or true) --mw.log("conf_claims="..dump(conf_claims)) --mw.log("req_prop="..dump(req_prop)) --mw.log("req_lang="..dump(req_lang)) --mw.log("short_links="..dump(short_links)) for _, props in ipairs(conf_claims) do -- if we're called with a list of approved properties or languages, check if this one is "approved" if (#req_prop==0 or req_prop[props.prop]) and (#req_lang==0 or req_lang[props.langcode] or string.find(props.langcode, "([pP]%d+)")) then --mw.log("checking claim="..dump(props)) local links = {} local checkedonwikidata = false -- get the any local overriding value from the call local wikivalue = getArgument(frame, props.prop) --mw.log("wikivalue="..dump(wikivalue)) if (not wikivalue or wikivalue == "") and string.find(props.prop, "([pP]%d+)") then -- the property is a Pnnn type, and therefore on Wikidata links = findMainLinksOnWikidata(props, pagetitle, short_links) if links == nil then -- a nil-value indicated no wikidata-link haswikidatalink = false links = {} else checkedonwikidata = true end elseif (not wikivalue or wikivalue == "") and string.find(props.prop, "(SL%l+)") then -- this is a sitelink-type (SLspecieswiki) --mw.log("finding sitelinks..") links = findSiteLinksOnWikidata(props, pagetitle, short_links) if links == nil then -- a nil-value indicated no wikidata-link haswikidatalink = false links = {} else checkedonwikidata = true end elseif (wikivalue and wikivalue ~= "") and string.find(props.prop, "(SL%l+)") then -- this is a sitelink-type (SLspecieswiki) links = findSiteLinksLocal(props, pagetitle, short_links, wikivalue) elseif wikivalue and wikivalue ~= '' then -- the property is of another annotation, and therefore a local construct links = findMainLinksLocal(props, pagetitle, short_links, wikivalue) end --mw.log("links="..dump(links)) for _,v in ipairs(links) do -- we'll have to check langcodes again as they may have come from wikidata if (#req_lang==0 or req_lang[v.langcode]) then if checkedonwikidata and not hasdatafromwikidata then -- add a general tracking category for articles with data from wikidata hasdatafromwikidata = true category[#category+1] = cmodule:getMessage(contLang:getCode(), 'with-data-cat') elseif not checkedonwikidata and not hasdatafromlocal then -- add a general tracking category for articles with data from template-calls in local articles hasdatafromlocal = true category[#category+1] = cmodule:getMessage(contLang:getCode(), 'with-local-cat') end if short_links and props.short and v.text and v.text ~= '' then -- if short links were requested, and a short definition exists for this property, let's use it if #output==0 then output[#output+1] = v.text else output[#output] = output[#output] .. cmodule:getMessage(contLang:getCode(),'short-list-separator') .. v.text end somedataonwikidata = true elseif not short_links and not showinline and v.text and v.text ~= '' then -- only if short links were not requested output[#output+1] = (#output>=1 and conf:g('msg-ul-prepend') or '')-- if this is the first link, we won't output a list-element (msg-ul-prepend) .. (checkedonwikidata and addLinkback(v.text, props.prop) or v.text)-- if the link comes from wikidata, also output a linkback. elseif not short_links and showinline and v.text and v.text ~= '' then -- only if short links were not requested output[#output+1] = v.text end if props.track and v.category and #v.category then -- add category if tracking is on for this property and a category exists in the link-result. for _,cats in ipairs( v.category ) do category[#category+1] = cats end end if links_shown>0 then links_shown = links_shown - 1 else break end end end if links_shown==0 then break end end end local outtext = "" if short_links and #output>0 then -- if these are short links, output the whole thing with linkback to wikidata --mw.log("somedataonwikidata="..dump(somedataonwikidata).." and output="..dump(output).." and #output="..dump(#output)) outtext = (somedataonwikidata and addLinkback(table.concat(output,cmodule:getMessage(contLang:getCode(),'short-list-separator')), nil) or table.concat(output,cmodule:getMessage(contLang:getCode(),'short-list-separator'))) elseif not short_links and not showinline and #output>0 then outtext = table.concat(output,"\n") elseif not short_links and showinline and #output>0 then outtext = table.concat(output,conf:g('msg-inline-separator')) end if not hasdatafromwikidata then category[#category+1] = cmodule:getMessage(contLang:getCode(), 'no-data-cat') if not hasdatafromlocal and not short_links then outtext = cmodule:getMessage(contLang:getCode(), 'no-data-text') end end if not haswikidatalink then category[#category+1] = cmodule:getMessage(contLang:getCode(), 'no-wikilink-cat') if not hasdatafromlocal and not short_links then outtext = cmodule:getMessage(contLang:getCode(), 'no-wikilink') end end local nocategory = getArgument(frame, conf:a('arg-no-categories')) category = #category>0 and "\n" .. table.concat(category,"\n") or "" --mw.log("nocategory="..dump(nocategory).." and outtext="..dump(outtext).." and category="..dump(category)) outtext = outtext .. (nocategory and '' or category) return outtext end function p.getLanguageCode(frame) local prop = getArgument(frame, conf:a('arg-properties')) local output = getLanguageData(prop) return table.concat(output, conf:a('mod-filter-separator')) end function p.mesh(id) local res = '' if id ~= '' then res = '<span class="plainlinks">' .. '[https://meshb.nlm.nih.gov/#/record/ui?ui=' .. id .. ' ' .. id .. ']</span>' end return res end function p.jstor(id) local res = '' if id ~= '' then res = '<span class="plainlinks">' .. '[https://www.jstor.org/topic/' .. id .. ' ' .. id .. ']</span>' end return res end function p.microsoft_academic(id) local res = '' if id ~= '' then res = '<span class="plainlinks">' .. '[https://academic.microsoft.com/v2/detail/' .. id .. ' ' .. id .. ']</span>' end return res end function p.medline_plus(id) local res = '' if id ~= '' then res = '<span class="plainlinks">' .. '[https://medlineplus.gov/ency/article/' .. id .. '.htm ' .. id .. ']</span>' end return res end function p.emedicine(id) local res = '' if id ~= '' then res = '<span class="plainlinks">' .. '[https://emedicine.medscape.com/article/' .. id .. '-overview ' .. id .. ']</span>' end return res end function p.mesh(id) local res = '' if id ~= '' then res = '<span class="plainlinks">' .. '[https://meshb.nlm.nih.gov/record/ui?ui=' .. id .. ' ' .. id .. ']</span>' end return res end function p.ta(id) local res = '' if id ~= '' then res = '<span class="plainlinks">' .. '[https://ta2viewer.openanatomy.org/?id=' .. id .. ' ' .. id .. ']</span>' end return res end function p.fma(id) local res = '' if id ~= '' then res = '<span class="plainlinks">' .. '[https://bioportal.bioontology.org/ontologies/FMA/' .. '?p=classes&conceptid=http%3A%2F%2Fpurl.org%2Fsig%2Font%2Ffma%2Ffma' .. id .. ' ' .. id .. ']</span>' end return res end return p
wikipedia, wiki, viki, vikipedia, oku, kitap, kütüphane, kütübhane, ara, ara bul, bul, herşey, ne arasanız burada,hikayeler, makale, kitaplar, öğren, wiki, bilgi, tarih, yukle, izle, telefon için, turk, türk, türkçe, turkce, nasıl yapılır, ne demek, nasıl, yapmak, yapılır, indir, ücretsiz, ücretsiz indir, bedava, bedava indir, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, resim, müzik, şarkı, film, film, oyun, oyunlar, mobil, cep telefonu, telefon, android, ios, apple, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, pc, web, computer, bilgisayar
Modul belgelemesi olustur Bu Scribunto modulu icin bir belgeleme sayfasi olusturmak isteyebilirsiniz Kullanicilar denemelerini bu sablonun deneme tahtasi olustur yansitma ve test senaryosu olustur sayfalarinda yapabilirler Lutfen kategorileri alt sayfasina ekleyin Bu modul ile ilgili alt sayfalar icin buraya tiklayiniz require Module No globals local genitive require Module Genitive genitive local contLang mw language getContentLanguage local cmodule local conf require Module Dis baglantilar conf contLang getCode local hasdatafromwikidata false local hasdatafromlocal false local haswikidatalink true we assume it s connected local p local function getLabel entity use genitive pagetitle local label pagetitle and pagetitle and pagetitle or nil if not label and not entity then label mw title getCurrentTitle text elseif not label then label mw wikibase label entity id or mw title getCurrentTitle text end return use genitive and genitive label sitt or label return use genitive and label s or label end todo cleanup this is in production use the console local function dump obj return lt pre gt mw dumpObject obj lt pre gt end local function stringFormatter datavalue if datavalue nil or datavalue type string then return nil end return datavalue value end local pval pval P1793 format as a regular expression types snaktype value datatype string pval P407 language of work or name types snaktype value datatype wikibase item datavalue type wikibase entityid pval P364 original language of work types snaktype value datatype wikibase item datavalue type wikibase entityid pval P218 ISO 639 1 language types snaktype value datatype external id datavalue type string pval P305 IETF language tag types snaktype value datatype external id datavalue type string pval P582 end time types snaktype value datatype time datavalue type string This is a really makeshift crappy converter but it ll do some basic conversion from PCRE to Lua style patterns note that this only work in very few cases local function regexConverter regex local output regex output string gsub output d 2 d d output string gsub output d 3 d d d output string gsub output d 4 d d d d output string gsub output d 5 d d d d d output string gsub output d 6 d d d d d d output string gsub output d 7 d d d d d d d output string gsub output d 8 d d d d d d d d output string gsub output d d return output end local function getFormatterUrl prop value local head local tail local entity mw wikibase getEntity prop to avoid deep tests if not entity or not entity claims then return head end get the claims for this entity local statements entity claims P1630 formatter URL to avoid deep tests if not statements then return head end local formatters let s go through the claims for claim in ipairs statements do to avoid deep tests if not claim then claim end local valid claim type statement and claim rank deprecated if valid then local mainsnak claim mainsnak or local preferred claim rank preferred get any qualifiers for this claim we are interested in P1793 for indication of which claim is correct local qualifiers claim qualifiers or now let s check the qualifier we are interested in local qualid P1793 format as a regular expression if the claim has this qualifier if qualifiers qualid then it s here let s check it out local items traverse all snaks in this qualifier for qualsnak in ipairs qualifiers qualid do if qualsnak and pval qualid then mw log qualsnak dump qualsnak check if the snak is of the correct snaktype and datatype local valid qualsnak snaktype pval qualid types snaktype and qualsnak datatype pval qualid types datatype if valid then we ll have to convert the regex to Lua style local regex regexConverter qualsnak datavalue value local test string match value regex if test then it matched this is correct and overrides any other if preferred then head mainsnak datavalue value else tail mainsnak datavalue value end end end end end else we don t have any qualifier is it preferred if head and preferred or tail and not preferred then if we don t have any other use this one if preferred and head then head mainsnak datavalue value elseif not preferred and tail then tail mainsnak datavalue value end end end end end return head and head or tail end local function getLanguageData prop qid local head local tail mw log getLanguageData prop dump prop qid dump qid get the entity we are checking local entity mw wikibase getEntityObject qid to avoid deep tests if not entity then return nil end if not entity claims then return end get the claims for this entity local statements entity claims prop to avoid deep tests if not statements then return end mw log getLanguageData going through claims dump statements let s go through the claims for claim in ipairs statements do to avoid deep tests if not claim then claim end local valid claim type statement and claim rank deprecated if valid then local mainsnak claim mainsnak or local preferred claim rank preferred verify the item is what we expect local valid mainsnak snaktype pval prop types snaktype and mainsnak datatype pval prop types datatype and mainsnak datavalue type pval prop types datavalue type if valid then mw log getLanguageData claim is valid dump claim if this is the correct P value dive into it and get P218 ISO 639 1 if mainsnak property P364 then original language of work if preferred then head head 1 table concat getLanguageData P218 Q mainsnak datavalue value numeric id conf a mod filter separator else tail tail 1 table concat getLanguageData P218 Q mainsnak datavalue value numeric id conf a mod filter separator end elseif mainsnak property P218 or mainsnak property P305 then ISO 639 1 code or IETF language tag if preferred then head head 1 stringFormatter mainsnak datavalue else tail tail 1 stringFormatter mainsnak datavalue end end end end end mw log getLanguageData returning head dump head tail dump tail return head gt 0 and head or tail end local langqvalorder P407 P364 local otherqvalorder P582 local function getValuesFromWikidata props local head local tail mw log getValuesFromWikidata props dump props get the entity we are checking local entity mw wikibase getEntityObject to avoid deep tests if not entity then mw log getValuesFromWikidata no entity return nil end if not entity claims or not props or not props prop or props prop then mw log getValuesFromWikidata no claims or no props return end get the claims for this entity local statements entity claims props prop to avoid deep tests if not statements then return end let s go through the claims for claim in ipairs statements do to avoid deep tests if not claim then claim end local valid claim type statement and claim rank deprecated if valid then mw log getValuesFromWikidata valid claim dump claim local mainsnak claim mainsnak or local preferred claim rank preferred get the content of the claim the identifier local langcode props langcode local checklangcode nil if props langcode and props langcode then checklangcode string find langcode pP d end if checklangcode and checklangcode then this is a P value for language code so we ll check qualifiers for languagedata first get any qualifiers local qualifiers claim qualifiers or for qualid in ipairs langqvalorder do if the claim has this qualifier if qualifiers qualid then it s here let s check it out local items traverse all snaks in this qualifier for qualsnak in ipairs qualifiers qualid do if qualsnak and pval qualid then mw log qualsnak dump qualsnak check if the snak is of the correct snaktype and datatype local valid qualsnak snaktype pval qualid types snaktype and qualsnak datatype pval qualid types datatype if valid then now get the actual data langcode table concat getLanguageData P305 Q qualsnak datavalue value numeric id end end end end mw log langcode is now dump langcode end if string find langcode pP d then we still don t have any langcode so we default to en langcode nil end end local stillvalid true we should check a couple of other qualifiers as well first get any qualifiers local qualifiers claim qualifiers or for qualid in ipairs otherqvalorder do if the claim has this qualifier if qualifiers qualid then it s here let s check it out local items traverse all snaks in this qualifier for qualsnak in ipairs qualifiers qualid do if qualsnak and pval qualid then mw log qualsnak dump qualsnak check if the snak is of the correct snaktype and datatype local valid qualsnak snaktype pval qualid types snaktype and qualsnak datatype pval qualid types datatype if not valid then sorry this is not correct mw log qualsnak INCORRECT stillvalid false end end end end mw log langcode is now dump langcode end if stillvalid then if preferred then head head 1 value stringFormatter mainsnak datavalue if langcode and langcode then head head langcode langcode end else tail tail 1 value stringFormatter mainsnak datavalue if langcode and langcode then tail tail langcode langcode end end end end end mw log getValuesFromWikidata returning head dump head tail dump tail return head gt 0 and head or tail end local function findMainLinksOnWikidata props pagetitle short links local output local pid nil get the entity we are checking local entity mw wikibase getEntityObject to avoid deep tests if not entity then return nil end local values getValuesFromWikidata props for value in ipairs values do local verified value nil if props regex then we have a local defined regex so this will have to pass first maybe we ll have to convert the regex to Lua style local regex regexConverter props regex local test string match value value regex mw log testing with regex and test dump test and value id if test then it matched this is correct and overrides any other verified value value value end else verified value value value end if verified value then local url output output 1 output output langcode value langcode output output category if props url f then we have a local defined url formatter function use it as first priority url props url f verified value if props track and not string find props langcode pP d then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat local wd props prop plain elseif props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat wd wd props prop plain end elseif props url then we have a local defined url formatter string use it as second priority url mw message newRawMessage props url verified value plain if props track and not string find props langcode pP d then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat local wd props prop plain elseif props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat wd wd props prop plain end else get the formatvalue from the property if it exists local formatterUrl getFormatterUrl props prop verified value if formatterUrl then url mw message newRawMessage formatterUrl verified value plain if props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat wd wd props prop plain end end end if url then local this wiki mw getContentLanguage local this wiki code this wiki getCode local langlink value langcode and value langcode and value langcode this wiki code and mw message newRawMessage conf g msg langcode value langcode mw language fetchLanguageName value langcode this wiki code or if short links and props short then output output text mw message newRawMessage props short getLabel entity props genitive pagetitle url langlink verified value mw uri encode verified value PATH plain else output output text mw message newRawMessage props message getLabel entity props genitive pagetitle url langlink verified value mw uri encode verified value PATH plain end end end end mw log findMainLinksOnWikidata returning dump output return output end local function getSitelinksFromWikidata props entity local output mw log getSitelinksFromWikidata props dump props to avoid deep tests if not entity then entity mw wikibase getEntityObject if not entity then mw log getSitelinksFromWikidata no entity return nil end end local requested sitelink string match props prop SL l local sitelinks entity getSitelink requested sitelink if sitelinks and sitelinks then output output 1 value sitelinks end mw log getSitelinksFromWikidata returning output dump output return output end local function findSiteLinksOnWikidata props pagetitle short links local output local pid nil get the entity we are checking local entity mw wikibase getEntityObject to avoid deep tests if not entity then return nil end local values getSitelinksFromWikidata props for value in ipairs values do local verified value nil if props regex then we have a local defined regex so this will have to pass first maybe we ll have to convert the regex to Lua style local regex regexConverter props regex local test string match value value regex mw log testing with regex and test dump test and value id if test then it matched this is correct and overrides any other verified value value value end else verified value value value end if verified value then mw log it s verified local url output output 1 output output langcode value langcode output output category if props url f then we have a local defined url formatter function use it as first priority url props url f verified value if props track and not string find props langcode SL l then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat local wd props prop plain elseif props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat wd wd props prop plain end elseif props url then we have a local defined url formatter string use it as second priority url mw message newRawMessage props url verified value plain if props track and not string find props langcode SL l then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat local wd props prop plain elseif props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat wd wd props prop plain end else url verified value gsub if props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat wd wd props prop plain end end if url then local this wiki mw getContentLanguage local this wiki code this wiki getCode local langlink value langcode and value langcode and value langcode this wiki code and mw message newRawMessage conf g msg langcode value langcode mw language fetchLanguageName value langcode this wiki code or if short links and props short then output output text mw message newRawMessage props short getLabel entity props genitive pagetitle url langlink verified value mw uri encode verified value PATH plain else output output text mw message newRawMessage props message getLabel entity props genitive pagetitle url langlink verified value mw uri encode verified value PATH plain end end end end mw log findSiteLinksOnWikidata returning dump output return output end local function findMainLinksLocal props pagetitle short links local value local output to avoid deep tests if not props prop then return nil end if not local value or local value then bail out if no value is present return output end get the formatvalue from the property local verified value local value if props regex and props regex then let s verify the id maybe we ll have to convert the regex to Lua style local regex regexConverter props regex local test string match local value regex if test then it matched this is correct verified value local value else verified value nil end end if not verified value then return output end local wikidata property string find props prop pP d local wikidata values if wikidata property then get any wikidata values to see if they are equal to local values wikidata values getValuesFromWikidata props end if wikidata property or props url and props url or props url f then output output 1 output output langcode string find props langcode pP d and or props langcode mw log findMainLinksLocal props dump props langcode output output langcode output output category local url if props track and wikidata property and wikidata values and wikidata values then local local value in wikidata false for value in ipairs wikidata values do if value value verified value then local value in wikidata true end end output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode local value in wikidata and track cat local wd equal or track cat local wd unequal props prop plain end if wikidata property and wikidata values and wikidata values then hasdatafromwikidata true signal up the chain this article has a wikidata claim end if props url f then we have a local defined url formatter function use it as first priority url props url f verified value if props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat local local props prop plain end elseif props url then we have a local defined url formatter string use it as second priority url mw message newRawMessage props url verified value plain if props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat local local props prop plain end elseif wikidata property then get the formatvalue from the property if it exists local formatterUrl getFormatterUrl props prop verified value if formatterUrl then url mw message newRawMessage formatterUrl verified value plain if props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat wd local props prop plain end end else no other choice bail out return end local this wiki mw getContentLanguage local this wiki code this wiki getCode local langlink output output langcode and output output langcode and output output langcode this wiki code and mw message newRawMessage conf g msg langcode props langcode mw language fetchLanguageName props langcode this wiki code or if short links and props short then output output text mw message newRawMessage props short getLabel nil props genitive pagetitle url langlink verified value mw uri encode verified value PATH plain else output output text mw message newRawMessage props message getLabel nil props genitive pagetitle url langlink verified value mw uri encode verified value PATH plain end end mw log findMainLinksLocal returning dump output return output end local function findSiteLinksLocal props pagetitle short links local value local output to avoid deep tests if not props prop then return nil end if not local value or local value then bail out if no value is present return output end get the formatvalue from the property local verified value local value if props regex and props regex then let s verify the id maybe we ll have to convert the regex to Lua style local regex regexConverter props regex local test string match local value regex if test then it matched this is correct verified value local value else verified value nil end end if not verified value then return output end local wikidata property string find props prop SL local wikidata values if wikidata property then get any wikidata values to see if they are equal to local values wikidata values getSitelinksFromWikidata props end if wikidata property or props url and props url or props url f then output output 1 output output langcode string find props langcode SL and or props langcode mw log findSiteLinksLocal props dump props langcode output output langcode wikidata values dump wikidata values output output category local url if props track and wikidata property and wikidata values and wikidata values then local local value in wikidata false for value in ipairs wikidata values do if value value verified value then local value in wikidata true end end output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode local value in wikidata and track cat local wd equal or track cat local wd unequal props prop plain end if wikidata property and wikidata values and wikidata values then hasdatafromwikidata true signal up the chain this article has a wikidata claim end if props url f then we have a local defined url formatter function use it as first priority url props url f verified value if props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat local local props prop plain end elseif props url then we have a local defined url formatter string use it as second priority url mw message newRawMessage props url verified value plain if props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat local local props prop plain end elseif wikidata property then url verified value gsub if props track then output output category output output category 1 mw message newRawMessage cmodule getMessage contLang getCode track cat wd local props prop plain end else no other choice bail out return end local this wiki mw getContentLanguage local this wiki code this wiki getCode local langlink output output langcode and output output langcode and output output langcode this wiki code and mw message newRawMessage conf g msg langcode props langcode mw language fetchLanguageName props langcode this wiki code or if short links and props short then output output text mw message newRawMessage props short getLabel nil props genitive pagetitle url langlink verified value mw uri encode verified value PATH plain else output output text mw message newRawMessage props message getLabel nil props genitive pagetitle url langlink verified value mw uri encode verified value PATH plain end end mw log findSiteLinksLocal returning dump output return output end local function addLinkback str property local id mw wikibase getEntityObject if not id then return str end if type id table then id id id end local class local url if property then class wd string lower property url mw uri fullUrl d id property url fragment property else url mw uri fullUrl d id end local title conf g wikidata linkback edit local icon s File Blue pencil svg s 10px text top link url tostring url local v mw html create span addClass class wikitext str tag span addClass noprint plainlinks wikidata linkback css padding left 3em wikitext icon format url title allDone return tostring v end local function getArgument frame argument local args frame args if args 1 nil then local pFrame frame getParent args pFrame args for k v in pairs frame args do args k v end end if args argument then return args argument end return nil end local function removeEntry conf claims identifier property for i props in ipairs conf claims do if props identifier property then table remove conf claims i end end return conf claims end function p getLinks frame local configured conf getArgument frame conf a arg conf if configured conf then cmodule require Module Dis baglantilar conf configured conf else error mw message newRawMessage conf g missing conf configured conf plain end local output local category local conf claims cmodule getConfiguredClaims contLang getCode local limits cmodule getLimits assert limits mw message newRawMessage conf g missing limits configured conf plain local links shown getArgument frame conf a arg maxlink local pagetitle getArgument frame conf a arg title get a list of tracked properties from the article itself local requested tracking getArgument frame conf a arg track if requested tracking and requested tracking then the properties should be written as P1234 P2345 and other version corresponding to the applicable property identifiers in the config for track prop in string gmatch requested tracking do get the requested properties and be able to access them like req prop P345 to verify if it was requested local remove track string match track prop for i claim in ipairs conf claims do if remove track claim prop or remove track conf a mod filter all then if a property starts with then we ll simply remove that property from the conf claims conf claims i track false elseif track prop claim prop or track prop conf a mod filter all then conf claims i track true end end end end get a list of approved properties from the article itself local requested properties getArgument frame conf a arg properties mw log requested properties dump requested properties assume all properties are allowed local req prop local no req prop false we ll allow properties to be filtered for now if requested properties and requested properties then the properties should be written as P1234 P2345 and other version corresponding to the applicable property identifiers in the config for i in string gmatch requested properties do get the requested properties and be able to access them like req prop P345 to verify if it was requested if i conf a mod filter all then this is a special modifier saying we should ignore all previous and future positive filters and remove the filter with exception of negative filters req prop no req prop true end local remove prop string match i if remove prop then if a property starts with then we ll simply remove that property from the conf claims conf claims removeEntry conf claims prop remove prop elseif not no req prop then only if we are allowing properties to be filtered req prop i 1 cheat to make req prop indicate populated table req prop 1 1 end end end local requested langs getArgument frame conf a arg languages mw log requested langs dump requested langs assume all languages are allowed local req lang local no req lang false we ll allow languages to be filtered for now if requested langs and requested langs then the languages should be written as langcodes as used in the conf claims for i in string gmatch requested langs do get the requested languages and be able to access them if i conf a mod filter all then this is a special modifier saying we should ignore all previous and future positive filters and remove the filter with exception of negative filters req lang no req lang true end like req lang en to verify if it was requested local remove lang string match i if remove lang then if a language starts with then we ll simply remove that language from the conf claims conf claims removeEntry conf claims langcode remove lang elseif not no req lang then only if we are allowing languages to be filtered req lang i 1 cheat to make req lang indicate populated table req lang 1 1 end end end local short links getArgument frame conf a arg short if short links and short links then short links true else short links false end local showinline getArgument frame conf a arg inline if showinline and showinline then showinline true else showinline false end if not links shown or links shown then links shown limits links shown and limits links shown or 10 else links shown tonumber links shown end local somedataonwikidata short links and false or true mw log conf claims dump conf claims mw log req prop dump req prop mw log req lang dump req lang mw log short links dump short links for props in ipairs conf claims do if we re called with a list of approved properties or languages check if this one is approved if req prop 0 or req prop props prop and req lang 0 or req lang props langcode or string find props langcode pP d then mw log checking claim dump props local links local checkedonwikidata false get the any local overriding value from the call local wikivalue getArgument frame props prop mw log wikivalue dump wikivalue if not wikivalue or wikivalue and string find props prop pP d then the property is a Pnnn type and therefore on Wikidata links findMainLinksOnWikidata props pagetitle short links if links nil then a nil value indicated no wikidata link haswikidatalink false links else checkedonwikidata true end elseif not wikivalue or wikivalue and string find props prop SL l then this is a sitelink type SLspecieswiki mw log finding sitelinks links findSiteLinksOnWikidata props pagetitle short links if links nil then a nil value indicated no wikidata link haswikidatalink false links else checkedonwikidata true end elseif wikivalue and wikivalue and string find props prop SL l then this is a sitelink type SLspecieswiki links findSiteLinksLocal props pagetitle short links wikivalue elseif wikivalue and wikivalue then the property is of another annotation and therefore a local construct links findMainLinksLocal props pagetitle short links wikivalue end mw log links dump links for v in ipairs links do we ll have to check langcodes again as they may have come from wikidata if req lang 0 or req lang v langcode then if checkedonwikidata and not hasdatafromwikidata then add a general tracking category for articles with data from wikidata hasdatafromwikidata true category category 1 cmodule getMessage contLang getCode with data cat elseif not checkedonwikidata and not hasdatafromlocal then add a general tracking category for articles with data from template calls in local articles hasdatafromlocal true category category 1 cmodule getMessage contLang getCode with local cat end if short links and props short and v text and v text then if short links were requested and a short definition exists for this property let s use it if output 0 then output output 1 v text else output output output output cmodule getMessage contLang getCode short list separator v text end somedataonwikidata true elseif not short links and not showinline and v text and v text then only if short links were not requested output output 1 output gt 1 and conf g msg ul prepend or if this is the first link we won t output a list element msg ul prepend checkedonwikidata and addLinkback v text props prop or v text if the link comes from wikidata also output a linkback elseif not short links and showinline and v text and v text then only if short links were not requested output output 1 v text end if props track and v category and v category then add category if tracking is on for this property and a category exists in the link result for cats in ipairs v category do category category 1 cats end end if links shown gt 0 then links shown links shown 1 else break end end end if links shown 0 then break end end end local outtext if short links and output gt 0 then if these are short links output the whole thing with linkback to wikidata mw log somedataonwikidata dump somedataonwikidata and output dump output and output dump output outtext somedataonwikidata and addLinkback table concat output cmodule getMessage contLang getCode short list separator nil or table concat output cmodule getMessage contLang getCode short list separator elseif not short links and not showinline and output gt 0 then outtext table concat output n elseif not short links and showinline and output gt 0 then outtext table concat output conf g msg inline separator end if not hasdatafromwikidata then category category 1 cmodule getMessage contLang getCode no data cat if not hasdatafromlocal and not short links then outtext cmodule getMessage contLang getCode no data text end end if not haswikidatalink then category category 1 cmodule getMessage contLang getCode no wikilink cat if not hasdatafromlocal and not short links then outtext cmodule getMessage contLang getCode no wikilink end end local nocategory getArgument frame conf a arg no categories category category gt 0 and n table concat category n or mw log nocategory dump nocategory and outtext dump outtext and category dump category outtext outtext nocategory and or category return outtext end function p getLanguageCode frame local prop getArgument frame conf a arg properties local output getLanguageData prop return table concat output conf a mod filter separator end function p mesh id local res if id then res lt span class plainlinks gt https meshb nlm nih gov record ui ui id id lt span gt end return res end function p jstor id local res if id then res lt span class plainlinks gt https www jstor org topic id id lt span gt end return res end function p microsoft academic id local res if id then res lt span class plainlinks gt https academic microsoft com v2 detail id id lt span gt end return res end function p medline plus id local res if id then res lt span class plainlinks gt https medlineplus gov ency article id htm id lt span gt end return res end function p emedicine id local res if id then res lt span class plainlinks gt https emedicine medscape com article id overview id lt span gt end return res end function p mesh id local res if id then res lt span class plainlinks gt https meshb nlm nih gov record ui ui id id lt span gt end return res end function p ta id local res if id then res lt span class plainlinks gt https ta2viewer openanatomy org id id id lt span gt end return res end function p fma id local res if id then res lt span class plainlinks gt https bioportal bioontology org ontologies FMA p classes amp conceptid http 3A 2F 2Fpurl org 2Fsig 2Font 2Ffma 2Ffma id id lt span gt end return res end return p