Module:RootFinder

From The Seven Sages of Rome
Revision as of 14:21, 25 March 2025 by Noeth (talk | contribs)

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

local p = {}

function p.getLanguageTree(frame)
    -- Get the language name from the first argument
    local languageName = frame.args[1]
    
    if not languageName then
        return "No language name provided"
    end
    
    -- Function to escape special characters for wiki page titles
    local function escapeTitle(title)
        -- Replace spaces with underscores
        title = title:gsub(" ", "_")
        -- Capitalize first letter
        title = title:sub(1,1):upper() .. title:sub(2)
        return title
    end
    
    -- Function to trace the language to its root
    local function findRootLanguage(lang)
        local currentLang = escapeTitle(lang)
        local visited = {}
        
        while true do
            -- Prevent infinite loops
            if visited[currentLang] then
                return currentLang
            end
            visited[currentLang] = true
            
            -- Query for 'Is Variety Of' property
            local rootQuery = {
                string.format('[[%s]]', currentLang),
                '?Is Variety Of'
            }
            local varietyResult = mw.smw.ask(rootQuery)
            
            -- If no 'Is Variety Of' value found, we've reached the root
            if not varietyResult or #varietyResult == 0 or not varietyResult[1]['Is Variety Of'] then
                return currentLang
            end
            
            -- Update current language to its parent and escape it
            currentLang = escapeTitle(varietyResult[1]['Is Variety Of'])
        end
    end
    
    -- Find the root language
    local rootLanguage = findRootLanguage(languageName)
    
    -- Generate the tree query
    local treeQuery = string.format('[[Category:Language]] |format=tree |parent=Is Variety Of |limit=5000|root=%s', rootLanguage)
    
    -- Preprocess the query to render the tree
    local treeResult = frame:preprocess('{{#ask:' .. treeQuery .. '}}')
    
    return treeResult
end

return p