Pumunta sa nilalaman

Module:Make Wikisource link

Mula sa Wikipedia, ang malayang ensiklopedya
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