Jump to content

Module:Annotated link

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Fred Gandt (talk | contribs) at 01:49, 26 January 2023 (started working on notes because good coding practices etc.). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local p = {}

local getShortDescription = require( 'Module:GetShortDescription' ).main
local getArgs = require( 'Module:Arguments' ).getArgs
local mLang = require( 'Module:Lang' )

local function errorMessage( message )
	return '<strong class="error">ERROR with invocation of [[Module:AnnotatedLink]]: ' .. message .. '</strong>'
end

local function langify( args )
	local lang = args.lang
	local text = args.text
	-- do as little as possible; return text immediately if English
	if not lang or lang == 'en' then
		return text
	end
	return mLang._lang {
		lang,
		text,
		italic = args.italic or '',
		nocat = args.nocat or '',
		size = args.size or '',
		cat = args.cat or '',
		rtl = args.rtl or ''
	}
end

--[[

Short descriptions on en Wikipedia should be formatted with an uppercase first letter, but
the typical application of this module will require the first character to be lowercase.

By default, this module will ensure all the short desctiptions retrived by Module:GetShortDescription will
be transformed to start with an lowercase first letter, but this may be overriden if required.

--]]
local function handleFirstLetterCase( short_description, case )
	local case_parsed_short_description = mw.ustring.gsub( short_description, '^([^%d])', function( first_char )
		if case == 'upper' then
			return mw.ustring.upper( first_char )
		end
		return mw.ustring.lower( first_char )
	end )
	-- if the case of the first character is altered, apply a tracking category
	if case_parsed_short_description ~= short_description then
		-- we're not doing this without discussion
		mw.log( '[[Category:Pages displaying an annotated link with a case-altered short description]]' )
	end
	return case_parsed_short_description
end

local function annotatedLink( args )
	local name = args.name
	if not name then
		return errorMessage( 'a page name (including namespace) MUST be provided' )
	end
	
	local case = args.desc_first_letter_case or 'lower'
	local abbr_title = args.abbr_title
	local dash = args.dash or ' –'
	local display = args.display
	local wedge = args.wedge
	local quote = args.quote
	local abbr = args.abbr
	local aka = args.aka
	
	local GSD_args = {
		args = {
			lang_italic = args.desc_lang_italic,
			lang_nocat = args.desc_lang_nocat,
			lang_size = args.desc_lang_size,
			lang_cat = args.desc_lang_cat,
			lang_rtl = args.desc_lang_rtl,
			lang_no = args.desc_lang_no,
			fallback = args.fallback,
			prefer = args.prefer,
			only = args.only,
			name = name
		}
	}
	
	local result = langify( {
		lang = args.link_lang,
		text = '[[:' .. name .. '|' .. ( display or name ) .. ']]',
		italic = args.link_lang_italic,
		nocat = args.link_lang_nocat,
		size = args.link_lang_size,
		cat = args.link_lang_cat,
		rtl = args.link_lang_rtl
	} )
	
	if quote then
		result = '"' .. result .. '"'
	end
	
	if abbr then
		result = result .. ' (<abbr'
		if abbr_title then
			result = result .. ' title="' .. abbr_title .. '"'
		end
		result = result .. '>' .. abbr .. '</abbr>)'
	end
	
	if aka then
		result = result .. ', also known as ' .. langify( {
			lang = args.aka_lang,
			text = aka,
			italic = args.aka_lang_italic,
			nocat = args.aka_lang_nocat,
			size = args.aka_lang_size,
			cat = args.aka_lang_cat,
			rtl = args.aka_lang_rtl
		} )
	end
	
	if wedge then
		result = result .. ', ' .. langify( {
			lang = args.wedge_lang,
			text = wedge,
			italic = args.wedge_lang_italic,
			nocat = args.wedge_lang_nocat,
			size = args.wedge_lang_size,
			cat = args.wedge_lang_cat,
			rtl = args.wedge_lang_rtl
		} )
	end
	
	local short_description = handleFirstLetterCase( getShortDescription( GSD_args ), case )
	if short_description and short_description ~= '' then
		result = result .. dash .. ' ' .. short_description
	end
	
	return result
	
end

function p.main( frame )
	local args = getArgs( frame )
	if not args then
		return errorMessage( 'could not getArgs' )
	end
	return annotatedLink( args )
end

return p