Gill F, D Donsker & P Rasmussen (Eds). 2020. IOC World Bird List (v10.2). doi : 10.14344/IOC.ML.10.1.  
data.IOC = {
citationArgs = {
website="IOC World Bird List",
-- version="Version 9.2", -- shouldn't default; should be hardcode so it doesn't change
['editor1-last']="Gill", ['editor1-first']="F.", ['editor1-link']="Frank Gill (ornithologist)",
['editor2-last']="Donsker", ['editor2-first']="D.",
['editor3-last']="Rasmussen", ['editor3-first']="P.", -- TODO only show from version 10.1 onwards
-- doi = "10.14344/IOC.ML.9.2", -- this changes by version number and is not a useful part of the cictation
publisher="International Ornithological Congress"
},
customArgs = { exclude="order,family,genus,species,taxon,id,1",
baseURL = "https://www.worldbirdnames.org/",
defaultSuffix = "",
defaultTitle = "IOC World Bird List: Welcome"  
},
}
data.IOC.version = function
local version = templateArgs['version']
local old = false
if version then
version = string.gsub( version, "[Vv]ersion ", "")
local versionNumber = tonumber(version)
if versionNumber < 10.1 then
old = true
end
else
local Date = require('Module:Date')._Date
if Date(templateArgs['access-date']) < Date('1 January 2020') then
old = true
end
end  
if old then
data.IOC.citationArgs['editor3-last'] = nil
data.IOC.citationArgs['editor3-first'] = nil
end
end
data.IOC.order = function(order)
data.IOC.version
local IOCorders = {Struthioniformes='ratites',Rheiformes='ratites',Apterygiformes='ratites',Casuariiformes='ratites',Tinamiformes='ratites',Galliformes='megapodes',Anseriformes='waterfowl',Caprimulgiformes='nightjars',Apodiformes='swifts',Musophagiformes='turacos',Otidiformes='turacos',Cuculiformes='turacos',Mesitornithiformes='turacos',Pterocliformes='turacos',Columbiformes='pigeons',Gruiformes='flufftails',Podicipediformes='grebes',Phoenicopteriformes='grebes',Charadriiformes='sandpipers',Eurypygiformes='loons',Phaethontiformes='loons',Gaviiformes='loons',Sphenisciformes='loons',Procellariiformes='loons',Ciconiiformes='storks',Suliformes='storks',Pelecaniformes='pelicans',Opisthocomiformes='raptors',Accipitriformes='raptors',Strigiformes='owls',Coliiformes='mousebirds',Leptosomiformes='mousebirds',Trogoniformes='mousebirds',Bucerotiformes='mousebirds',Coraciiformes='rollers',Piciformes='woodpeckers',Cariamiformes='falcons',Falconiformes='falcons',Psittaciformes='parrots',
Passeriformes='nz_wrens'} -- passeriformes link not very useful  
local title = "Order " .. firstToUpper(order)
local url = data.IOC.customArgs['baseURL'] .. "/bow/" .. IOCorders[order]
return title, url
end
data.IOC.family = function(family)
data.IOC.version
local IOCfamilies = { Struthionidae = {"ratites", 4}, Alcippeidae = {"babblers", 24989 } } -- temporary partial list for testing  
local title = "Family " .. firstToUpper(family)
--https://www.worldbirdnames.org/Family/Struthionidae
local url = data.IOC.customArgs['baseURL'] .. "Family/" .. family -- old version (might be resurrected by IOC)  
-- https://www.worldbirdnames.org/new/bow/babblers/#1338626516R24989
if IOCfamilies[family] then -- test version local partial list
url = data.IOC.customArgs['baseURL'] .. "new/bow/" .. IOCfamilies[family][1] .. "/#1338626516R" .. IOCfamilies[family][2]
end
return title, url
end
data.IOC.default = function( title, url)
data.IOC.version
return title, url
end  
data.BOW = {
citationArgs = {
website="Birds of the World Online",
-- doi = "",
-- ['last1']="Winkler", ['first1']="David W.", -- are these always the authors in version 1? no, perhaps for family page
-- ['last2']="Billerman", ['first2']="Shawn M.",
-- ['last3']="Lovette", ['first3']="Irby J.",
-- ['editor1-last']="Billerman", ['editor1-first']="S. M.", --['editor1-link']="",
-- ['editor2-last']="Keeney", ['editor2-first']="B. K.",
-- ['editor3-last']="Rodewald", ['editor3-first']="P. G.",
-- ['editor4-last']="Schulenberg", ['editor4-first']="T. S.",
-- ['version'] = 1, ['year'] = 2020, -- may not want to default
publisher="Cornell Lab of Ornithology, Ithaca, NY."
},
customArgs = { exclude="citation,make,order,family,genus,species,taxon,id,1",
baseURL = "https://birdsoftheworld.org/bow/species",
defaultSuffix = "",
defaultTitle = "Explore Taxonomy"  
},
}  
data.BOW.default = function( title, url)
--data.BOW.citationArgs['version'] = "Version 1"
return title, url
end  
-- make BOW to parse standard citation,
vesrion 1 (family): Winkler, D. W., S. M. Billerman, and I.J. Lovette (2020). Bulbuls (Pycnonotidae), version 1.0. In Birds of the World
(S. M. Billerman, B. K. Keeney, P. G. Rodewald, and T. S. Schulenberg, Editors). Cornell Lab of Ornithology, Ithaca, NY, USA.
https://doi.org/10.2173/bow.pycnon4.01
version 2 (species): Limparungpatthanakij , W. L., L. Fishpool, and J. Tobias (2020). Buff-vented Bulbul (Iole crypta), version 2.0. In Birds of the World
(S. M. Billerman and B. K. Keeney, Editors). Cornell Lab of Ornithology, Ithaca, NY, USA.
https://doi.org/10.2173/bow.buvbul1.02  
data.BOW.citation = function( value)
local citation = templateArgs['citation']  
data.BOW.citationArgs['year'] = citation:match ('^%D+(%d%d%d%d)')
data.BOW.citationArgs['doi'] = citation:match ('10%.2173/bow%..+') -- https://doi.org/10.2173/bow.pycnon4.01
--data.BOW.citationArgs['version'] = citation:match ('version %d%.%d') -- version applies to page, not whole BOW
local title = citation:match ('%d%d%d%d%)%.(.*, version %d%.%d)'); -- include version number in title
local suffix = citation:match ('10%.2173/bow%.(.+%d)%.'); -- https://doi.org/10.2173/bow.pycnon4.01
local version = "/cur/" -- for the current version
version = citation:match ('version (%d%.%d)') -- for the cited version
local url = data.BOW.customArgs['baseURL'] .. '/' .. suffix .. '/' .. version .. '/'  
title = title:gsub( '%((%D+) (%D+)%)' , "(*%1 %2*)")  
local authors = citation:match ('^(%D+) %(%d%d%d%d%)')
--data.BOW.citationArgs['authors'] = citation:match ('^(%D+)%(%d%d%d%d%)')
--data.BOW.citationArgs['editors'] = citation:match ('In Birds of the World %((.-)Editors%)' ) -- omit editors as cite web psoitioning is weird
if authors then -- split authors with modified code from make cite iucn
local list = {}
authors = authors:gsub(", and ", ", ")
--local names = author_names:gsub ('%.?,?%s+&%s+', '.|'):gsub ('%.,%s+', '.|'); -- replace 'separators' (<dot><comma><space> and <opt. dot><opt. comma><space><ampersand><space>) with <dot><pipe>
local names = authors:gsub (',%s+', '|'); -- replace any comma
-- :gsub ('%.?,?%s+and%s+', '|') -- replace 'separators' <opt. dot><opt. comma><space>and<space>) with <dot><pipe>
-- :gsub ('%.,%s+', '.|'); -- replace 'separators' <dot><comma><space> with <dot><pipe>
list = mw.text.split (names, '|'); -- split the string on the pipes into entries in list
if #list == 0 then
data.BOW.citationArgs['authors'] = authors -- no 'names' of the proper form; return the original as a single |author= parameter
else
for i, name in ipairs (list) do -- for each author in list
data.BOW.citationArgs['author'..i-1] = name -- add |authorn= parameter names
-- list[i] = table.concat ({'|author', (i == 1) and '' or i, '=', name}); -- add |authorn= parameter names; create |author= instead of |author1=
end
data.BOW.citationArgs['author1'] = data.BOW.citationArgs['author0'] .. ', ' .. data.BOW.citationArgs['author1']
end  
end  
--if not url then url = data.BOW.customArgs['baseURL'] end
--if not title then title = "Title parameter required" end  
return title, url
end  
-- basic handling for Taxonomy in Flux website
data.tif = {
citationArgs = {
website="Taxonomy in Flux",
['editor1-last']="Boyd III", ['editor1-first']="John H.", --['editor1-link']="",
},
customArgs = { exclude="order,family,genus,species,taxon,id,1",
baseURL = "http://jboyd.net/Taxo/",
defaultSuffix = "List.html",
defaultTitle = "Taxonomy in Flux"  
},
}
-- ------------- Avibase
e.g. https://avibase.bsc-eoc.org/species.jsp?avibaseid=9144EF4017F2D8B1  
data.avibase = {
citationArgs = {
website="Avibase",