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
   local root, errorMessage = findRootLanguage(frame, nextLanguage, visited)
   return findRootLanguage(frame, nextLanguage, visited, path)
  if errorMessage then
      return nil, errorMessage
  end
  return root, nil
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