Difference between revisions of "Module:EFloras"
m (1 revision: From PNW foraging book - part 3) |
m (1 revision: Taxus) |
||
(3 intermediate revisions by the same user not shown) | |||
Line 7: | Line 7: | ||
local function getResource(floraID) | local function getResource(floraID) | ||
data = data or mw.loadData("Module:eFloras/data") | data = data or mw.loadData("Module:eFloras/data") | ||
− | return data.resources[floraID] | + | return data.resources[floraID] or data.resources[tonumber(floraID)] |
end | end | ||
Line 22: | Line 22: | ||
end | end | ||
end | end | ||
+ | end | ||
+ | |||
+ | function p._volumeName(floraID, volume, family) | ||
+ | floraID = tonumber(floraID) | ||
+ | |||
+ | if not floraID then -- floraID is not a number. | ||
+ | return | ||
+ | end | ||
+ | |||
+ | data = data or mw.loadData("Module:eFloras/data") | ||
+ | |||
+ | if not volume then | ||
+ | local familyToVolume = data.volumeTable[floraID] | ||
+ | if not familyToVolume then | ||
+ | return | ||
+ | end | ||
+ | |||
+ | volume = tonumber(familyToVolume[family]) | ||
+ | |||
+ | if not volume then | ||
+ | return | ||
+ | end | ||
+ | end | ||
+ | |||
+ | local floraVolumeNames = data.volumeNames and data.volumeNames[floraID] | ||
+ | if floraVolumeNames and volume then | ||
+ | return floraVolumeNames[volume] | ||
+ | end | ||
+ | end | ||
+ | |||
+ | function p.volumeName(frame) | ||
+ | if not (frame.args[1] and (frame.args[2] or frame.args[3] or frame.args.family)) then | ||
+ | return | ||
+ | end | ||
+ | |||
+ | local floraID = string.match(frame.args[1], "%d+") | ||
+ | local volume = tonumber(frame.args[2]) | ||
+ | local family = frame.args[3] or frame.args.family | ||
+ | |||
+ | if not (floraID and (volume or family)) then | ||
+ | return | ||
+ | end | ||
+ | |||
+ | return p._volumeName(floraID, volume, family) | ||
end | end | ||
Line 76: | Line 120: | ||
local family = frame.args[2] or frame.args.family | local family = frame.args[2] or frame.args.family | ||
data = data or mw.loadData("Module:eFloras/data") | data = data or mw.loadData("Module:eFloras/data") | ||
− | local familyToVolume = data.volumeTable[floraID] | + | local familyToVolume = data.volumeTable[floraID] or data.volumeTable[tonumber(floraID)] |
if familyToVolume == nil then | if familyToVolume == nil then | ||
return "" | return "" | ||
Line 94: | Line 138: | ||
function p.italicize(name) | function p.italicize(name) | ||
local orig = name | local orig = name | ||
− | name = string.gsub(name, "^%s*(. | + | name = string.gsub(name, "^%s*(.-)%s*$", "%1") |
local count | local count | ||
Line 109: | Line 153: | ||
local rank | local rank | ||
+ | local lowerName = name:lower() | ||
if name == "" or name == nil then | if name == "" or name == nil then | ||
return | return | ||
− | elseif string.find(name, "%u%l+eae$") then | + | elseif string.find(name, "^%u%l+ae$") then |
− | + | if string.find(name, "eae$") then | |
− | + | if string.find(name, "aceae$") then | |
− | + | rank = "family" | |
− | rank = " | + | elseif string.find(name, "oideae$") then |
− | + | rank = "subfamily" | |
− | rank = " | + | else |
+ | rank = "tribe" | ||
+ | end | ||
+ | elseif string.find(name, "inae$") then | ||
+ | rank = "subtribe" | ||
end | end | ||
− | elseif string.find( | + | elseif string.find(lowerName, "subsp.", 1, true) then |
− | |||
− | |||
rank = "subspecies" | rank = "subspecies" | ||
− | elseif string.find( | + | elseif string.find(lowerName, "subg.", 1, true) then |
rank = "subgenus" | rank = "subgenus" | ||
− | elseif string.find( | + | elseif string.find(lowerName, "var.", 1, true) then |
rank = "variety" | rank = "variety" | ||
− | elseif string.find( | + | elseif string.find(lowerName, "sect.", 1, true) then |
rank = "section" | rank = "section" | ||
elseif string.find(name, "^%a+%s[%a-]+$") or string.find(name, "^%a+%s×%s[%a-]+$") then | elseif string.find(name, "^%a+%s[%a-]+$") or string.find(name, "^%a+%s×%s[%a-]+$") then | ||
Line 134: | Line 181: | ||
and not string.find(name, ".%u") then -- Uppercase letters can only appear at beginning of taxonomic name. | and not string.find(name, ".%u") then -- Uppercase letters can only appear at beginning of taxonomic name. | ||
rank = "genus" | rank = "genus" | ||
− | |||
− | |||
end | end | ||
if not rank then | if not rank then | ||
+ | mw.log("Module:eFloras could not determine a taxonomic rank for the input that it received: " .. name) | ||
return orig | return orig | ||
end | end | ||
Line 147: | Line 193: | ||
name = "<i>" .. name .. "</i>" | name = "<i>" .. name .. "</i>" | ||
local hybrid = "×" | local hybrid = "×" | ||
− | local abbreviations = { | + | |
− | + | if name:find(".", 1, true) then | |
− | + | local abbreviations = { | |
− | + | ["subsp."] = true, ["ssp."] = true, ["var."] = true, ["f."] = true, | |
− | + | ["sect."] = true, ["subsect."] = true, ["subg."] = true, | |
− | + | } | |
− | + | ||
− | + | local unrecognized | |
− | + | name = name:gsub( | |
− | + | "%s+(%S+%.)%s+", | |
− | + | function (abbreviation) | |
− | + | mw.log(name, abbreviation, abbreviation:lower(), abbreviations[abbreviation:lower()]) | |
− | + | if abbreviations[abbreviation:lower()] then | |
− | end | + | return "</i> " .. abbreviation .. " <i>" |
− | end | + | else |
+ | unrecognized = unrecognized or {} | ||
+ | table.insert(unrecognized, abbreviation) | ||
+ | end | ||
+ | end) | ||
+ | |||
+ | if unrecognized then | ||
+ | mw.log(string.format("The abbreviation%s %s %s not recognized.", | ||
+ | unrecognized[2] and "s" or "", | ||
+ | table.concat( | ||
+ | unrecognized, | ||
+ | ", "), | ||
+ | unrecognized[2] and "are" or "is")) | ||
+ | return orig | ||
+ | end | ||
+ | end | ||
name = name:gsub("%s+" .. hybrid .. "%s+", "</i> " .. hybrid .. " <i>") | name = name:gsub("%s+" .. hybrid .. "%s+", "</i> " .. hybrid .. " <i>") | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end -- Else do not modify name. | end -- Else do not modify name. | ||
Latest revision as of 14:11, 11 September 2018
require('Module:No globals')
local p = {}
local data -- Load Module:eFloras/data if needed and assign to this variable.
local function getResource(floraID) data = data or mw.loadData("Module:eFloras/data") return data.resources[floraID] or data.resources[tonumber(floraID)] end
function p.resource(frame)
local floraID = string.match(frame.args[1], "%d+")
if floraID == nil then
return "Please provide a resource number (flora_id
). See the list of supported resource numbers at Module:eFloras/doc"
else
local familyToVolume = getResource(floraID)
if familyToVolume == nil then
return "The resource number (flora_id
) " .. floraID .. "
is not recognized. See the list of supported resource numbers at Module:eFloras/doc"
else
return familyToVolume
end
end
end
function p._volumeName(floraID, volume, family) floraID = tonumber(floraID)
if not floraID then -- floraID is not a number. return end
data = data or mw.loadData("Module:eFloras/data")
if not volume then local familyToVolume = data.volumeTable[floraID] if not familyToVolume then return end
volume = tonumber(familyToVolume[family])
if not volume then return end end
local floraVolumeNames = data.volumeNames and data.volumeNames[floraID] if floraVolumeNames and volume then return floraVolumeNames[volume] end end
function p.volumeName(frame) if not (frame.args[1] and (frame.args[2] or frame.args[3] or frame.args.family)) then return end
local floraID = string.match(frame.args[1], "%d+") local volume = tonumber(frame.args[2]) local family = frame.args[3] or frame.args.family
if not (floraID and (volume or family)) then return end
return p._volumeName(floraID, volume, family) end
function p._volumeDate(floraID, volume, family) floraID = tonumber(floraID)
if not floraID then -- floraID is not a number. return end
data = data or mw.loadData("Module:eFloras/data")
if not volume then local familyToVolume = data.volumeTable[floraID] if not familyToVolume then return end
volume = tonumber(familyToVolume[family])
if not volume then return end end
local floraVolumeDates = data.volumeDates and data.volumeDates[floraID] if floraVolumeDates then if volume and floraVolumeDates[volume] then return floraVolumeDates[volume] else return floraVolumeDates.default end end end
function p.volumeDate(frame) if not (frame.args[1] and (frame.args[2] or frame.args[3] or frame.args.family)) then return end
local floraID = string.match(frame.args[1], "%d+") local volume = tonumber(frame.args[2]) local family = frame.args[3] or frame.args.family
if not (floraID and (volume or family)) then return end
return p._volumeDate(floraID, volume, family) end
function p.volume(frame) local floraID = string.match(frame.args[1], "%d+") local family = frame.args[2] or frame.args.family data = data or mw.loadData("Module:eFloras/data") local familyToVolume = data.volumeTable[floraID] or data.volumeTable[tonumber(floraID)] if familyToVolume == nil then return "" else local volume = familyToVolume[family] if volume == "error" then return "19–21" elseif volume == nil then return "" else return volume end end end
-- Italicize if name requires it. function p.italicize(name) local orig = name name = string.gsub(name, "^%s*(.-)%s*$", "%1")
local count name, count = string.gsub(name, "\'\'\'?", "")
if count > 0 then -- A tracking method used on Wiktionary: wikt:Module:debug. -- To see the results: -- Special:WhatLinksHere/Template:tracking/eFloras/italics or bolding local frame = mw.getCurrentFrame() pcall(frame.expandTemplate, frame, { title = 'tracking/eFloras/italics or bolding' }) mw.log("Italics in input to the italicize function in Module:eFloras:", orig) end
local rank local lowerName = name:lower() if name == "" or name == nil then return elseif string.find(name, "^%u%l+ae$") then if string.find(name, "eae$") then if string.find(name, "aceae$") then rank = "family" elseif string.find(name, "oideae$") then rank = "subfamily" else rank = "tribe" end elseif string.find(name, "inae$") then rank = "subtribe" end elseif string.find(lowerName, "subsp.", 1, true) then rank = "subspecies" elseif string.find(lowerName, "subg.", 1, true) then rank = "subgenus" elseif string.find(lowerName, "var.", 1, true) then rank = "variety" elseif string.find(lowerName, "sect.", 1, true) then rank = "section" elseif string.find(name, "^%a+%s[%a-]+$") or string.find(name, "^%a+%s×%s[%a-]+$") then rank = "species" elseif string.find(name, "^%u%a+$") -- No one-letter genera, probably. and not string.find(name, ".%u") then -- Uppercase letters can only appear at beginning of taxonomic name. rank = "genus" end
if not rank then mw.log("Module:eFloras could not determine a taxonomic rank for the input that it received: " .. name) return orig end
if rank == "genus" or rank == "subgenus" or rank == "species" or rank == "subspecies" or rank == "variety" or rank == "section" then
name = "" .. name .. "" local hybrid = "×"
if name:find(".", 1, true) then local abbreviations = { ["subsp."] = true, ["ssp."] = true, ["var."] = true, ["f."] = true, ["sect."] = true, ["subsect."] = true, ["subg."] = true, }
local unrecognized name = name:gsub( "%s+(%S+%.)%s+", function (abbreviation) mw.log(name, abbreviation, abbreviation:lower(), abbreviations[abbreviation:lower()]) if abbreviations[abbreviation:lower()] then return " " .. abbreviation .. " " else unrecognized = unrecognized or {} table.insert(unrecognized, abbreviation) end end)
if unrecognized then mw.log(string.format("The abbreviation%s %s %s not recognized.", unrecognized[2] and "s" or "", table.concat( unrecognized, ", "), unrecognized[2] and "are" or "is")) return orig end end
name = name:gsub("%s+" .. hybrid .. "%s+", " " .. hybrid .. " ") end -- Else do not modify name.
return name end
function p.name(frame) local name = frame.args[1] return p.italicize(name) end
p.get_volume = p.volume
return p