Jump to content

Module:Glossary: Difference between revisions

From Insurer Brain
Content deleted Content added
No edit summary
No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 3: Line 3:


function p.generate(frame)
function p.generate(frame)
local maxEntries = tonumber(frame.args[1]) or 30
local current = mw.title.getCurrentTitle()
local current = mw.title.getCurrentTitle()
local content = current:getContent() or ""
local content = current:getContent() or ""
-- find all [[internal links]]
local seen = {}
local seen = {}
local entries = {}
local entries = {}
local count = 0
for link in content:gmatch("%[%[([^%]|]+)") do
for link in content:gmatch("%[%[([^%]|]+)") do
if count >= maxEntries then
break
end
local title = link:match("^(.-)#") or link
local title = link:match("^(.-)#") or link
title = mw.text.trim(title)
title = mw.text.trim(title)
Line 17: Line 22:
seen[title] = true
seen[title] = true
-- look up the Definition: namespace version
local defTitle
local defTitle = "Definition:" .. title
if title:match("^Definition:") then
local page = mw.title.new(defTitle)
defTitle = title
else
defTitle = "Definition:" .. title
end
if page and page.exists then
local page = mw.title.new(defTitle)
local text = page:getContent() or ""
if page then
-- strip templates, get first sentence
local text = page:getContent()
text = text:gsub("%b{}", "")
if text then
text = text:gsub("^%s+", "")
text = text:gsub("%b{}", "")
local sentence = text:match("^(.-%.)")
text = text:gsub("^%s+", "")
if sentence then
local sentence = text:match("^(.-%.)")
table.insert(entries, {
if sentence then
title = title,
table.insert(entries, {
summary = sentence
title = title:gsub("^Definition:", ""),
})
summary = sentence
})
count = count + 1
end
end
end
end
end
Line 37: Line 48:
end
end
-- sort alphabetically
table.sort(entries, function(a, b)
table.sort(entries, function(a, b)
return a.title < b.title
return a.title < b.title
end)
end)
-- render
local out = {}
local out = {}
for _, e in ipairs(entries) do
for _, e in ipairs(entries) do
table.insert(out, string.format(
table.insert(out, e.summary)
"'''%s''': %s", e.title, e.summary
))
end
end

Latest revision as of 21:03, 12 April 2026

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

-- Module:AutoGlossary
local p = {}

function p.generate(frame)
    local maxEntries = tonumber(frame.args[1]) or 30
    local current = mw.title.getCurrentTitle()
    local content = current:getContent() or ""
    
    local seen = {}
    local entries = {}
    local count = 0
    
    for link in content:gmatch("%[%[([^%]|]+)") do
        if count >= maxEntries then
            break
        end
        
        local title = link:match("^(.-)#") or link
        title = mw.text.trim(title)
        
        if not seen[title] then
            seen[title] = true
            
            local defTitle
            if title:match("^Definition:") then
                defTitle = title
            else
                defTitle = "Definition:" .. title
            end
            
            local page = mw.title.new(defTitle)
            if page then
                local text = page:getContent()
                if text then
                    text = text:gsub("%b{}", "")
                    text = text:gsub("^%s+", "")
                    local sentence = text:match("^(.-%.)")
                    if sentence then
                        table.insert(entries, {
                            title = title:gsub("^Definition:", ""),
                            summary = sentence
                        })
                        count = count + 1
                    end
                end
            end
        end
    end
    
    table.sort(entries, function(a, b) 
        return a.title < b.title 
    end)
    
    local out = {}
    for _, e in ipairs(entries) do
        table.insert(out, e.summary)
    end
    
    return table.concat(out, "\n\n")
end

return p