<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="vi">
	<id>https://bktt.vn/index.php?action=history&amp;feed=atom&amp;title=M%C3%B4_%C4%91un%3ATaxonItalics</id>
	<title>Mô đun:TaxonItalics - Lịch sử thay đổi</title>
	<link rel="self" type="application/atom+xml" href="https://bktt.vn/index.php?action=history&amp;feed=atom&amp;title=M%C3%B4_%C4%91un%3ATaxonItalics"/>
	<link rel="alternate" type="text/html" href="https://bktt.vn/index.php?title=M%C3%B4_%C4%91un:TaxonItalics&amp;action=history"/>
	<updated>2026-04-28T17:46:32Z</updated>
	<subtitle>Lịch sử thay đổi của trang này ở wiki</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://bktt.vn/index.php?title=M%C3%B4_%C4%91un:TaxonItalics&amp;diff=9163&amp;oldid=prev</id>
		<title>Tttrung: Tạo trang mới với nội dung “local p = {} local l = {} -- used to store purely local functions  --connecting terms in three part names (e.g. Pinus sylvestris var. sylvestris) local cT…”</title>
		<link rel="alternate" type="text/html" href="https://bktt.vn/index.php?title=M%C3%B4_%C4%91un:TaxonItalics&amp;diff=9163&amp;oldid=prev"/>
		<updated>2020-11-23T02:05:57Z</updated>

		<summary type="html">&lt;p&gt;Tạo trang mới với nội dung “local p = {} local l = {} -- used to store purely local functions  --connecting terms in three part names (e.g. Pinus sylvestris var. sylvestris) local cT…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Trang mới&lt;/b&gt;&lt;/p&gt;&lt;div&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.&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local name = frame.args[1] or ''&lt;br /&gt;
    local linked = frame.args['linked'] == 'yes'&lt;br /&gt;
    local abbreviated = frame.args['abbreviated'] == 'yes'&lt;br /&gt;
    return p.italicizeTaxonName(name, linked, abbreviated)&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;quot;' then&lt;br /&gt;
			isQuoted = true&lt;br /&gt;
			result = '&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'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;quot;'&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.&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.italicizeTaxonName(name, linked, abbreviated)&lt;br /&gt;
    name = mw.text.trim(name)&lt;br /&gt;
    -- if the name begins with '[', then assume formatting is present&lt;br /&gt;
    if  mw.ustring.sub(name,1,1) == '[' 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 'word' by converting a following space to the HTML entity&lt;br /&gt;
    local italMarker = &amp;quot;''&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 ~= '' 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't italicized&lt;br /&gt;
                words[3] = '&amp;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;' .. cTerms3[words[3]] .. '&amp;lt;/span&amp;gt;'&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't italicized&lt;br /&gt;
                words[2] = '&amp;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;' .. cTerms2[words[2]] .. '&amp;lt;/span&amp;gt;'&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;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;')&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;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;'),&amp;quot;%)&amp;quot;,'&amp;lt;span style=&amp;quot;font-style:normal;&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;')&lt;br /&gt;
            -- any question marks surrounded by spans can have the spans joined&lt;br /&gt;
            result = string.gsub(result,'&amp;lt;/span&amp;gt;%?&amp;lt;span style=&amp;quot;font%-style:normal;&amp;quot;&amp;gt;','?')&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 '')&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>Tttrung</name></author>
	</entry>
</feed>