Module:ConceptRelations9

From No Subject
Jump to navigation Jump to search

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

-- Module:ConceptRelations
-- Handles rendering of contributor blocks and conceptual relationships for Infobox_concept

local p = {}

-- Mapping of contribution types to CSS classes
local contributionTypes = {
    ["originator"] = "originator",
    ["reinterpretation"] = "reinterpretation",
    ["elaboration"] = "elaboration",
    ["systematic elaboration"] = "systematic-elaboration",
    ["systematic-elaboration"] = "systematic-elaboration",
    ["clinical extension"] = "clinical-extension",
    ["clinical-extension"] = "clinical-extension",
    ["clinical"] = "clinical",
    ["interdisciplinary application"] = "interdisciplinary-application",
    ["interdisciplinary-application"] = "interdisciplinary-application",
    ["interdisciplinary"] = "interdisciplinary",
    ["critique"] = "critique",
    ["influence"] = "elaboration"
}

-- Mapping of relationship types to CSS classes
local relationTypes = {
    ["foundational"] = "foundational",
    ["foundational dependency"] = "foundational-dependency",
    ["foundational-dependency"] = "foundational-dependency",
    ["prerequisite"] = "prerequisite",
    ["elaborates"] = "elaborates",
    ["extension"] = "extension",
    ["elaborates-refines"] = "elaborates-refines",
    ["elaborates/refines"] = "elaborates-refines",
    ["clinical manifestation"] = "clinical-manifestation",
    ["clinical-manifestation"] = "clinical-manifestation",
    ["clinical application"] = "clinical-application",
    ["clinical-application"] = "clinical-application",
    ["clinical"] = "clinical",
    ["opposition"] = "opposition",
    ["theoretical opposition"] = "theoretical-opposition",
    ["theoretical-opposition"] = "theoretical-opposition",
    ["contradicts"] = "contradicts",
    ["supersedes"] = "supersedes",
    ["interdisciplinary"] = "interdisciplinary",
    ["interdisciplinary parallel"] = "interdisciplinary-parallel",
    ["interdisciplinary-parallel"] = "interdisciplinary-parallel",
    ["interdisciplinary influence"] = "interdisciplinary-influence",
    ["interdisciplinary-influence"] = "interdisciplinary-influence",
    ["translation"] = "translation",
    ["school translation"] = "school-translation",
    ["school-translation"] = "school-translation",
    ["lacanian translation"] = "lacanian-translation",
    ["lacanian-translation"] = "lacanian-translation",
    ["theoretical evolution"] = "theoretical-evolution",
    ["theoretical-evolution"] = "theoretical-evolution"
}

-- Render contributor blocks
function p.contributors(frame)
    local args = frame:getParent().args
    local output = {}
    
    for i = 1, 20 do
        local name = args['contributor_' .. i .. '_name']
        local year = args['contributor_' .. i .. '_year']
        local ctype = args['contributor_' .. i .. '_type']
        local content = args['contributor_' .. i .. '_content']
        
        if name and name ~= '' then
            local typeLower = (ctype or ''):lower()
            local cssClass = contributionTypes[typeLower] or 'elaboration'
            
            table.insert(output, '<div class="contributor-block ' .. cssClass .. '">')
            
            -- Name with auto-linking
            local linkedName = name
            if not name:match('%[%[') then
                linkedName = '[[' .. name .. ']]'
            end
            table.insert(output, '<div class="contributor-name">' .. linkedName)
            
            -- Type tag
            if ctype and ctype ~= '' then
                table.insert(output, '<span class="contributor-type-tag">' .. ctype .. '</span>')
            end
            
            table.insert(output, '</div>')
            
            -- Year
            if year and year ~= '' then
                table.insert(output, '<div class="contributor-year">' .. year .. '</div>')
            end
            
            -- Content
            if content and content ~= '' then
                table.insert(output, '<div class="contributor-content">' .. content .. '</div>')
            end
            
            table.insert(output, '</div>')
        end
    end
    
    return table.concat(output, '\n')
end

-- Render relationship blocks
function p.relations(frame)
    local args = frame:getParent().args
    local output = {}
    
    for i = 1, 50 do
        local target = args['relation_' .. i .. '_target']
        local rtype = args['relation_' .. i .. '_type']
        local content = args['relation_' .. i .. '_content']
        
        if target and target ~= '' then
            local typeLower = (rtype or ''):lower()
            local cssClass = relationTypes[typeLower] or 'foundational'
            
            table.insert(output, '<div class="relation-block ' .. cssClass .. '">')
            
            -- Target with auto-linking
            local linkedTarget = target
            if not target:match('%[%[') then
                linkedTarget = '[[' .. target .. ']]'
            end
            table.insert(output, '<div class="relation-target">' .. linkedTarget)
            
            -- Type tag
            if rtype and rtype ~= '' then
                table.insert(output, '<span class="relation-type-tag">' .. rtype .. '</span>')
            end
            
            table.insert(output, '</div>')
            
            -- Content
            if content and content ~= '' then
                table.insert(output, '<div class="relation-content">' .. content .. '</div>')
            end
            
            table.insert(output, '</div>')
        end
    end
    
    return table.concat(output, '\n')
end

return p