Module:Reference

From Remilia Wiki
Jump to navigation Jump to search

Reference-list and note presentation for Template:Reflist, Template:Efn, Template:Refbegin and Template:Refend.


-- Module:Reference
-- Templates for reference lists, bibliographies, and footnotes

local p = {}

-- Helper: get frame arguments
local function getArgs(frame)
    return require('Module:Arguments').getArgs(frame)
end

-- Reflist: displays references
-- Parameters: columns, colwidth, group
function p.reflist(frame)
    local args = getArgs(frame)
    local columns = args.columns or args[1]
    local colwidth = args.colwidth or args[2]
    local group = args.group

    local container = mw.html.create('div'):addClass('reflist')

    if colwidth then
        container:addClass('reflist-columns'):css('column-width', colwidth)
    elseif columns then
        container:addClass('reflist-columns'):css('column-count', columns)
    end

    -- Build references tag using frame:extensionTag for proper parsing
    local refArgs = {}
    if group then
        refArgs.group = group
    end
    local refContent = frame:extensionTag('references', '', refArgs)

    return tostring(container:wikitext(refContent))
end

-- Refbegin: starts a formatted bibliography
-- Parameters: columns (1), colwidth, indent, liststyle
function p.refbegin(frame)
    local args = getArgs(frame)
    local columns = args.columns or args[1]
    local colwidth = args.colwidth
    local indent = args.indent
    local liststyle = args.liststyle

    local html = mw.html.create('div')
        :addClass('refbegin')

    -- Column styling
    if colwidth then
        html:addClass('refbegin-columns')
        html:css('column-width', colwidth)
    elseif columns then
        html:addClass('refbegin-columns')
        html:css('column-count', columns)
    end

    -- Custom indent
    if indent then
        html:css('margin-left', indent)
    end

    -- Custom list style
    html:css('list-style-type', liststyle or 'none')

    -- mw.html has no open-tag mode. This builder has no children, so remove
    -- its known closing tag to preserve the paired Refbegin/Refend interface.
    return tostring(html):sub(1, -7) .. '\n'
end

-- Refend: closes a bibliography started by refbegin
function p.refend(frame)
    return '</div>'
end

-- Efn: explanatory footnote (separate from citations)
-- Parameters: 1 (note text), name, group
function p.efn(frame)
    local args = getArgs(frame)
    local text = args[1] or ''
    local name = args.name
    local group = args.group or 'note'

    if text == '' and not name then
        return '<span class="error">Efn: note text is required</span>'
    end

    return frame:extensionTag('ref', text, { group = group, name = name })
end

-- Notelist: displays explanatory notes (shortcut for reflist with group=note)
function p.notelist(frame)
    local args = getArgs(frame)
    local group = args.group or 'note'

    -- Use frame:extensionTag for proper parsing
    local refContent = frame:extensionTag('references', '', {group = group})

    return '<div class="reflist reflist-notes">' .. refContent .. '</div>'
end

return p