Module:RootFinder: Difference between revisions
From The Seven Sages of Rome
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local function findRootLanguage(frame, languageName, visited) | local function findRootLanguage(frame, languageName, visited, path) | ||
-- Prevent infinite loops in case of circular references | -- Prevent infinite loops in case of circular references | ||
visited = visited or {} | visited = visited or {} | ||
path = path or {} | |||
if visited[languageName] then | if visited[languageName] then | ||
return nil, "Circular reference detected: " .. languageName | return nil, "Circular reference detected: " .. languageName, path | ||
end | end | ||
visited[languageName] = true | visited[languageName] = true | ||
table.insert(path, languageName) | |||
local query = "[[Is Variety Of::" .. languageName .. "]]" | local query = "[[Is Variety Of::" .. languageName .. "]]" | ||
| Line 14: | Line 16: | ||
-- Handle no results | -- Handle no results | ||
if results == "" then | if results == "" then | ||
return languageName, nil | return languageName, nil, path | ||
end | end | ||
| Line 21: | Line 23: | ||
-- Recursively find the root | -- Recursively find the root | ||
return findRootLanguage(frame, nextLanguage, visited, path) | |||
end | end | ||
| Line 34: | Line 32: | ||
end | end | ||
local rootLanguage, errorMessage = findRootLanguage(frame, languageName) | local rootLanguage, errorMessage, path = findRootLanguage(frame, languageName) | ||
if errorMessage then | if errorMessage then | ||
return errorMessage | return errorMessage .. "\nPath: " .. table.concat(path, " -> ") | ||
end | end | ||
| Line 44: | Line 42: | ||
local tree = frame:preprocess('{{#ask:' .. query .. '}}') | local tree = frame:preprocess('{{#ask:' .. query .. '}}') | ||
return tree | return tree .. "\nPath: " .. table.concat(path, " -> ") | ||
end | end | ||
return p | return p | ||
Revision as of 11:50, 25 March 2025
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}}')
-- 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