Module:Make Wikisource link

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

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.