Module:CIA World Factbook

local p = {}

local getArgs = require('Module:Arguments').getArgs

-- prefix of all World Factbook pages

local factbookPrefix = 'https://www.cia.gov/the-world-factbook/'

-- Format of archive link. Both %d represent the year of the archive

local archiveFormat = ' [https://www.cia.gov/the-world-factbook/about/archives/download/factbook-%d.zip (Archived %d edition.)]'

-- Function to turn a string into a URL fragment appropriate for CIA website

local function parseFragment(s)

if not s then

return ''

end

s = mw.ustring.lower(s)

s = mw.ustring.gsub(s,' ','-')

s = mw.ustring.gsub(s,',','')

return s

end

-- Function to fill in factbook link:

-- Arguments:

-- args.country: topic of page (optional)

-- args.section: section of page (optional)

-- Returns:

-- link to World Factbook page about country, with section anchor

function p._country(args)

if not args.country then

return factbookPrefix

end

local result = factbookPrefix..'countries/'..parseFragment(args.country)

if args.section then

return result..'/#'..parseFragment(args.section)

end

return result

end

-- Function to fill in archive link:

-- Arguments:

-- args.archive: if non-empty, return nil

-- args.year: else if this is non-empty, use it for year

-- args.date: else if this is non-empty, parse it for a year

-- Returns:

-- the link, above, filled in with the year, or nil

function p._archive(args)

if args.archive then

return nil

end

local year = nil

if args.year then

year = tonumber(args.year)

elseif args.date then

i, j = mw.ustring.find(args.date,'20%d%d')

if i and j then

year = tonumber(mw.ustring.sub(args.date,i,j))

end

end

if not year then

return year

end

if year >= tonumber(os.date('%Y'))-1 then

return false

end

return mw.ustring.format(archiveFormat, year, year)

end

function p.country(frame)

local args = getArgs(frame)

return p._country(args)

end

function p.archive(frame)

local args = getArgs(frame)

return p._archive(args) or ''

end

return p