Module:Sandbox/trappist the monk/make cite iucn

require ('strict');

--[[--< A U T H O R _ L I S T _ M A K E >--

creates a list of individual |authorn= parameters from the list of names provided in the raw iucn citation. names must have the form: Surname, I. (more than one 'I.' pair allowed but no spaces between I. pairs)

]]

local function author_names_get (raw_iucn_cite) local list = {};															-- table that holds name list parts local author_names = raw_iucn_cite:match ('^([^%d]-)%s+%d%d%d%d');			-- extract author name-list from raw iucn citation

local names = author_names:gsub ('%.,?%s+&%s+', '.|'):gsub ('%.,%s+', '.|');	-- replace 'separators' (  and    ) with list = mw.text.split (names, '|');											-- split the string on the pipes into entries in list{} if 0 == #list then return table.concat ({'|author=', author_names})						-- no 'names' of the proper form; return the original as a single |author= parameter else for i, name in ipairs (list) do											-- spin through the list and list[i] = table.concat ({'|author', i, '=', name});					-- add |authorn= parameter names end return table.concat (list, ' ');										-- make a big string and return that end end

--[[--< T I T L E _ G E T >

extract and format citation title; attempts to get the italic right

binomen (amended or errata title) binomen binomen ssp. subspecies binomen subsp. subspecies binomen var. variety binomen subvar. subvariety

all of the above may have trailing amended or errata text in parentheses

TODO: are there others?

]]

local function title_get (raw_iucn_cite) local title = raw_iucn_cite:match ('%d%d%d%d%.%s+(.-)%s*%. The IUCN Red List of Threatened Species');

local patterns = {															-- tables of string.match patterns [1] and string.gsub patterns [2] {'(.-)%sssp%.%s+(.-)%s(%b)$', "%1 ssp. %2 %3"},				-- binomen ssp. subspecies (zoology) with errata or amended text {'(.-)%sssp%.%s+(.+)', "%1 ssp. %2"},							-- binomen ssp. subspecies (zoology) {'(.-)%ssubsp%.%s+(.-)%s(%b)$', "%1 subsp. %2 %3"},			-- binomen subsp. subspecies (botany) with errata or amended text {'(.-)%ssubsp%.%s+(.+)', "%1 subsp. %2"},						-- binomen subsp. subspecies (botany) {'(.-)%svar%.%s+(.-)%s+(%b)$', "%1 var. %2 %3"},				-- binomen var. variety (botany) with errata or amended text {'(.-)%svar%.%s+(.+)', "%1 var. %2"},							-- binomen var. variety (botany) {'(.-)%ssubvar%.%s+(.-)%s(%b)$', "%1 subvar. %2 %3"},			-- binomen subvar. subvariety (botany) with errata or amended text {'(.-)%ssubvar%.%s+(.+)', "%1 subvar. %2"},						-- binomen subvar. subvariety (botany) {'(.-)%s*(%b)$', "%1 %2"},										-- binomen with errata or amended text {'(.+)', "%1"},														-- binomen }	for i, v in ipairs (patterns) do											-- spin through the patterns if title:match (v[1]) then												-- when a match title = title:gsub (v[1], v[2]);									-- add italics break;																-- and done end end

return table.concat ({' |title=', title});									-- return the |title= parameter end

--[[--< M A K E _ C I T E _ I U C N >--

parses apart an iucn-format citation copied from their webpage and reformats that into a template for substing

]]

local function make_cite_iucn (frame) local raw_iucn_cite = frame.args[1]; local template = {'{{cite iucn '};											-- table that holds the template as it is being assembled local year, volume, page, doi, accessdate;

year = raw_iucn_cite:match ('^%D+(%d%d%d%d)'); volume, page = raw_iucn_cite:match ('(%d%d%d%d):%s+(e%.T%d+A+%d+)%.%s'); doi = raw_iucn_cite:match ('10%.2305/IUCN%.UK%.[%d%-]+%.RLTS%.T%d+A%d+%.en'); accessdate = raw_iucn_cite:match ('Downloaded on ([^%.]+)%.'); table.insert (template, author_names_get (raw_iucn_cite));					-- add string of author name parameters table.insert (template, table.concat ({' |year=', year}));					-- add formatted year table.insert (template, title_get (raw_iucn_cite));							-- add formatted title table.insert (template, table.concat ({' |volume=', volume}));				-- add formatted volume table.insert (template, table.concat ({' |page=', page}));					-- add formatted page table.insert (template, table.concat ({' |doi=', doi}));					-- add formatted doi table.insert (template, table.concat ({' |access-date=', accessdate}));		-- add formatted access-date table.insert (template, '}}');												-- close the template

return table.concat (template); end

----< E X P O R T E D  F U N C T I O N S >--

return { make_cite_iucn = make_cite_iucn, }