编辑“
Module:WikidataLink
”
跳转到导航
跳转到搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
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 ) context["isExist"]= (arg["$exist$"] and arg["$exist$"]==1) or ilh.isExist(context["localPage"]) 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;
摘要:
请注意,您对Positive WiKi的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Positive WiKi:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)
本页使用的模板:
Module:WikidataLink/doc
(
编辑
)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
模块
讨论
English
查看
阅读
编辑源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息