<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.agency/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://wiki.agency/index.php?action=history&amp;feed=atom&amp;title=Module%3ATaxonItalics"/>
		<link rel="alternate" type="text/html" href="https://wiki.agency/index.php?title=Module:TaxonItalics&amp;action=history"/>
		<updated>2026-04-30T22:07:59Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.1</generator>

	<entry>
		<id>https://wiki.agency/index.php?title=Module:TaxonItalics&amp;diff=1270&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.agency/index.php?title=Module:TaxonItalics&amp;diff=1270&amp;oldid=prev"/>
				<updated>2018-10-24T22:42:06Z</updated>
		
		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 22:42, 24 October 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&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>Admin</name></author>	</entry>

	<entry>
		<id>https://wiki.agency/index.php?title=Module:TaxonItalics&amp;diff=1269&amp;oldid=prev</id>
		<title>Peter coxhead: updated to tested sandbox version</title>
		<link rel="alternate" type="text/html" href="https://wiki.agency/index.php?title=Module:TaxonItalics&amp;diff=1269&amp;oldid=prev"/>
				<updated>2018-08-24T15:45:10Z</updated>
		
		<summary type="html">&lt;p&gt;updated to tested sandbox version&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&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;
&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;subg.&amp;quot;] = &amp;quot;subg.&amp;quot;,&lt;br /&gt;
    subg = &amp;quot;subg.&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.&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;
    return p.italicizeTaxonName(name, linked, abbreviated)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[=========================================================================&lt;br /&gt;
Utility 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, which causes a&lt;br /&gt;
closing parenthesis to be included.&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.abbreviate(str)&lt;br /&gt;
	local result = &amp;quot;&amp;quot;&lt;br /&gt;
	local hasParentheses = 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;
		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 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; 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.&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.italicizeTaxonName(name, linked, abbreviated)&lt;br /&gt;
    local italMarker = &amp;quot;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
    -- begin by tidying the input name: trim; replace any use of the HTML&lt;br /&gt;
    -- italic tags by Wikimedia markup; replace any alternatives to the hybrid&lt;br /&gt;
    -- symbol 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;
    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) == &amp;quot;&amp;#039;&amp;#039;&amp;quot; or string.sub(name,-2) == &amp;quot;&amp;#039;&amp;#039;&amp;quot; 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, &amp;quot;&amp;#039;&amp;#039;&amp;quot;, &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] = p.abbreviate(words[1])&lt;br /&gt;
                    words[2] = p.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] = p.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 = p.abbreviate(words[1])&lt;br /&gt;
                		for i = 2, #words-1, 1 do&lt;br /&gt;
                			result = result .. &amp;quot; &amp;quot; .. p.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;
            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;
           -- 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;
return p&lt;/div&gt;</summary>
		<author><name>Peter coxhead</name></author>	</entry>

	</feed>