Module:RootFinder
From The Seven Sages of Rome
Documentation for this module may be created at Module:RootFinder/doc
local p = {}
local function findRootLanguage(frame, languageName, visited, path)
-- Prevent infinite loops in case of circular references
visited = visited or {}
path = path or {}
if visited[languageName] then
return nil, "Circular reference detected: " .. languageName, path
end
visited[languageName] = true
table.insert(path, languageName)
local query = "[[Is Variety Of::" .. languageName .. "]]"
local results = frame:preprocess('{{#ask:' .. query .. '|limit=1}}')
-- Debugging: Append raw query results to the path
table.insert(path, "Query results: " .. results)
-- Handle no results
if results == "" then
return languageName, nil, path
end
-- Extract the next language
local nextLanguage = mw.text.trim(results)
-- Recursively find the root
return findRootLanguage(frame, nextLanguage, visited, path)
end
function p.main(frame)
local languageName = frame.args[1]
if not languageName then
return "Error: Language name not provided."
end
local rootLanguage, errorMessage, path = findRootLanguage(frame, languageName)
if errorMessage then
return errorMessage .. "\nPath: " .. table.concat(path, " -> ")
end
-- Construct the Semantic MediaWiki query for the language tree
local query = "[[Category:Language]]|format=tree|parent=Is Variety Of|limit=5000|root=" .. rootLanguage
local tree = frame:preprocess('{{#ask:' .. query .. '}}')
return tree .. "\nPath: " .. table.concat(path, " -> ")
end
return p