-- This module provides functions and objects for dealing with interwiki links.
local checkType = require('libraryUtil').checkTypelocal interwikiData = mw.loadData('Module:Interwiki extra/data')
---------------------------------------------------------------------------------- Prefix class--------------------------------------------------------------------------------
local Prefix = Prefix.__index = Prefix
function Prefix.new(code) checkType('Prefix.new', 1, code, 'string') local obj = setmetatable(Prefix) local data = interwikiData.prefixes[code] if not data then return nil end for k, v in pairs(data) do obj[k] = v end return objend
function Prefix:makeUrl(page) checkType('makeUrl', 1, page, 'string') -- In MediaWiki, interlanguage links are wiki-encoded (spaces are encoded -- as underscores), even if the site is not a wiki and underscores don't -- make sense. So we do the same here. page = mw.uri.encode(page, 'WIKI') return mw.message.newRawMessage(self.url, page):plainend
function Prefix:isValidUrl(url) checkType('isValidUrl', 1, url, 'string') local obj1 = mw.uri.new(self.url) local obj2 = mw.uri.new(url) if not obj2 then return false elseif obj1.protocol and obj1.protocol ~= obj2.protocol then -- Protocols only have to match if the prefix URL isn't protocol-relative return false elseif obj1.host ~= obj2.host then return false end local function makePathQuery(obj) return obj.path .. (obj.queryString or ) end local pathQuery1 = makePathQuery(obj1) local pathQuery2 = makePathQuery(obj2) -- Turn pathQuery1 into a string pattern by escaping all punctuation, then -- replacing the "$1" parameter (which will have become "%$1") with ".*" local pattern = pathQuery1:gsub('%p', '%%%0'):gsub('%%$1', '.*') pattern = '^' .. pattern .. '$' return pathQuery2:find(pattern) ~= nilendlocal langcode =
local siteexcludes = function Prefix.interwiki(frame) local s = setmetatable local entity = mw.wikibase.getEntity -- use qid parameter if provided, otherwise follow P460 local qid = frame.args.qid or frame:getParent.args.qid or frame.args[1] or frame:getParent.args[1] or if not mw.wikibase.isValidEntityId(qid) then qid = nil -- access the first valid value of P460 for i, statement in pairs(entity:getBestStatementsP460) do if statement.mainsnak.snaktype
'wiki' then local lang = langcode[mw.ustring.sub(j.site, 1, mw.ustring.len(j.site) - 4)] or mw.ustring.sub(j.site, 1, mw.ustring.len(j.site) - 4) -- exclude interwiki to projects that already have sitelinks in the present page if (entity and not entity.sitelinks[j.site]) or not entity then -- put together a interwiki-link to other projects s:insert('') end end end end end end if #s > 0 then s:insert("") end return s:concat()
end
return Prefix