Module

Publications

From ACES

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

local getArgs = require([[Module:Arguments]]).getArgs
local date = require([[Module:Date]])
local cargo = mw.ext.cargo
local fstr = mw.ustring.format
local p = {}

local fields = {
    entry = {},
    address = {BibTeX = true},
    annote = {BibTeX = true},
    author = {BibTeX = true},
    booktitle = {BibTeX = true},
    chapter = {BibTeX = true},
    edition = {BibTeX = true},
    editor = {BibTeX = true},
    howpublished = {BibTeX = true},
    institution = {BibTeX = true},
    journal = {BibTeX = true},
    month = {BibTeX = true},
    note = {BibTeX = true},
    number = {BibTeX = true},
    organization = {BibTeX = true},
    pages = {BibTeX = true},
    publisher = {BibTeX = true},
    school = {BibTeX = true},
    series = {BibTeX = true},
    title = {BibTeX = true},
    type = {BibTeX = true},
    volume = {BibTeX = true},
    year = {BibTeX = true},
    doi = {BibTeX = true},
    issn = {BibTeX = true},
    isbn = {BibTeX = true},
    url = {BibTeX = true},
    _pageName = {},
    pdf = {}
}

function p.getBibTeX(entry)
    local out = {}
    local pagename = entry._pageName
    pagename = mw.ustring.gsub(pagename, "%s", "")
    table.insert(out, fstr("@%s {%s", entry.entry, pagename))
    for k, v in pairs(fields) do
        if v.BibTeX and entry[k] and entry[k] ~= "" and entry[k] ~= "0" then
            table.insert(out, fstr("%s = {%s}", k, entry[k]))
        end
    end
    if entry.pdf and entry.pdf ~= "" and entry.pdf ~= "0" then
        local titleobject = mw.title.new('File:' .. entry.pdf)
        if titleobject.fileExists then
            table.insert(out, fstr("%s = {%s}", "pdf", entry.pdf))
        end
    end
    table.insert(out, fstr("%s = {%s}", "_pageName", entry._pageName))
    return table.concat(out, ",\n") .. "\n}\n"
end

function p._main(args)
    local cargoFields = {}
    for k, _ in pairs(fields) do table.insert(cargoFields, k) end

    cargoFields = table.concat(cargoFields, ",")
    local args = {
        where = nil,
        join = nil,
        groupBy = nil,
        having = nil,
        orderBy = 'year DESC, month DESC',
        limit = args.limit or "9999999",
        offset = nil
    }
    local results = cargo.query('publication', cargoFields, args)
    mw.logObject(results)
    local rSet = {}
    local out = {}
    for _, entry in ipairs(results) do
        if rSet[entry._pageName] ~= true then
            table.insert(out, p.getBibTeX(entry))
            rSet[entry._pageName] = true
        end
    end
    return table.concat(out, "")
end

-- test: =p._main{}
function p.main(frame) return p._main(getArgs(frame)) end

return p