Modul:Wikibase signature
--- Get Wikibase items signatures -- @license (CC-BY-SA-3.0) -- @copyright John Erling Blad <jeblad@gmail.com> -- @provenance https://en.wikipedia.org/w/index.php?title=Module:Wikibase&oldid=722062922
local _sites = mw.loadData('Modul:Wikibase signature/conf')
-- @var The table holding this modules exported members local p = {}
function p.fetchEntity( str, group, code ) str = (type( str ) == 'string') and mw.text.trim( str ) or str group = (type( group ) == 'string') and mw.text.trim( group ) or group code = (type( code ) == 'string') and mw.text.trim( code ) or code
if type( str ) == 'nil' or str == then return mw.wikibase.getEntityObject(), 'nowiki', , str end
if mw.ustring.find( str, "^[FLMPQS]%d+$" ) then local initial = mw.ustring.sub( str, 1, 1 ) if initial == 'Q' then return mw.wikibase.getEntityObject( str ), 'wikidatawiki', 'd:', str elseif initial == 'P' then return mw.wikibase.getEntityObject( str ), 'wikidatawiki', 'd:property:', str else error( "Not implemented!" ) return end end
local fullStr = str local first, last = mw.ustring.find( str, '^[^:]*:') if first then group = mw.ustring.sub( str, first, last-1 ) if _sites[group] then str = mw.ustring.sub( str, last+1 ) if type( _sites[group] ) == 'string' then group = _sites[group] end if type( _sites[group] ) == 'table' then first, last = mw.ustring.find( str, '^[^:]*:') if first then code = mw.ustring.sub( str, first, last-1 ) if _sites[group][code] then str = mw.ustring.sub( str, last+1 ) end end end end end
local site = _sites[group or 'wikipedia'] local siteId = (type(site) == 'table' and site[code or 'no']) or site
local id = ( mw.ustring.find( str, "^[PQ]%d+$" ) and str ) or ( str and not(siteId) and mw.wikibase.getEntityIdForTitle( str ) ) or ( str and siteId and mw.wikibase.getEntityIdForTitle( str, siteId ) ) or nil
local entity = ( id and mw.wikibase.getEntityObject( id ) ) or ( not(str) and mw.wikibase.getEntityObject() ) or nil
local prefix = mw.ustring.sub( fullStr, 1, -(mw.ustring.len( str )+1) )
return entity, siteId, prefix, str end
-- Wikipedia should always have mw.wikibase, but the code can be used outside wm-wikis assert( mw.wikibase, "can not find mw.wikibase" )
--- get the item ID of the item linked to the current page -- @param table frame from the call -- @return string id of the item function p.id(frame) frame = frame or mw.getCurrentFrame()
local str = frame.args[1]
local entity = p.fetchEntity( str ) if not entity then return end
return entity.id end
--- get the label of a given item, title, or of the connected page -- if no argument is provided -- @param table frame from the call -- @return string label from the item function p.label(frame) frame = frame or mw.getCurrentFrame()
local str = frame.args[1] local langCode = frame.args[2]
local entity = p.fetchEntity( str ) if not entity then return end
return langCode and entity:getLabel( langCode ) or entity:getLabel() end
--- get the description of a given item, local title, or the connected page -- if no argument is provided -- @param table frame from the call -- @return string description from the item function p.description(frame) frame = frame or mw.getCurrentFrame()
local str = frame.args[1] local langCode = frame.args[2]
local entity = p.fetchEntity( str ) if not entity then return end
return langCode and entity:getDescription( langCode ) or entity:getDescription() end
--- get the local page for a given item, local title, or the connected page -- if no argument is provided -- @param table frame from the call -- @return string page title from the item function p.page(frame) frame = frame or mw.getCurrentFrame()
local str = frame.args[1] local langCode = frame.args[2] langCode = (type( langCode ) == 'string') and mw.text.trim( langCode ) or langCode langCode = langCode ~= and langCode or nil
local entity, siteId, prefix, str = p.fetchEntity( str ) if entity then local title = ( siteId and ( entity and entity:getSitelink( siteId ) ) ) or ( not(siteId) and ( entity and entity:getSitelink() ) ) or ( (siteId == 'wikidatawiki') and (str) ) or nil if title then local text = ( langCode and ( entity and entity:getLabel( langCode ) ) ) or ( not(langCode) and ( entity and entity:getLabel() ) ) or title return mw.ustring.format( '%s', prefix, title, title ) ..( (text ~= title) and mw.ustring.format( ' (%s)', text ) or ) end end
--local text = mw.ustring.sub( str, prefixLength+1 ) return mw.ustring.format( '%s', prefix, str, str ) end
return p