Module:LuaTemplateBlueprint: Difference between revisions

// via Wikitext Extension for VSCode
// via Wikitext Extension for VSCode
Line 1,049: Line 1,049:
     end
     end
      
      
     -- Process property providers with deduplication
     -- Process property providers with early deduplication
     if template._propertyProviders then
     if template._propertyProviders then
         for _, provider in ipairs(template._propertyProviders) do
         for _, provider in ipairs(template._propertyProviders) do
Line 1,062: Line 1,062:
              
              
             if providerResult and next(providerResult) then
             if providerResult and next(providerResult) then
                 -- Merge provider properties into allProperties with deduplication
                 -- Process provider properties through deduplication
                 for property, value in pairs(providerResult) do
                 for property, value in pairs(providerResult) do
                     -- Skip properties marked to skip
                     -- Skip properties marked to skip
Line 1,068: Line 1,068:
                         if type(value) == "table" then
                         if type(value) == "table" then
                             -- Provider returned an array of values
                             -- Provider returned an array of values
                             if allProperties[property] then
                             for _, v in ipairs(value) do
                                -- Property already exists, merge arrays with deduplication
                                 deduplicateProperty(collector, property, v)
                                if type(allProperties[property]) ~= "table" then
                                    -- Convert existing value to array
                                    allProperties[property] = {allProperties[property]}
                                end
                               
                                -- Track seen values
                                local seenValues = {}
                                for _, v in ipairs(allProperties[property]) do
                                    seenValues[v] = true
                                 end
                               
                                -- Add unique values from provider
                                for _, v in ipairs(value) do
                                    if not seenValues[v] then
                                        seenValues[v] = true
                                        table.insert(allProperties[property], v)
                                    end
                                end
                            else
                                -- Property doesn't exist yet, add with internal deduplication
                                local seenValues = {}
                                local uniqueValues = {}
                               
                                for _, v in ipairs(value) do
                                    if not seenValues[v] then
                                        seenValues[v] = true
                                        table.insert(uniqueValues, v)
                                    end
                                end
                               
                                allProperties[property] = uniqueValues
                             end
                             end
                         else
                         else
                             -- Provider returned a single value
                             -- Provider returned a single value
                             if allProperties[property] then
                             deduplicateProperty(collector, property, value)
                                -- Property already exists
                                if type(allProperties[property]) == "table" then
                                    -- Existing property is an array, add value if unique
                                    local seen = false
                                    for _, v in ipairs(allProperties[property]) do
                                        if v == value then
                                            seen = true
                                            break
                                        end
                                    end
                                   
                                    if not seen then
                                        table.insert(allProperties[property], value)
                                    end
                                elseif allProperties[property] ~= value then
                                    -- Convert to array with both values
                                    allProperties[property] = {allProperties[property], value}
                                end
                                -- If existing value equals new value, no change needed
                            else
                                -- Property doesn't exist yet, add directly
                                allProperties[property] = value
                            end
                         end
                         end
                     end
                     end