require('strict')local p =
local function blank_to_nil(s) if s and #s > 0 then return s endend
local function pad(padlen, ...) padlen = tonumber(padlen) or 0 if 1 > select('#', ...) then return ("0"):rep(padlen) end local padsrc = tostring((...)) local srclen = mw.ustring.len(padsrc) if 1 > padlen or 1 > srclen then return "" end return mw.ustring.sub(mw.ustring.rep(padsrc, math.ceil(padlen / srclen)), 1, padlen)end
local function padleft(str, ...) str = tostring(str) if 1 > select('#', ...) then return str end local strlen = mw.ustring.len(str) if 1 > strlen then return pad((...), select(2, ...)) end return pad((tonumber((...)) or 0) - strlen, select(2, ...)) .. strend
local function padright(str, ...) str = tostring(str) if 1 > select('#', ...) then return str end local strlen = mw.ustring.len(str) if 1 > strlen then return pad((...), select(2, ...)) end return str .. pad((tonumber((...)) or 0) - strlen, select(2, ...))end
local function expr(...) return mw.ext.ParserFunctions.expr(...)end
function p.main(frame) local args = frame:getParent.args local id = blank_to_nil(args[1] or args.id) if not id then error("Template:LCCN: You must provide an ID.") end local title = blank_to_nil(args[2] or args.title or args.name)
local letter_width = (id:match("^%s*[0-9][0-9]") and id:len < 10) and 0 or 2 local left_part = id:sub(1, letter_width + 2) local right_part = expr(padright(id, letter_width + 8, '.00000'):sub(letter_width + 3, letter_width + 8)) local url = "https://www.loc.gov/item/" .. left_part .. padleft(right_part, 6, 0) if args.long
return p