Jump to content

Module:IPA/overview

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Nardog (talk | contribs) at 18:16, 23 September 2023. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

require('strict')
local p = {}

local data = mw.title.getCurrentTitle().subpageText == 'sandbox'
	and mw.loadData('Module:IPA/data/sandbox')
	or mw.loadData('Module:IPA/data')
local lects = mw.loadData('Module:IPA/data/export')

local function addNotes(cell, notes)
	if #notes > 0 then
		cell:wikitext(
			string.format(' <small>(%s)</small>', table.concat(notes, '; '))
		)
	end
end

function p.main()
	local t = mw.html.create('table'):addClass('wikitable sortable mw-collapsible')
		:tag('caption'):addClass('nowrap'):wikitext('Data overview'):done()
		:tag('tr')
			:tag('th'):attr('colspan', 4):wikitext('Language'):done()
			:tag('th'):attr('colspan', 4):wikitext('Dialect'):done()
			:done()
		:tag('tr')
			:tag('th'):wikitext('Code'):done()
			:tag('th'):wikitext('Name'):done()
			:tag('th'):wikitext('Link'):done()
			:tag('th'):wikitext('Key'):done()
			:tag('th'):wikitext('Code'):done()
			:tag('th'):wikitext('Name'):done()
			:tag('th'):wikitext('Link'):done()
			:tag('th'):wikitext('Key'):done()
			:done()
	local langRow, langCells, dialectCount
	for i, lect in ipairs(lects) do
		local row
		local cells = {}
		if lect.parent then
			dialectCount = dialectCount + 1
			if dialectCount == 1 then
				row = langRow
			else
				row = t:tag('tr')
				for _, cell in ipairs(langCells) do
					cell:attr('rowspan', dialectCount)
				end
			end
		else
			row = t:tag('tr')
			langRow = row
			langCells = cells
			dialectCount = 0
		end
		for _ = 1, 4 do
			table.insert(cells, row:tag('td'))
		end
		if not lect.parent and (not lects[i + 1] or not lects[i + 1].diaCode) then
			for _ = 1, 4 do
				row:tag('td'):css('background', '#ececec')
			end
		end
		cells[1]:wikitext('<code>' .. (lect.diaCode or lect.code) .. '</code>')
		if lect.aliases then
			addNotes(cells[1], {
				string.format(
					'also <code>%s</code>',
					table.concat(lect.aliases, '</code>, <code>')
				)
			})
		end
		do
			local notes = {}
			if lect.name then
				if lect.name == lect.extName then
					table.insert(notes, 'redundant')
				elseif lect.extName then
					table.insert(notes, string.format('overrides "%s"', lect.extName))
				end
			end
			if lect.text then
				table.insert(notes, string.format('label: "%s"', lect.text))
			end
			cells[2]:wikitext(lect.name or lect.extName)
			addNotes(cells[2], notes)
		end
		do
			local notes = {}
			local intLink = lect.link or lect.generatedLink
			if intLink then
				if intLink == lect.extLink then
					table.insert(notes, 'redundant')
				elseif lect.extLink then
					local note = string.format('overrides [[%s]]', lect.extLink)
					local intTitle = mw.title.new(intLink)
					intTitle = intTitle.redirectTarget or intTitle
					local extTitle = mw.title.new(lect.extLink)
					extTitle = extTitle.redirectTarget or extTitle
					if intTitle ~= extTitle then
						note = note .. ', a different article'
					end
					table.insert(notes, note)
				end
			end
			local s = intLink or lect.extLink
			s = lect.generatedLink and '([[' .. s .. ']])' or '[[' .. s .. ']]'
			cells[3]:wikitext(s)
			addNotes(cells[3], notes)
		end
		cells[4]:wikitext(
			lect.key and '[[' .. lect.key .. ']]' or
				'([[' .. (lect.parent and lect.parent.key or data.defaultKey) .. ']])'
		)
	end
	return tostring(t)
end

function p.keys()
	local t = mw.html.create('table'):addClass('wikitable sortable mw-collapsible')
		:tag('caption'):addClass('nowrap'):wikitext('Languages with dedicated keys'):done()
		:tag('tr')
			:tag('th'):wikitext('Key'):done()
			:tag('th'):wikitext('Language'):done()
			:tag('th'):wikitext('Code'):done()
			:done()
	local byKey, keys = {}, {}
	for _, lect in ipairs(lects) do
		local key = lect.key or lect.parent and lect.parent.key
		if key then
			if not byKey[key] then
				byKey[key] = {}
				table.insert(keys, key)
			end
			table.insert(byKey[key], {
				code = lect.code,
				name = lect.name or lect.extName,
				link = lect.link or lect.generatedLink or lect.extLink
			})
		end
	end
	table.sort(keys)
	for _, key in ipairs(keys) do
		local row = t:tag('tr')
		local keyCell = row:tag('td'):wikitext('[[' .. key .. ']]')
		local keyLects = byKey[key]
		local lang
		if #keyLects > 1 then
			keyCell:attr('rowspan', #keyLects)
			table.sort(keyLects, function (a, b) return a.name < b.name end)
			local keyName = mw.ustring.gsub(key, '^[^/]*/', '')
			for _, lect in ipairs(keyLects) do
				if lect.name == keyName then
					lang = lect
					break
				end
			end
			if not lang then
				for _, lect in ipairs(keyLects) do
					if lect.name:find(' languages$') then
						lang = lect
						break
					end
				end
			end
			if not lang then
				for _, lect in ipairs(keyLects) do
					if not lect.code:find('-') then
						lang = lect
						break
					end
				end
			end
		end
		lang = lang or keyLects[1]
		local nameCell = row:tag('td'):wikitext(
			string.format('[[%s|%s]]', lang.link, lang.name)
		)
		local nameRowspan = 1
		row:tag('td'):wikitext('<code>' .. lang.code .. '</code>')
		for i, lect in ipairs(keyLects) do
			if lect ~= lang then
				local subRow = t:tag('tr')
				local prev = i == 1 and lang or keyLects[i - 1]
				if prev.name == lect.name then
					nameRowspan = nameRowspan + 1
					nameCell:attr('rowspan', nameRowspan)
				else
					nameRowspan = 1
					nameCell = subRow:tag('td'):wikitext(
						string.format('[[%s|%s]]', lect.link, lect.name)
					)
				end
				subRow:tag('td'):wikitext('<code>' .. lect.code .. '</code>')
			end
		end
	end
	return tostring(t)
end


return p