Jump to content

Module:Make Wikisource link

Permanently protected module
From Wikipedia, the free encyclopedia

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[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[checkIndexForDisplay] or linkTarget
	end
	
	
	-- build the link
	toReturn = '[[:s:' .. lang .. ':' .. authorPrefix .. linkTarget .. '|' .. displayText .. ']]'
	
	-- if no Wikidata link and no nocat parameter, throw in the error category
	-- we do this regardless of whether we used the Wikidata link for linking
	-- because the Wikisource text should be added to Wikidata regardless
	if page.namespace == 0 and not (wikidataSitelink or yesno(args.nocat)) then
		toReturn = toReturn .. '[[Category:Wikisource templates with missing id|' .. pagename .. ']]' 
	end
	
	return toReturn
end

return p