Module:WikidataLink
local p={} local lib_arg={}; local ilh = {} local TrackingCategory = {} local yesno = {} local lib_va = {} local wiki_db = {} local wikidata_entity_namespaces = {['e']='EntitySchema', ['l']='Lexeme', ['p']='Property', ['q']=} local wikidata_namespaces_support = {['p']=true, ['q']=true} local project_table = { commons = ".wikimedia", meta = ".wikimedia", species = ".wikimedia" }
function p.title2entity(frame) local args, working_frame
if frame == mw.getCurrentFrame() then -- We're being called via #invoke. The args are passed through to the module -- from the template page, so use the args that were passed into the template. if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end args = lib_arg.getArgs(frame, {parentFirst=true}) working_frame = frame else -- We're being called from another module or from the debug console, so assume -- the args are passed in directly. args = frame working_frame = mw.getCurrentFrame() if type(args) ~= type({}) then args = {frame} end end
if type(yesno) ~= type(type) then yesno = require('Module:Yesno') end
local with_nodata = yesno(args['with_nodata'] or args['with nodata']) local input_title = mw.text.trim(tostring(args['1'] or args[1] or )) --如果內容為空,取消計算,回傳本模板所在頁面的維基數據項目 if mw.text.trim(input_title) == then return mw.wikibase.getEntityIdForCurrentPage() or end local entity_id = mw.wikibase.getEntityIdForTitle(input_title) if entity_id then return tostring(entity_id) end local title_obj = mw.title.new(input_title) --如果條目存在 if (title_obj or {}).exists == true then --檢查原始頁面是否有維基數據項目 local title_id = mw.wikibase.getEntityIdForTitle(title_obj.prefixedText) --如果有,則回傳 if title_id then return title_id end --如果目標頁是重新導向頁 title_obj = title_obj.redirectTarget --回傳目標頁的維基數據項目 if title_obj and type(title_obj)==type({"table"}) then entity_id = mw.wikibase.getEntityIdForTitle(title_obj.prefixedText) end return entity_id end --如果本身已經是維基數據項目 local start,tail = mw.ustring.find(input_title,'[qQ]%d+') if start then local in_id = 'Q' .. mw.ustring.sub(input_title,start+1,tail) if mw.wikibase.getLabel(in_id) ~= nil then return in_id else return end end local try_parse = mw.ustring.gsub(input_title,'[.,]',)
if with_nodata then --提供無值時,又不自我指向的數值 if mw.ustring.lower(input_title) == "noentity" then return 'Q28343326' end--無值 end
if type(lib_va.redirect_target) ~= type(type) then lib_va = require('Module:Va') end
--如果目標頁是繁簡差異的自動重新導向頁 title_obj = mw.title.new(lib_va.redirect_target(input_title)) --如果檢查繁簡差異後發現頁面存在 if (title_obj or {}).exists == true then --嘗試取得存在之頁面的維基數據項目 local title_id = mw.wikibase.getEntityIdForTitle(title_obj.prefixedText) --如果項目存在,則返回數值 if title_id then return title_id end end
--嘗試讀取數字是否為維基數據項目 start,tail = mw.ustring.find(try_parse,'%d+') if start then local parseNum = tonumber(mw.ustring.sub(try_parse,start,tail) or '0') or 0
if mw.wikibase.getLabel('Q'..parseNum) ~= nil then return 'Q'..parseNum
else return end end --是非空字串,但都不是的情況 if mw.text.trim(try_parse) ~= then return end --如果以上條件都不滿足,回傳本模板所在頁面的維基數據項目 return mw.wikibase.getEntityIdForCurrentPage() or
end function _wikidata_ilh(arg) if type(ilh._ilh) ~= type(type) then ilh = require('Module:Ilh') end if type(yesno) ~= type(type) then yesno = require('Module:Yesno') end local context={} context["isMainPage"]=ilh.isMainPage() context["localPage"]=arg[1] context["foreignPage"]=arg[2] or arg[1] --如果{{{2}}}不传入的话 local _d=arg["d"] local _1=arg[1] or arg["1"] local _3=arg[3] or arg["3"] local dpN1=_3 or _d context["displayName"]=(dpN1 and {dpN1} or {_1})[1] context["langCode"]=arg["lang-code"] context["lang"]=arg["lang"] context["nocat"]=yesno( arg["nocat"] , false )
local frame=mw.getCurrentFrame() -- 使用{{#ifexist}}而不是Lua的exists来兼容MediaWiki的自动简繁重定向 -- 见Special:PermaLink/85517269#不蓝不绿的绿链问题 local existsFunc = function (pageName) return frame:callParserFunction('#ifexist',{pageName,'true','false'}) end
context["isExist"]= (arg["$exist$"] and arg["$exist$"]==1) or (existsFunc(context["localPage"])=='true')
local curPage_obj=mw.title.getCurrentTitle() context["isNoCatWithNamespace"]=curPage_obj:inNamespaces(2,828) --User,Module --context["curPageNamespace"]=curPage_obj.namespace
return (context["isMainPage"] and ilh.onlyLink(context)) or ilh.functionLink(context) end local function getEntitySitelink(entity) local sitelinks = (entity or {}).sitelinks if sitelinks then local i = 0 for _,__ in pairs(sitelinks) do i = i + 1 end if i <= 0 then return nil, nil end if not wiki_db.data then wiki_db = mw.loadData('Module:NUMBEROF/data') end local db_map, db_data = wiki_db.map, wiki_db.data if not db_map or not db_data then return nil, nil end local max_lang, max_sitelinkObj, max_article = nil, nil, -1 for lang, sitelinkObj in pairs(sitelinks) do local lang_name = lang:match("^(.+)wiki$") if lang_name and lang_name ~= "commons" then local wikiCountObj = db_data[lang_name..(project_table[lang_name] or '.wikipedia')] if wikiCountObj then local wikiCount = tonumber(wikiCountObj[db_map.articles]) if type(wikiCount) == type(0) then if wikiCount > max_article then max_article = wikiCount max_lang = lang_name max_sitelinkObj = sitelinkObj end end end end end if max_sitelinkObj then return max_lang, max_sitelinkObj.title end end return nil, nil end local function getEntityLabel(entity) local label = entity:getLabel() if not label then labels = entity.labels if not labels then return nil end local i = 0 for _,__ in pairs(labels) do i = i + 1 end if i <= 0 then return nil end if not wiki_db.data then wiki_db = mw.loadData('Module:NUMBEROF/data') end local db_map, db_data = wiki_db.map, wiki_db.data if not db_map or not db_data then return nil end local max_lang, max_labelObj, max_article = nil, nil, -1 for lang, labelObj in pairs(labels) do local wikiCountObj = db_data[lang..(project_table[lang_name] or '.wikipedia')] if wikiCountObj then local wikiCount = tonumber(wikiCountObj[db_map.articles]) if type(wikiCount) == type(0) then if wikiCount > max_article then max_article = wikiCount max_lang = lang max_labelObj = labelObj end end end end return (max_labelObj or {}).value end return label end
function p._getWikidataLink(wikidata_id, find_lang, display_text, articlename, templateflag) local display_code = display_text or local display_linkcode = (mw.text.trim(display_code) ~= )and ('|'..display_code) or display_code
local namescape_end = mw.ustring.find(wikidata_id ,":") local g_namespace = namescape_end and mw.ustring.sub(wikidata_id, 1, namescape_end-1) or
local namespace_head = mw.ustring.sub(wikidata_id,1,1):lower() local entity_namespace = wikidata_entity_namespaces[namespace_head] or local wikidata_pagename = entity_namespace .. ((mw.text.trim(entity_namespace)~=)and ':' or ) .. wikidata_id if mw.text.trim(g_namespace)~= then wikidata_pagename = wikidata_id entity_namespace = g_namespace namespace_head = g_namespace end if wikidata_namespaces_support[mw.ustring.lower(namespace_head)] then if mw.wikibase.entityExists( wikidata_id ) then local entity = mw.wikibase.getEntity( wikidata_id ) if mw.text.trim(entity:getSitelink() or ) ~= then if templateflag == "link-wd" then --all pass to Module:ilh else return '' .. entity:getSitelink() .. display_linkcode .. '' end end local interwiki = 'd' local interwikiPage = wikidata_pagename local force_wikidata = false for ____,value in ipairs(find_lang) do if mw.text.trim(entity:getSitelink( value ) or ) ~= then interwiki, interwikiPage = value, entity:getSitelink( value ) break elseif mw.text.trim(entity:getSitelink( value .. 'wiki' ) or ) ~= then interwiki, interwikiPage = value, entity:getSitelink( value .. 'wiki' ) break elseif value == 'wikidata' then interwiki = 'd' force_wikidata = true end end if interwiki == 'd' then local l_interwikiPage = interwikiPage interwiki, interwikiPage = getEntitySitelink(entity) interwiki, interwikiPage = (interwiki or 'd'), (interwikiPage or l_interwikiPage) if force_wikidata then interwiki = 'd' end if interwiki == 'd' then interwikiPage = wikidata_pagename end end if interwiki ~= 'd' then local lang = mw.language.fetchLanguageName( interwiki, mw.getContentLanguage():getCode() ) if (lang or ) ~= then return _wikidata_ilh({ [1] = articlename or getEntityLabel(entity) or interwikiPage, [2] = interwikiPage, [3] = (mw.text.trim(display_code) ~= )and display_code or nil, ['lang'] = lang, ['lang-code'] = interwiki }) end end local eLabel = entity:getLabel() if mw.text.trim(eLabel or ) == then eLabel = interwikiPage end local result = _wikidata_ilh({ [1] = articlename or eLabel, [2] = interwikiPage, [3] = (mw.text.trim(display_code) ~= )and display_code or nil, ['lang'] = '維基數據', ['lang-code'] = interwiki }) return mw.ustring.gsub(result,'(>維基數據)(<)','%1%2') else return wikidata_id end end local page_name = (type(find_lang) == type("string")) and find_lang or wikidata_id local result = _wikidata_ilh({ [1] = articlename or page_name, [2] = wikidata_pagename, [3] = (mw.text.trim(display_code) ~= )and display_code or nil, ['lang'] = '維基數據', ['lang-code'] = 'd' }) return mw.ustring.gsub(result,'(>維基數據)(<)','%1%2') end function p.linkwikidata(frame) local args, working_frame
if frame == mw.getCurrentFrame() then -- We're being called via #invoke. The args are passed through to the module -- from the template page, so use the args that were passed into the template. if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end args = lib_arg.getArgs(frame, {parentFirst=true}) working_frame = frame else -- We're being called from another module or from the debug console, so assume -- the args are passed in directly. args = frame working_frame = mw.getCurrentFrame() if type(args) ~= type({}) then args = {frame} end end local input_article = args[1] or args['1'] or args.id or local find_lang_str = args[2] or args['2'] or args.lang or args.langs or 'en,de,fr,ja' local find_lang = mw.text.split(find_lang_str, ',') or {} if #find_lang <= 1 then find_lang[1] = find_lang_str end
local result = mw.ustring.gsub(input_article,'([Qq][%d]+)',function(wikidata_id) return p._getWikidataLink(wikidata_id, find_lang) end) return result end
function p.linkwikidata_single(frame) local args, working_frame
if frame == mw.getCurrentFrame() then -- We're being called via #invoke. The args are passed through to the module -- from the template page, so use the args that were passed into the template. if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end args = lib_arg.getArgs(frame, {parentFirst=true}) working_frame = frame else -- We're being called from another module or from the debug console, so assume -- the args are passed in directly. args = frame working_frame = mw.getCurrentFrame() if type(args) ~= type({}) then args = {frame} end end local input_article = args[1] or args['1'] or args.id or local find_lang_str = args[3] or args['3'] or args.lang or args.langs or 'en,de,fr,ja' local input_display = args[2] or args['2'] local articlename = args.page or args.pagename or args.page_name or args['page name'] or args.articlename or args.article_name or args['article name'] or if mw.text.trim(articlename) == then articlename = nil end local find_lang = mw.text.split(find_lang_str, ',') or {} if #find_lang <= 1 then find_lang[1] = find_lang_str end local namescape_end = mw.ustring.find(input_article ,":")
local g_namespace = namescape_end and mw.ustring.sub(input_article, 1, namescape_end-1) or
local namespace_head = mw.ustring.sub(input_article,1,1):lower() if mw.text.trim(g_namespace)~= then namespace_head = g_namespace end
local title_check = ((mw.text.trim(args.title or )~=)and args.title or find_lang_str)
local result=p._getWikidataLink(input_article, (((not wikidata_namespaces_support[mw.ustring.lower(namespace_head)]) or mw.text.trim(g_namespace)~=) and not(({mw.ustring.find(title_check,',')})[1])) and title_check or find_lang, input_display, articlename, "link-wd")
return result end return p;