Module:InfoboxConcept
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