Module:EFloras

require('strict')

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 "<span style=\"color: red;\">Please provide a resource number (<code>flora_id</code>). See the list of supported resource numbers at [[Module:eFloras/doc]]</span>"
	else
		local familyToVolume = getResource(floraID)
		if familyToVolume == nil then
			return "<span style=\"color: red;\">The resource number (<code>flora_id</code>) <code>" .. floraID .. "</code> is not recognized. See the list of supported resource numbers at [[Module:eFloras/doc]]</span>[[Category:Pages using eFloras template with unsupported parameter values]]"
		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&ndash;21 [[Category:Pages using eFloras template with unsupported parameter values]]"
		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 = "<i>" .. name .. "</i>"
		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 "</i> " .. abbreviation .. " <i>"
					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>")
	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

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.