<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://telupedia.w.kmwc.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ATaxonItalics</id>
	<title>Module:TaxonItalics - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://telupedia.w.kmwc.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ATaxonItalics"/>
	<link rel="alternate" type="text/html" href="https://telupedia.w.kmwc.org/index.php?title=Module:TaxonItalics&amp;action=history"/>
	<updated>2026-04-05T19:29:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://telupedia.w.kmwc.org/index.php?title=Module:TaxonItalics&amp;diff=2642&amp;oldid=prev</id>
		<title>Maxisnt: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://telupedia.w.kmwc.org/index.php?title=Module:TaxonItalics&amp;diff=2642&amp;oldid=prev"/>
		<updated>2025-10-15T00:06:51Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:06, 15 October 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Maxisnt</name></author>
	</entry>
	<entry>
		<id>https://telupedia.w.kmwc.org/index.php?title=Module:TaxonItalics&amp;diff=2641&amp;oldid=prev</id>
		<title>Maxisnt: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://telupedia.w.kmwc.org/index.php?title=Module:TaxonItalics&amp;diff=2641&amp;oldid=prev"/>
		<updated>2022-11-27T18:51:46Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[=========================================================================&lt;br /&gt;
Italicize a taxon name appropriately by invoking italicizeTaxonName.&lt;br /&gt;
The algorithm used is:&lt;br /&gt;
* If the name has italic markup at the start or the end, do nothing.&lt;br /&gt;
* Else&lt;br /&gt;
  * Remove (internal) italic markup.&lt;br /&gt;
  * If the name is made up of four words and the third word is a&lt;br /&gt;
    botanical connecting term, de-italicize the connecting term and add italic&lt;br /&gt;
    markup to the outside of the name.&lt;br /&gt;
  * Else if the name is made up of three words and the second word is a&lt;br /&gt;
    botanical connecting term or a variant of &amp;quot;cf.&amp;quot;, de-italicize the&lt;br /&gt;
    connecting term and add italic markup to the outside of the name.&lt;br /&gt;
  * Else just add italic markup to the outside of the name.&lt;br /&gt;
 The module also:&lt;br /&gt;
 * Ensures that the hybrid symbol, ×, and parentheses are not italicized, as&lt;br /&gt;
   well as any string inside parentheses if dab is true.&lt;br /&gt;
 * Has an option to abbreviate all parts of taxon names other than the last&lt;br /&gt;
   to the first letter (e.g. &amp;quot;Pinus sylvestris var. sylvestris&amp;quot; becomes&lt;br /&gt;
   &amp;quot;P. s. var. sylvestris&amp;quot;).&lt;br /&gt;
 * Has an option to wikilink the italicized name to the input name.&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local l = {} -- used to store purely local functions&lt;br /&gt;
&lt;br /&gt;
--connecting terms in three part names (e.g. Pinus sylvestris var. sylvestris)&lt;br /&gt;
local cTerms3 = {&lt;br /&gt;
	--subsp.&lt;br /&gt;
    subspecies = &amp;quot;subsp.&amp;quot;,&lt;br /&gt;
    [&amp;quot;subsp.&amp;quot;] = &amp;quot;subsp.&amp;quot;,&lt;br /&gt;
    subsp = &amp;quot;subsp.&amp;quot;,&lt;br /&gt;
    [&amp;quot;ssp.&amp;quot;] = &amp;quot;subsp.&amp;quot;,&lt;br /&gt;
    ssp = &amp;quot;subsp.&amp;quot;,&lt;br /&gt;
    --var.&lt;br /&gt;
    varietas = &amp;quot;var.&amp;quot;,&lt;br /&gt;
    [&amp;quot;var.&amp;quot;] = &amp;quot;var.&amp;quot;,&lt;br /&gt;
    var = &amp;quot;var.&amp;quot;,&lt;br /&gt;
    --subvar.&lt;br /&gt;
    subvarietas = &amp;quot;subvar.&amp;quot;,&lt;br /&gt;
    [&amp;quot;subvar.&amp;quot;] = &amp;quot;subvar.&amp;quot;,&lt;br /&gt;
    subvar = &amp;quot;subvar.&amp;quot;,&lt;br /&gt;
    --f.&lt;br /&gt;
    forma = &amp;quot;f.&amp;quot;,&lt;br /&gt;
    [&amp;quot;f.&amp;quot;] = &amp;quot;f.&amp;quot;,&lt;br /&gt;
    f = &amp;quot;f.&amp;quot;,&lt;br /&gt;
    --subf.&lt;br /&gt;
    subforma = &amp;quot;subf.&amp;quot;,&lt;br /&gt;
    [&amp;quot;subf.&amp;quot;] = &amp;quot;subf.&amp;quot;,&lt;br /&gt;
    subf = &amp;quot;subf.&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
--connecting terms in two part names (e.g. Pinus sect. Pinus)&lt;br /&gt;
local cTerms2 = {&lt;br /&gt;
	--subg.&lt;br /&gt;
    subgenus = &amp;quot;subg.&amp;quot;,&lt;br /&gt;
    [&amp;quot;subgen.&amp;quot;] = &amp;quot;subg.&amp;quot;,&lt;br /&gt;
    [&amp;quot;subg.&amp;quot;] = &amp;quot;subg.&amp;quot;,&lt;br /&gt;
    subg = &amp;quot;subg.&amp;quot;,&lt;br /&gt;
    --supersect.&lt;br /&gt;
    supersection = &amp;quot;supersect.&amp;quot;,&lt;br /&gt;
    [&amp;quot;supersect.&amp;quot;] = &amp;quot;supersect.&amp;quot;,&lt;br /&gt;
    supersect = &amp;quot;supersect.&amp;quot;,&lt;br /&gt;
    --sect.&lt;br /&gt;
    section = &amp;quot;sect.&amp;quot;,&lt;br /&gt;
    [&amp;quot;sect.&amp;quot;] = &amp;quot;sect.&amp;quot;,&lt;br /&gt;
    sect = &amp;quot;sect.&amp;quot;,&lt;br /&gt;
    --subsect.&lt;br /&gt;
    subsection = &amp;quot;subsect.&amp;quot;,&lt;br /&gt;
    [&amp;quot;subsect.&amp;quot;] = &amp;quot;subsect.&amp;quot;,&lt;br /&gt;
    subsect = &amp;quot;subsect.&amp;quot;,&lt;br /&gt;
    --ser.&lt;br /&gt;
    series = &amp;quot;ser.&amp;quot;,&lt;br /&gt;
    [&amp;quot;ser.&amp;quot;] = &amp;quot;ser.&amp;quot;,&lt;br /&gt;
    ser = &amp;quot;ser.&amp;quot;,&lt;br /&gt;
    --subser.&lt;br /&gt;
    subseries = &amp;quot;subser.&amp;quot;,&lt;br /&gt;
    [&amp;quot;subser.&amp;quot;] = &amp;quot;subser.&amp;quot;,&lt;br /&gt;
    subser = &amp;quot;subser.&amp;quot;,&lt;br /&gt;
    --cf.&lt;br /&gt;
    cf = &amp;quot;cf.&amp;quot;,&lt;br /&gt;
    [&amp;quot;cf.&amp;quot;] = &amp;quot;cf.&amp;quot;,&lt;br /&gt;
    [&amp;quot;c.f.&amp;quot;] = &amp;quot;cf.&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
--[[=========================================================================&lt;br /&gt;
Main function to italicize a taxon name appropriately. For the purpose of the&lt;br /&gt;
parameters, see p.italicizeTaxonName().&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local name = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
    local linked = frame.args[&amp;#039;linked&amp;#039;] == &amp;#039;yes&amp;#039;&lt;br /&gt;
    local abbreviated = frame.args[&amp;#039;abbreviated&amp;#039;] == &amp;#039;yes&amp;#039;&lt;br /&gt;
    local dab = frame.args[&amp;#039;dab&amp;#039;] == &amp;#039;yes&amp;#039;&lt;br /&gt;
    return p.italicizeTaxonName(name, linked, abbreviated, dab)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[=========================================================================&lt;br /&gt;
Utility local function to abbreviate an input string to its first character&lt;br /&gt;
followed by &amp;quot;.&amp;quot;.&lt;br /&gt;
Both &amp;quot;×&amp;quot; and an HTML entity at the start of the string are skipped over in&lt;br /&gt;
determining first character, as is an opening parenthesis and an opening &amp;quot;,&lt;br /&gt;
which cause a matching closing character to be included.&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function l.abbreviate(str)&lt;br /&gt;
	local result = &amp;quot;&amp;quot;&lt;br /&gt;
	local hasParentheses = false&lt;br /&gt;
	local isQuoted = false&lt;br /&gt;
	if mw.ustring.len(str) &amp;lt; 2 then&lt;br /&gt;
		--single character strings are left unchanged&lt;br /&gt;
		result = str&lt;br /&gt;
	else&lt;br /&gt;
		--skip over an opening parenthesis that could be present at the start of the string&lt;br /&gt;
		if mw.ustring.sub(str,1,1) == &amp;quot;(&amp;quot; then&lt;br /&gt;
			hasParentheses = true&lt;br /&gt;
			result = &amp;quot;(&amp;quot; &lt;br /&gt;
			str = mw.ustring.sub(str,2,mw.ustring.len(str))&lt;br /&gt;
		elseif mw.ustring.sub(str,1,1) == &amp;#039;&amp;quot;&amp;#039; then&lt;br /&gt;
			isQuoted = true&lt;br /&gt;
			result = &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
			str = mw.ustring.sub(str,2,mw.ustring.len(str))&lt;br /&gt;
		end&lt;br /&gt;
		--skip over a hybrid symbol that could be present at the start of the string&lt;br /&gt;
		if mw.ustring.sub(str,1,1) == &amp;quot;×&amp;quot; then&lt;br /&gt;
			result = &amp;quot;×&amp;quot; &lt;br /&gt;
			str = mw.ustring.sub(str,2,mw.ustring.len(str))&lt;br /&gt;
		end&lt;br /&gt;
		--skip over an HTML entity that could be present at the start of the string&lt;br /&gt;
		if mw.ustring.sub(str,1,1) == &amp;quot;&amp;amp;&amp;quot; then&lt;br /&gt;
			local i,dummy = mw.ustring.find(str,&amp;quot;;&amp;quot;,2,plain)&lt;br /&gt;
			result = result .. mw.ustring.sub(str,1,i)&lt;br /&gt;
			str = mw.ustring.sub(str,i+1,mw.ustring.len(str))&lt;br /&gt;
		end&lt;br /&gt;
		--if there&amp;#039;s anything left, reduce it to its first character plus &amp;quot;.&amp;quot;,&lt;br /&gt;
		--adding the closing parenthesis or quote if required&lt;br /&gt;
		if str ~= &amp;quot;&amp;quot; then &lt;br /&gt;
			result = result .. mw.ustring.sub(str,1,1) .. &amp;quot;.&amp;quot;&lt;br /&gt;
			if hasParentheses then result = result .. &amp;quot;)&amp;quot;&lt;br /&gt;
			elseif isQuoted then result = result .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[=========================================================================&lt;br /&gt;
The function which does the italicization. Parameters:&lt;br /&gt;
 name (string) – the taxon name to be processed&lt;br /&gt;
 linked (boolean) – should a wikilink be generated?&lt;br /&gt;
 abbreviated (boolean) – should the first parts of the taxon name be&lt;br /&gt;
   reduced to capital letters?&lt;br /&gt;
 dab (boolean) – should any parenthesized part be treated as a disambiguation&lt;br /&gt;
   term and left unitalicized?&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.italicizeTaxonName(name, linked, abbreviated, dab)&lt;br /&gt;
    name = mw.text.trim(name)&lt;br /&gt;
    -- if the name begins with &amp;#039;[&amp;#039;, then assume formatting is present&lt;br /&gt;
    if  mw.ustring.sub(name,1,1) == &amp;#039;[&amp;#039; then return name end&lt;br /&gt;
    -- otherwise begin by replacing any use of the HTML italic tags&lt;br /&gt;
    -- by Wikimedia markup; replace any entity alternatives to the hybrid symbol&lt;br /&gt;
    -- by the symbol itself; prevent the hybrid symbol being treated as&lt;br /&gt;
    -- a &amp;#039;word&amp;#039; by converting a following space to the HTML entity&lt;br /&gt;
    local italMarker = &amp;quot;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
    name = string.gsub(mw.text.trim(name), &amp;quot;&amp;lt;/?i&amp;gt;&amp;quot;, italMarker)&lt;br /&gt;
    name = string.gsub(string.gsub(name, &amp;quot;&amp;amp;#215;&amp;quot;, &amp;quot;×&amp;quot;), &amp;quot;&amp;amp;times;&amp;quot;, &amp;quot;×&amp;quot;)&lt;br /&gt;
    name = string.gsub(name, &amp;quot;&amp;lt;/?span.-&amp;gt;&amp;quot;, &amp;quot;&amp;quot;) -- remove any span markup&lt;br /&gt;
    name = string.gsub(name, &amp;quot;× &amp;quot;, &amp;quot;×&amp;amp;#32;&amp;quot;)&lt;br /&gt;
    -- now italicize and abbreviate if required&lt;br /&gt;
    local result = name&lt;br /&gt;
    if name ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        if string.sub(name,1,2) == italMarker or string.sub(name,-2) == italMarker then&lt;br /&gt;
            -- do nothing if the name already has italic markers at the start or end&lt;br /&gt;
        else&lt;br /&gt;
            name = string.gsub(name, italMarker, &amp;quot;&amp;quot;) -- first remove any internal italics&lt;br /&gt;
            local words = mw.text.split(name, &amp;quot; &amp;quot;, true)&lt;br /&gt;
            if #words == 4 and cTerms3[words[3]] then&lt;br /&gt;
                -- the third word of a four word name is a connecting term&lt;br /&gt;
                -- ensure the connecting term isn&amp;#039;t italicized&lt;br /&gt;
                words[3] = &amp;#039;&amp;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;&amp;#039; .. cTerms3[words[3]] .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
                if abbreviated then&lt;br /&gt;
                	words[1] = l.abbreviate(words[1])&lt;br /&gt;
                    words[2] = l.abbreviate(words[2])&lt;br /&gt;
            	end&lt;br /&gt;
                result = words[1] .. &amp;quot; &amp;quot; .. words[2] .. &amp;quot; &amp;quot; .. words[3] .. &amp;quot; &amp;quot; .. words[4]&lt;br /&gt;
            elseif #words == 3 and cTerms2[words[2]] then&lt;br /&gt;
                -- the second word of a three word name is a connecting term&lt;br /&gt;
                -- ensure the connecting term isn&amp;#039;t italicized&lt;br /&gt;
                words[2] = &amp;#039;&amp;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;&amp;#039; .. cTerms2[words[2]] .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
                if abbreviated then&lt;br /&gt;
                	words[1] = l.abbreviate(words[1])&lt;br /&gt;
                end&lt;br /&gt;
                result = words[1] .. &amp;quot; &amp;quot; .. words[2] .. &amp;quot; &amp;quot; .. words[3]&lt;br /&gt;
            else&lt;br /&gt;
                -- not a name as above; only deal with abbreviation&lt;br /&gt;
                if abbreviated then&lt;br /&gt;
                	if #words &amp;gt; 1 then&lt;br /&gt;
                		result = l.abbreviate(words[1])&lt;br /&gt;
                		for i = 2, #words-1, 1 do&lt;br /&gt;
                			result = result .. &amp;quot; &amp;quot; .. l.abbreviate(words[i])&lt;br /&gt;
                		end&lt;br /&gt;
                		result = result .. &amp;quot; &amp;quot; .. words[#words]&lt;br /&gt;
                	end&lt;br /&gt;
                else&lt;br /&gt;
                	result = name&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            -- deal with any hybrid symbol as it should not be italicized&lt;br /&gt;
            result = string.gsub(result, &amp;quot;×&amp;quot;, &amp;#039;&amp;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
             -- deal with any parentheses as they should not be italicized&lt;br /&gt;
            if dab then&lt;br /&gt;
            	result = string.gsub(string.gsub(result,&amp;quot;%(&amp;quot;,&amp;#039;&amp;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;(&amp;#039;),&amp;quot;%)&amp;quot;,&amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
            else&lt;br /&gt;
            	result = string.gsub(string.gsub(result,&amp;quot;%(&amp;quot;,&amp;#039;&amp;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;#039;),&amp;quot;%)&amp;quot;,&amp;#039;&amp;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
            end&lt;br /&gt;
            -- any question marks surrounded by spans can have the spans joined&lt;br /&gt;
            result = string.gsub(result,&amp;#039;&amp;lt;/span&amp;gt;%?&amp;lt;span style=&amp;quot;font%-style:normal;&amp;quot;&amp;gt;&amp;#039;,&amp;#039;?&amp;#039;)&lt;br /&gt;
        	-- add outside markup&lt;br /&gt;
            if linked then&lt;br /&gt;
                if result ~= name then&lt;br /&gt;
                    result = &amp;quot;[[&amp;quot; .. name .. &amp;quot;|&amp;quot; .. italMarker .. result .. italMarker .. &amp;quot;]]&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                    result = italMarker .. &amp;quot;[[&amp;quot; .. name .. &amp;quot;]]&amp;quot; .. italMarker&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                result = italMarker .. result .. italMarker&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[=========================================================================&lt;br /&gt;
Utility function used by other modules to check if a connecting term is&lt;br /&gt;
present in a name. The value of name is assumed to be plain text.&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.hasCT(frame)&lt;br /&gt;
    return p.hasConnectingTerm(frame.args[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
    &lt;br /&gt;
function p.hasConnectingTerm(name)&lt;br /&gt;
	local words = mw.text.split(name, &amp;quot; &amp;quot;, true)&lt;br /&gt;
	if #words == 4 and cTerms3[words[3]] then return true&lt;br /&gt;
	elseif #words == 3 and cTerms2[words[2]] then return true&lt;br /&gt;
	else return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maxisnt</name></author>
	</entry>
</feed>