Editing
Module:WikidataLink
Jump to navigation
Jump to search
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
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;
Summary:
Please note that all contributions to wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Wiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Navigation menu
Personal tools
Not logged in
Talk
Contributions
Create account
Log in
Namespaces
Page
Discussion
English
Views
Read
Edit
View history
More
Search
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Tools
What links here
Related changes
Special pages
Page information