Module:Make Wikisource link

local p = {}

local getArgs = require('Module:Arguments').getArgs

local yesno = require('Module:Yesno')

function p.makeLink(frame)

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 authorPrefix = args.works and frame:expandTemplate{ title = 'Wikisource/Author', args = { lang } } or ''

local linkTarget

local displayText

local toReturn

-- get the Wikidata sitelink

local wikidataSitelink = mw.wikibase.getSitelink(

mw.wikibase.getEntityIdForCurrentPage() or '',

lang .. 'wikisource'

)

-- 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

-- if Wikidata returns nothing, search for the {{PAGENAME}}

linkTarget = 'Special:Search/' .. pagename

-- we have no parameters and nothing at Wikidata, so we are flying blind

-- We set displayText now to avoid including the Special:Search in the display text

displayText = pagename

end

-- clear the Author: prefix for now; will add it back later if needed

-- this prevents duplicate prefixes (Author:Author:Shakespeare)

-- and avoids displayText with any author prefix

linkTarget = string.gsub(linkTarget, '^' .. authorPrefix, '')

--[[---------

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, '^List') 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 = '' .. displayText .. ''

-- append the error category if needed

if errorCategory then

toReturn = toReturn .. '' .. pagename .. ''

end

return toReturn

end

return p