Module:InfoboxConcept

From No Subject
Jump to navigation Jump to search

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

-- Module:InfoboxConcept
local p = {}
local cargo = mw.ext.cargo

local function esc(s)
	if not s or s == '' then return nil end
	return mw.text.nowiki(s)
end

local function linkIfPage(s)
	if not s or s == '' then return nil end
	-- if already linked, keep
	if mw.ustring.find(s, '%[%[') then return s end
	return '[[' .. s .. ']]'
end

function p.render(frame)
	local title = mw.title.getCurrentTitle().text

	-- IMPORTANT: this Cargo install expects fields as a STRING, not a table.
	local rows = cargo.query(
		'Concepts',
		'canonical_name,original_term,original_language,first_appearance_year,originating_thinker,theoretical_domain,tradition,clinical_relevance',
		{
			where = 'concept="' .. title .. '"',
			limit = 1
		}
	)

	if not rows or #rows == 0 then
		return '<div class="infobox-concept infobox">No Cargo data found for this concept.</div>'
	end

	local r = rows[1]
	local out = {}

	table.insert(out, '<div class="infobox-concept infobox">')

	-- Header
	table.insert(out, '<div class="concept-header">')
	table.insert(out, '<div class="concept-name">' .. esc(r.canonical_name or title) .. '</div>')

	if r.original_term and r.original_term ~= '' then
		local lang = (r.original_language and r.original_language ~= '') and (' (' .. esc(r.original_language) .. ')') or ''
		table.insert(out, '<div class="concept-original-term">' .. esc(r.original_term) .. lang .. '</div>')
	end

	table.insert(out, '</div>') -- header

	-- Grid
	table.insert(out, '<div class="concept-data-grid">')

	local function row(label, value)
		if not value or value == '' then return end
		table.insert(out,
			'<div class="concept-row">' ..
			'<div class="concept-label">' .. label .. '</div>' ..
			'<div class="concept-data">' .. value .. '</div>' ..
			'</div>'
		)
	end

	row('First appearance', esc(r.first_appearance_year))
	row('Originating thinker', linkIfPage(r.originating_thinker))
	row('Theoretical domain', esc(r.theoretical_domain))
	row('Tradition', esc(r.tradition))
	row('Clinical relevance', esc(r.clinical_relevance))

	table.insert(out, '</div>') -- grid
	table.insert(out, '</div>') -- infobox

	return table.concat(out, '\n')
end

return p