Module:Tt

Revision as of 22:07, 29 August 2025 by 919dd (talk | contribs) (Protected "Module:Tt" ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Documentation for this module may be created at Module:Tt/doc

local p = {}
local lib = require('Module:Feature')

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		parentFirst = true,
		wrappers = { 'Template:Tt' }
	})
	args[1] = args[1] or '<i>Missing text</i>'

	-- Return plain text if no tooltip given
	if lib.isEmpty(args[2]) then
		return args[1]
	end
	
    return p._main(args)
end

function p._main(args, options)
	local text = args[1]
	local tooltip = mw.text.decode(args[2], true)
	local out = mw.html.create()
	
	--check for link format
	if lib.isNotEmpty(args.link) then
		local link = tostring(args.link)
		args.link = nil
		local base = tostring(p._main(args, {notoggle = true})) -- tt on label for hover as otherwise the <a> default title takes priority
		local linkTo = '[[' .. lib.ternary(link == '1', text, link) .. '|' .. base .. ']]'
		return p._main({ linkTo, args[2] }, {nohover = true}) -- external tt for collapsible for the separated clickable
	end
	
	-- Build hover tooltip
	local hover = out:tag('span')
	hover
		:addClass('text-tooltip hover-tooltip')
		:wikitext(text)
	-- Optional hover text but plain text must be there for gadget
	if not options or not options.nohover then hover:attr('title', tooltip) end
	hover:allDone()
	
	-- Build toggle tooltip
	local toggle = out:tag('span'):addClass('custom-tt-wrapper mobile-only toggle-tooltip')
		
	-- Optional toggleable text but plain text must be there for gadget
	if not options or not options.notoggle then
		toggle:addClass(' mw-collapsible mw-made-collapsible mw-collapsed giw-collapsible')
		-- move tooltip to detached icon when text is clickable
		if lib.isNotEmpty(args.link) or (text:find('%[%[') and text:find('%]%]')) then
			toggle:wikitext(text, '&thinsp;')
			-- infoicon with semi-hidden text for screen readers
			text = '<span class="screen-reader-text">Tooltip for ' .. text:gsub('%[%[?[^|%]]+|', ''):gsub('%[', ''):gsub('%]', '') .. '</span>&#9432;'
		end
		
		toggle
			:tag('span')
				:addClass('mw-collapsible-toggle mw-collapsible-toggle-default mw-collapsible-toggle-collapsed custom-tt toggle-tooltip')
				:wikitext(text)
				:done()
		toggle
			:tag('span')
				:addClass('mw-collapsible-content custom-tt')
				:css{ display = 'none' }
				:wikitext(tooltip)
				:done()
	else
		toggle:wikitext(text)
	end
	toggle:allDone()
	
	return out
end

--for modules that need the plain text input
function p.CleanTT(tx)
	local full = tx
	local result = tx
	for tooltip, display in string.gmatch(full, '<span[^>]+title="([^>]-)">(.-)</span>') do
		local escTooltip = tooltip:gsub("([^%w])", "%%%1")
		local escDisplay = display:gsub("([^%w])", "%%%1")
		search_str = '<span[^>]+title="' .. escTooltip .. '">(' .. escDisplay .. ')</span><span[^>]+><span[^>]+>' .. escDisplay .. '</span><span[^>]+>' .. escTooltip .. '</span></span>'
		result = result:gsub(search_str, display)
	end
	return result
end

return p