Module:Make Wikisource link
Itsura
local p = {}
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
function p.makeLink(frame)
--[[---------
Variable declaration
--]]---------
local args = getArgs(frame)
local lang = args['explicit_lang_param'] or args['implicit_lang_param'] or 'en'
local page = mw.title.getCurrentTitle()
local pagename = page.text
local wikisourceEdition
local linkTarget
local displayText
local toReturn
local prefix
--[[
Create the prefix for the interwiki link
It uses the lowest of:
1. 'Special:Search/', if using the enwiki pagename as the interwiki target
2. If not (1), an 'Author:' prefix, localized, if given a works parameter and not under (1)
3. If not (1) or (2), the empty string
We avoid 'Special:Search/Author:' intentionally; this is rarely helpful
Here we simply set it to (2) or (3), and override it when setting the link target if needed
--]]
prefix = args.works and frame:expandTemplate{ title = 'Wikisource/Author', args = { lang } } or ''
-- Handle multilingual Wikisource (aka old Wikisource) correctly
if lang == 'mul' then
wikisourceEdition = 'sourceswiki' -- siteid for multilingual Wikisource
else
wikisourceEdition = lang .. 'wikisource' -- other Wikisource editions are langcode + 'wikisource' (e.g. 'enwikisource')
end
-- get the Wikidata sitelink
local wikidataSitelink = mw.wikibase.getSitelink(
mw.wikibase.getEntityIdForCurrentPage() or '',
wikisourceEdition
)
-- if we have a language parameter, we look at the second unnamed parameter for the source title
local checkIndexForTarget = args['implicit_lang_param'] and 2 or 1
-- and then use the next index for display
local checkIndexForDisplay = checkIndexForTarget + 1
--[[---------
Set the link target
--]]---------
if args['wslink'] then
linkTarget = args['wslink']
elseif args[checkIndexForTarget] then
-- we have a source title parameter, so return that
linkTarget = args[checkIndexForTarget]
elseif wikidataSitelink then
-- use Wikidata
linkTarget = wikidataSitelink
else
-- we have no parameters and nothing at Wikidata, so we are flying blind
-- set the linkTarget to the pagename
linkTarget = pagename
-- and set prefix to 'Special:Search/' to find the appropriate link
prefix = 'Special:Search/'
end
-- clear prefixes for now; will add it back later if needed
-- this prevents duplicate prefixes (Author:Author:Shakespeare; Special:Search/Special:Search/)
-- and avoids displayText with any author prefix
linkTarget = string.gsub(linkTarget, '^' .. prefix, '')
--[[---------
Now build the displayText
--]]---------
if not displayText then
-- we did not set displayText in the above steps, so set it now
-- first we check for an explicit display text, or else we set it to be the link target
displayText = args['title'] or args[checkIndexForDisplay] or linkTarget
end
--[[---------
Now we check whether we should categorize in Category:Wikisource templates with missing id
--]]---------
-- initialize errorCategory as true
local errorCategory = true
-- helper to set errorCategory = false
local function setFalse() errorCategory = false end
if wikidataSitelink then
-- we do have a sitelink at Wikidata
setFalse()
elseif yesno(args.nocat, true) then
-- we have a |nocat parameter
setFalse()
elseif page.namespace ~= 0 then
-- only care about mainspace
setFalse()
elseif string.match(pagename, '^Lists? of ') then
-- we are on a list page, and those should not have Wikisource links
setFalse()
elseif string.match(pagename, '^%d%d?%d?%d?s? in') then
-- we are in a YEAR/DECADE in FOO page, and those also should not have anything else
setFalse()
else
-- Now we check categories and determine whether this is something which does not need a Wikisource links
-- Currently, we avoid categorizing:
-- 1. Disambiguation pages
-- 2. Set index articles
-- 3. Articles about species. There is no universal category; [[Category:Articles with 'species' microformats]] is a proxy
-- we do this check last to avoid using [[WP:EXPENSIVE]] parser calls if possible
for _, cat in ipairs(page.categories) do
if cat == "All disambiguation pages" or cat == "All set index articles" or cat == "Articles with 'species' microformats" then
setFalse()
break
end
end
end
-- build the link
toReturn = '[[:s:' .. lang .. ':' .. prefix .. linkTarget .. '|' .. displayText .. ']]'
-- append the error category if needed
if errorCategory then
toReturn = toReturn .. '[[Category:Wikisource templates with missing id|' .. pagename .. ']]'
end
return toReturn
end
return p