
![]() | Dieses Modul wird auf vielen Seiten benutzt, und Änderungen werden projektweit sofort wahrgenommen. Bitte teste Änderungen vorher im /Sandkasten oder in deinem Benutzernamensraum. Die getestete Änderung sollte dann in einem einzigen Edit auf dieser Seite eingefügt werden. Bitte diskutiere Änderungen zuerst auf der Diskussionsseite bevor du sie implementierst. |
![]() | Dieses Modul ist halbgeschützt. Es wird sehr häufig verwendet oder substituiert. Änderungen können zu einer großen Serverlast führen, und Vandalismus kann sich auf eine Vielzahl von Artikel auswirken. |
![]() | Dieses Modul benutzt die Wikidata-Eigenschaften: |
Anwendung
Das Modul wird direkt von den Vorlagen {{Wikipedia}} und {{Sitelinks}} aufgerufen. Parameterbeschreibung siehe dort. Im Projektnamensraum befindet sich die technische Dokumentation Wikivoyage:Sitelinks.
Versionsbezeichnung auf Wikidata: 2024-09-05
Benötigte weitere Module
Hinweise
- Die obige Dokumentation wurde aus der Seite Modul:Sitelinks/Doku eingefügt. (bearbeiten | Versionsgeschichte) Die Kategorien für dieses Modul sollten in der Dokumentation eingetragen werden. Die Interwiki-Links sollten auf Wikidata eingepflegt werden.
- Liste der Unterseiten
-- module variable and administration local sl = { moduleInterface = { suite = 'Sitelinks', serial = '2024-09-05', item = 111999211 } } -- module import -- require( 'strict' ) local si = require( 'Module:Sitelinks/i18n' ) local uc -- URL check module local wu = require( 'Module:Wikidata utilities' ) -- maintenance tools local maintenance = {} -- table of error strings local invalidParams = {} -- table of unknown parameters local duplicateAliases = {} -- table of duplicate parameter aliases local function contains( new ) for i = 1, #maintenance do if maintenance[ i ] == new then return true end end return false end local function addMaintenance( key, value ) local s = key -- fallback local tab = si.maintenance[ key ] if tab then s = si.formats.category:format( tab.category ) .. ( tab.err and si.formats.error:format( tab.err ) or '' ) .. ( tab.hint and si.formats.hint:format( tab.hint ) or '' ) end s = value and mw.ustring.format( s, value ) or s if not contains( s ) then table.insert( maintenance, s ) end end local function getMaintenanceMsgs() if #invalidParams > 0 then if #invalidParams == 1 then addMaintenance( 'unknownParam', invalidParams[ 1 ] ) else addMaintenance( 'unknownParams', table.concat( invalidParams, ', ' ) ) end end if #duplicateAliases > 0 then addMaintenance( 'duplicateAliases', table.concat( duplicateAliases, ', ' ) ) end return table.concat( maintenance, '' ) end local function isSet( arg ) return arg and arg ~= '' end local function yesno( val ) return si.yesno[ mw.ustring.lower( val ) ] end local function getPageData() local page = mw.title.getCurrentTitle() page.lang = mw.getContentLanguage():getCode() page.globalProject = mw.site.siteName:lower():gsub( 'wikipedia', 'wiki' ) return page end -- args: template arguments consisting of argument name as key and a value -- validKeys: table with argument name as key used by the script and -- a string or a table of strings for argument names used by the local wiki local function checkArguments( templateArgs, validKeys ) local args = {} if not templateArgs or not validKeys or not next( validKeys ) then return args end local keys = {} -- list of wiki-dependent parameter names for key, params in pairs( validKeys ) do if type( params ) == 'string' then keys[ params ] = key else for i = 1, #params do keys[ params[ i ] ] = key end end end local targetKey for key, arg in pairs( templateArgs ) do targetKey = keys[ key ] if targetKey then if args[ targetKey ] then -- prevents duplicates table.insert( duplicateAliases, "''" .. key .. "''" ) else args[ targetKey ] = arg end else table.insert( invalidParams, "''" .. key .. "''" ) end end return args end local colorAdjust = { ['-webkit-print-color-adjust'] = 'exact', ['color-adjust'] = 'exact', ['print-color-adjust'] = 'exact' } local function makeSpan( s, class, isBdi, attr, css ) return tostring( mw.html.create( isBdi and 'bdi' or 'span' ) :addClass( class ) :attr( attr or {} ) :css( css or {} ) :wikitext( s ) ) end local function addLinkIcon( classes, link, title, text, addSpace ) local span = makeSpan( ' ', nil, false, { title = title, ['data-icon'] = text }, colorAdjust ) -- space to keep the span tag local lFormat = ( link:find( '^https?://' ) or link:find( '^//' ) ) and '[%s %s]' or '[[%s|%s]]' local iconLink = mw.ustring.format( lFormat, link, span ) if addSpace then iconLink = makeSpan( ' ', 'voy-sitelinks-with-space', true ) .. iconLink end return makeSpan( iconLink, 'voy-sitelinks-icon ' .. classes ) end -- getting sister project links local function getWikiLink( langArray, wiki, entity, wikilang ) local prefix = wiki == 'wiki' and 'w:' or 'voy:' local lang, link for i = 1, #langArray do lang = langArray[ i ] if lang ~= '' then link = wu.getFilteredSitelink( entity, lang .. wiki ) if link then prefix = prefix .. ( lang ~= wikilang and ( lang .. ':' ) or '' ) return prefix .. link end end end return '' end local function getSisterLinks( args, page, entity ) local sisters = { commons = '', -- link to Commons category wikidata = '', -- link to Wikidata wikipedia = '', -- link to Wikipedia wikivoyage = '' -- link to another branch, usually en, as a sister link } if isSet( args.wikidata ) then sisters.wikidata = 'd:' .. args.wikidata sisters.wikipedia = getWikiLink( si.langs.wikipedia, 'wiki', entity, page.lang ) if args.template == 'wikipedia' and sisters.wikipedia ~= '' then return sisters end if args.wikiPage == '' and args.isArticle == 'false' then sisters.wikivoyage = getWikiLink( si.langs.wikivoyage, page.globalProject, entity, page.lang ) if sisters.wikivoyage ~= '' then addMaintenance( 'linkToOtherWV' ) end end end return sisters end -- adding linked sister icons local function makeSisterIcons( sisters, name ) if not sisters then return '' end local icons = {} local id = sisters.wikidata:gsub( '^d:', '' ) local span for _, key in ipairs( { 'wikivoyage', 'wikipedia', 'commons', 'wikidata' } ) do if isSet( sisters[ key ] ) then span = addLinkIcon( 'voy-sitelinks-sister-icon voy-sitelinks-sister-' .. key, sisters[ key ], mw.ustring.format( si.iconTitles[ key ], name, id ), key, key == 'wikidata' ) -- add leading space table.insert( icons, span ) end end return ( #icons == 1 and '' or ' ' ) .. table.concat( icons, '' ) end local function isUrl( url ) if not uc then uc = require( 'Module:UrlCheck' ) end return uc.isUrl( url, si.options.skipPathCheck ) end -- url check local function checkUrl( url ) if isSet( url ) then local c = isUrl( url ) -- getting result code if c > 2 then addMaintenance( 'wrongUrl' ) url = '' elseif c == 2 then -- URL contains IP address addMaintenance( 'urlWithIP' ) end end return url end local function initialParameterCheck( frame, paramTable ) local entity = nil local wrongQualifier = false -- checking keys and copying values to args local args = checkArguments( frame:getParent().args, paramTable ) args.name = mw.text.trim( args.name or '' ) args.wikidata = mw.text.trim( args.wikidata or '' ) -- remove control characters for key, _ in pairs(paramTable ) do if args[ key ] then args[ key ] = args[ key ]:gsub( '[%z\1-\31]', ' ' ) else args[ key ] = '' end end -- checking Wikidata entitity -- args.wikidata, entity, wrongQualifier = wu.getEntityId( args.wikidata or '' ) args.wikidata, entity, wrongQualifier = wu.getEntity( args.wikidata or '' ) if wrongQualifier then addMaintenance( 'wrongQualifier' ) end if not isSet( args.wikidata ) then addMaintenance( 'missingWikidata' ) end if isSet( args.name ) then if args.name:find( '<', 1, true ) or args.name:find( '{{', 1, true ) or args.name:find( '[', 1, true ) then addMaintenance( 'malformedName' ) -- remove links, tags, and templates args.name = args.name:gsub( '%[%[[^|]*|', '' ):gsub( '%[%[', '' ) :gsub( '%[[^%[%] ]+ ', '' ):gsub( '[%[%]|]', '' ) :gsub( '<[^>]+>', '' ):gsub( '{{[^}]+}}', '' ) end end if isSet( args.styles ) then args.styles = si.nameStyles[ args.styles:lower() ] or args.styles else args.styles = nil end if isSet( args.addLang ) then if mw.language.fetchLanguageName( args.addLang ) ~= '' then table.insert( si.langs.wikipedia, args.addLang ) table.insert( si.langs.wikivoyage, args.addLang ) else addMaintenance( 'unknownLang' ) end end return args, entity end -- getting data from Wikidata local function getNameFromWikidata( args, page, entity ) if isSet( args.name ) then return end local officialNames = wu.getMonolingualValues( entity, si.properties.officialName ) args.name = officialNames[ page.lang ] or si.langs.name ~= '' and officialNames[ si.langs.name ] or '' -- if failed then get labels if args.name == '' then if page.lang == si.langs.name then args.name = wu.getLabel( entity ) or '' else args.name = wu.getLabel( entity ) or si.langs.name ~= '' and wu.getLabel( entity, si.langs.name ) or '' end end if args.name ~= '' then addMaintenance( 'nameFromWD' ) end end local function getCommonsCategory( args, entity ) -- getting commonscat from commonswiki sitelink before P373 -- because sitelink is checked by Wikidata local t = wu.getSitelink( entity, 'commonswiki' ) or '' if t:match( '^Category:.+$' ) then t = t:gsub( '^Category:', '' ) else t = wu.getValue( entity, si.properties.commonsCategory ) if t == '' then local id = wu.getId( entity, si.properties.mainCategory ) if id ~= '' then t = wu.getSitelink( id, 'commonswiki' ) or '' t = t:gsub( '^Category:', '' ) end end end args.commonscat = t end -- getting link to Wikivoyage local function getArticleLink( args, page, entity ) args.wikiPage = '' args.isArticle = 'false' local title = wu.getFilteredSitelink( entity, page.lang .. page.globalProject ) if title and title ~= page.text then -- no link to the article itself args.wikiPage = title elseif title and title == page.text then -- is article itself args.isArticle = 'true' end end local function getDataFromWikidata( args, page, entity ) if args.wikidata == '' then return {} -- empty sisters table end getNameFromWikidata( args, page, entity ) getArticleLink( args, page, entity ) if yesno( args.commonscat ) == 'y' then getCommonsCategory( args, entity ) end if yesno( args.url ) == 'y' then args.url = wu.getValue( entity, si.properties.url ) end return getSisterLinks( args, page, entity ) end local function finalParameterCheck( args ) for k, v in pairs( args ) do if yesno( v ) then -- remove boolean values args[ k ] = '' end end if args.name == '' then args.name = si.maintenance.missingName end args.url = checkUrl( args.url ) end local function makeName( args, link, sisters, aClass ) -- bdi: supporting right-to-left wikis local result = {} local name = args.name if isSet( link ) then name = '[[:' .. link .. '|' .. name .. ']]' elseif isSet( args.url ) then name = '[' .. args.url .. ' ' .. name .. ']' end local tag = tostring( mw.html.create( 'bdi' ) :attr( 'class', 'voy-sitelinks-name' ) :cssText( args.styles ) :wikitext( name ) ) if isSet( link ) and isSet( args.url ) then tag = tag .. ' ' .. addLinkIcon( 'voy-sitelinks-url', args.url, si.iconTitles.internet, 'internet' ) end local icons = makeSisterIcons( sisters, args.name ) return makeSpan( tag .. icons, aClass ) end local function getMaintenance( page ) if si.nsNoMaintenance[ page.namespace ] then return '' end local s = getMaintenanceMsgs() if si.options.usePropertyCateg then s = s .. wu.getCategories( si.maintenance.properties ) -- format string end return s end -- main sitelinks functions function sl.wikipedia( frame ) local page = getPageData() -- copying frame:getParent().args to template arguments, args, parameter check local args, slEntity = initialParameterCheck( frame, si.wikipedia ) result = '' if isSet( args.wikidata ) then args.url = 'n' args.commonscat = 'n' args.template = 'wikipedia' local sisters = getDataFromWikidata( args, page, slEntity ) finalParameterCheck( args ) local link = '' if isSet( sisters.wikipedia ) then link = sisters.wikipedia elseif isSet( args.wikiPage ) then link = args.wikiPage else link = sisters.wikivoyage or '' end result = makeName( args, link, nil, 'voy-sitelinks-wikipedia' ) end return result .. getMaintenance( page ) end function sl.sitelinks( frame ) local page = getPageData() -- copying frame:getParent().args to template arguments, args, parameter check local args, slEntity = initialParameterCheck( frame, si.sitelinks ) local result = '' if isSet( args.wikidata ) then if not isSet( args.url ) then args.url = 'y' end args.commonscat = 'y' args.template = 'sitelinks' local sisters = getDataFromWikidata( args, page, slEntity ) if isSet( args.commonscat ) then sisters.commons = 'c:Category:' .. args.commonscat end finalParameterCheck( args ) local link = '' if isSet( args.wikiPage ) then link = args.wikiPage end if link == '' and not isSet( args.url ) and args.isArticle == 'false' then if isSet( sisters.wikipedia ) then link = sisters.wikipedia sisters.wikipedia = nil elseif isSet( sisters.wikivoyage ) then link = sisters.wikivoyage sisters.wikivoyage = nil end end result = makeName( args, link, sisters, 'voy-sitelinks-projects' ) end return result .. getMaintenance( page ) end return sl