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 = {}


-- Function to sanitize page titles
local function findRootLanguage(frame, languageName, visited)
local function sanitizeTitle(title)
  -- Prevent infinite loops in case of circular references
    if not title then return "" end
  visited = visited or {}
   
  if visited[languageName] then
    -- Trim whitespace
    return nil, "Circular reference detected: " .. languageName
    title = title:match("^%s*(.-)%s*$")
  end
   
  visited[languageName] = true
    -- Replace spaces with underscores
 
    title = title:gsub(" ", "_")
  local query = "[[Is Variety Of::" .. languageName .. "]]"
   
  local results = frame:preprocess('{{#ask:' .. query .. '|limit=1}}')
    -- Remove any problematic characters
 
    title = title:gsub("[<>%[%]|{}]", "")
  -- Handle no results
   
  if results == "" then
    return title
    return languageName, nil
  end
 
  -- Extract the next language
  local nextLanguage = mw.text.trim(results)
 
  -- Recursively find the root
  return findRootLanguage(frame, nextLanguage, visited)
end
end


-- Main function to generate the language tree
function p.main(frame)
function p.languageTree(frame)
  local languageName = frame.args[1]
    local languageName = frame.args[1]
  if not languageName then
   
    return "Error: Language name not provided."
    if not languageName or languageName == "" then
  end
        return "No language name provided"
 
    end
  local rootLanguage, errorMessage = findRootLanguage(frame, languageName)
   
 
    -- Sanitize the initial language name
  if errorMessage then
    local currentLanguage = sanitizeTitle(languageName)
    return errorMessage
    local varietyProperty = "Is_Variety_Of"
  end
    local maxIterations = 10
 
    local iterations = 0
  return rootLanguage
    local rootLanguage = currentLanguage
   
    -- Find the ultimate root language
    while iterations < maxIterations do
        -- Query to find parent language
        local askQuery = string.format('{{#ask: [[%s]][[%s::+]] |?%s |limit=1}}',  
            currentLanguage, varietyProperty, varietyProperty)
       
        local rawResult = frame:preprocess(askQuery)
       
        -- Extract parent language using a more robust method
        local parentLanguage = rawResult:match("%[%[" .. varietyProperty .. "::([^%]]+)%]%]")
       
        -- If no parent language is found, we've reached the root
        if not parentLanguage then
            break
        end
       
        -- Sanitize and update current language
        currentLanguage = sanitizeTitle(parentLanguage)
        rootLanguage = currentLanguage
        iterations = iterations + 1
    end
   
    -- Construct the comprehensive tree query
    local treeQuery = string.format('[[Category:Language]] |format=tree |parent=Is_Variety_Of |limit=5000 |root=%s |depth=10',
        rootLanguage)
   
    -- Return the tree using preprocessing
    return frame:preprocess('{{#ask:' .. treeQuery .. '}}')
end
end


return p
return p

Revision as of 11:47, 25 March 2025

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

local p = {}

local function findRootLanguage(frame, languageName, visited)
  -- Prevent infinite loops in case of circular references
  visited = visited or {}
  if visited[languageName] then
    return nil, "Circular reference detected: " .. languageName
  end
  visited[languageName] = true

  local query = "[[Is Variety Of::" .. languageName .. "]]"
  local results = frame:preprocess('{{#ask:' .. query .. '|limit=1}}')

  -- Handle no results
  if results == "" then
    return languageName, nil
  end

  -- Extract the next language
  local nextLanguage = mw.text.trim(results)

  -- Recursively find the root
  return findRootLanguage(frame, nextLanguage, visited)
end

function p.main(frame)
  local languageName = frame.args[1]
  if not languageName then
    return "Error: Language name not provided."
  end

  local rootLanguage, errorMessage = findRootLanguage(frame, languageName)

  if errorMessage then
    return errorMessage
  end

  return rootLanguage
end

return p