Модуль:Taxonomy/classification: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
наддомен в промежуточные ранги
поддержка тёмного режима
 
(не показана 41 промежуточная версия 5 участников)
Строка 2: Строка 2:
local Taxonomy_latin = require("Module:Taxonomy/latin")
local Taxonomy_latin = require("Module:Taxonomy/latin")


local Rangs = {
local Rangs = { --классификация рангов
Osn = "/Домен/Реалм/Царство/Тип/Отдел/Класс/Отряд/Порядок/Семейство/Род/Вид/Ихнород/Ихновид/",
Osn = "/Домен/Реалм/Царство/Тип/Отдел/Класс/Отряд/Порядок/Семейство/Род/Вид/Ихнород/Ихновид/", --основные
Prom = "/Наддомен/Субреалм/Подцарство/Надтип/Надотдел/Подтип/Подотдел/Инфратип/Надкласс/Подкласс/Инфракласс/Надотряд/Надпорядок/Подотряд/Подпорядок/Инфраотряд/Надсемейство/Подсемейство/Надтриба/Триба/Подтриба/Раздел/Подраздел/Подрод/Надсекция/Секция/Подсекция/Ряд/Подряд/Комплекс видов/Подвид/Вариетет/Разновидность/Подразновидность/Форма/Подформа/",
Prom = "/Субреалм/Подцарство/Надтип/Надотдел/Подтип/Подотдел/Инфратип/Надкласс/Подкласс/Инфракласс/Надотряд/Надпорядок/Подотряд/Подпорядок/Инфраотряд/Надсемейство/Подсемейство/Надтриба/Триба/Подтриба/Раздел/Подраздел/Подрод/Надсекция/Секция/Подсекция/Ряд/Подряд/Комплекс видов/Подвид/Вариетет/Разновидность/Подразновидность/Форма/Подформа/Наддомен/", --промежуточные
Bez = "/Группа/Клада/Без ранга/",
Bez = "/Группа/Клада/Без ранга/",
Ich = "/Ихнород/Ихновид/",
Ich = "/Ихнород/Ихновид/", --ихнотаксоны
Err = "'''???'''"
Err = "'''???'''", --в случае, если ранг не заполнен
Spec = "/Вид/Подвид/Вариетет/Разновидность/Подразновидность/Форма/Подформа/Ихновид/Штамм/Биовар/Биотип/Cеровар/Серотип/Изолят/" --вид и ниже
}
}

local RangColors = {Osn = "inherit", Prom = "#007878", Dop = "DarkRed", Bez = "#6F6F00", Ich = "DarkViolet", Err = "Red"}
local RangColors = {Osn = "inherit", Prom = "#007878", Dop = "DarkRed", Bez = "#6F6F00", Ich = "DarkViolet", Err = "Red"}


local regnum
local function RangClass(rang)

return string.find(Rangs.Osn, "/" .. rang .. "/", 1, true) and "" or "class=NavContent"
local function RangClass(rang) -- класс mw-collapsible-content для сворачивания всех неосновных рангов
return (string.find(Rangs.Osn, "/" .. rang .. "/", 1, true) or (rang == Rangs.Err)) and "" or " mw-collapsible-content"
end
end


local function RangString(rang) -- эта функция раскрашивает ранги
local function RangColor(rang) -- эта функция возвращает цвет ранга (то же, что шаблон Rang/color)
rang = (rang ~= "") and rang or Rangs.Err
local srang = "/" .. rang .. "/"
local srang = "/" .. rang .. "/"
local color = (string.find(Rangs.Ich, srang, 1, true) and RangColors.Ich)
return (string.find(Rangs.Ich, srang, 1, true) and RangColors.Ich)
or (string.find(Rangs.Osn, srang, 1, true) and RangColors.Osn)
or (string.find(Rangs.Osn, srang, 1, true) and RangColors.Osn)
or (string.find(Rangs.Prom, srang, 1, true) and RangColors.Prom)
or (string.find(Rangs.Prom, srang, 1, true) and RangColors.Prom)
Строка 25: Строка 26:
or ((rang == Rangs.Err) and RangColors.Err)
or ((rang == Rangs.Err) and RangColors.Err)
or RangColors.Dop
or RangColors.Dop
return '<span style="color:' .. color .. ';">' .. rang .. '</span>'
end
end


local function NameString(args)
local function NameString(args, last) -- форматирует название таксона
local latlink = string.gsub(args.latin, "|.*", "")
local latlink = string.gsub(args.latin, " *|.*", "", 1)
local latname = "''" .. string.gsub(latlink, " %(.*", "") .. "''"
local latname = string.gsub(args.latin, ".*| *", "", 1)
latname = Taxonomy_latin.latin { args = {latname, rang = args.rang, regnum = regnum}}
local name = (args.name ~= "") and args.name or latname
local name = (args.name ~= "") and args.name or latname

if (args.monoaut == "") then
if last then
return "'''" .. name .. "'''"
elseif (args.monoaut == "") then
return "[[" .. latlink .. "|" .. name .. "]]"
return "[[" .. latlink .. "|" .. name .. "]]"
else
else
local aut = ((args.monoaut == "1") and "")
local aut = (args.monoaut == "1") and "" or " " .. Taxonomy_latin.author {args = {args.monoaut}}
or ((args.name == "") and " " .. Taxonomy_latin.author {args = {args.monoaut}})
if args.name == "" then
or " (" .. latname .. " " .. Taxonomy_latin.author {args = {args.monoaut}} .. ")"
return "'''" .. name .. "'''" .. aut
else
return "'''" .. name .. "'''" .. aut
return "'''" .. name .. "'''" .. " (" .. latname .. aut .. ")"
end
end
end
end
end


local function TaxString(args, last)
local function TaxString(args, last) -- форматирует строку классификации вида "Ранг: Таксон" (то же что шаблон TaxString)
args.rang = mw.ustring.gsub(args.rang, ".", mw.ustring.upper, 1) -- на всякий случай
args.rang = mw.ustring.gsub(args.rang, ".", mw.ustring.upper, 1) -- на всякий случай первую букву делаем прописной
local rang = (args.rang ~= "") and args.rang or Rangs.Err
return "<div " ..

(last and "" or RangClass(args.rang)) ..
return "<div class='ts-Taxonomy-rang-row" .. ((last or args.vis == "1") and "" or RangClass(rang)) .. "'>" ..
"><table width=100% cellpadding=0 cellspacing=0><tr><td width=40% align=right valign=top>" ..
"<div class='ts-Taxonomy-rang-label' style='color:" .. RangColor(rang) .. "'>" .. rang .. ":</div>" ..
RangString(args.rang) ..
"<div class='ts-Taxonomy-rang-name'>" ..
":&nbsp;</td><td width=60% align=left>" ..
((args.ext ~= "") and "†&nbsp;" or "") ..
((args.ext ~= "") and "†&nbsp;" or "") ..
NameString { name = args.name,
NameString(args, last) ..
latin = args.latin,
(args.ref or "") ..
monoaut = args.monoaut
"</div>" ..
"</div>"
} ..
end
(args.ref or "") ..

"</td></tr></table></div>"
local function NoTaxTempl(taxon)
return 'нет [[Шаблон:Таксон#Система таксономической навигации|таксономического шаблона]] ' ..
mw.getCurrentFrame():expandTemplate({title = 'RedTaxLink', args = {taxon}})
end
end


local function ErrorText(s)
local function ErrorText(text)
return '<div style="background-color:Gainsboro;font-size:85%;color:Dimgray">ОШИБКА: ' .. s .. '</div>\n' ..
return '<div class="ts-Taxonomy-error">ОШИБКА: ' .. text .. '</div>\n' ..
((mw.title.getCurrentTitle().namespace == 0) and "[[Категория:Википедия:Биологические статьи без таксошаблона]]" or "")
((mw.title.getCurrentTitle().namespace == 0) and "[[Категория:Википедия:Биологические статьи без таксошаблона]]" or "")
end

local function FormatOutput(text, ok)
local collapse = ok and string.find(text, "mw-collapsible", 1, true)
return '<div ' .. (collapse and 'data-expandtext="подробно" data-collapsetext="кратко" class="mw-collapsible mw-collapsed" ' or '') .. 'style="font-size:95%; background-color: transparent; color: inherit; border:0;">' .. text .. '</div>'
end

local function getTaxPar(frame, taxon, parName)
return mw.text.trim(frame:expandTemplate({title = taxon, args = {parName}}))
end
end


Строка 67: Строка 85:
local args = {}
local args = {}
local res = ""
local res = ""
local taxon = frame.args["latin"]
local taxon = frame.args["latin"] or ""

regnum = frame.args["regnum"]
regnum = (regnum == "Организмы") and "" or regnum
local regnumRang = ((regnum == "Бактерии") or (regnum == "Археи") or (regnum == "Вирусы")) and "Домен" or "Царство"


if not taxon or (taxon == "") then
if (taxon == "") then
return ErrorText("не заполнен параметр '''<big>latin</big>'''.")
return ErrorText("не заполнен параметр '''<big>latin</big>'''.")
end
end


local ok, parent = pcall(frame.expandTemplate, frame, {title = taxon, args = {"parent"}})
local ok, parent
local lastTemplate = mw.title.new("Шаблон:" .. taxon)
if lastTemplate and lastTemplate.exists then
ok, parent = pcall(getTaxPar, frame, taxon, "parent")
end

if ok then -- есть шаблон {{{latin}}}, берём оттуда
if ok then -- есть шаблон {{{latin}}}, берём оттуда
args = { latin = frame:expandTemplate {title = taxon, args = {"latin"}},
args = { latin = getTaxPar(frame, taxon, "latin"),
rang = frame:expandTemplate {title = taxon, args = {"rang"}},
rang = getTaxPar(frame, taxon, "rang"),
ext = frame:expandTemplate {title = taxon, args = {"ext"}},
ext = getTaxPar(frame, taxon, "ext"),
name = frame:expandTemplate {title = taxon, args = {"name"}},
name = getTaxPar(frame, taxon, "name"),
monoaut = "1"
}
}
else -- нет шаблона {{{latin}}}, берём из параметров
else -- нет шаблона {{{latin}}}, берём из параметров
Строка 87: Строка 113:
ext = frame.args["Вымер"] or "",
ext = frame.args["Вымер"] or "",
name = frame.args["name"] or "",
name = frame.args["name"] or "",
monoaut = "1"
}
}
if (parent == "") then
if (parent == "") then
if ((args.rang == "") or string.find(Rangs.Spec, "/" .. args.rang .. "/", 1, true)) then
return ErrorText("нет [[Шаблон:Таксон#Система таксономической навигации|таксономического шаблона]] {{[[Шаблон:" .. taxon .. "|" .. taxon .. "]]}}. Заполните параметры '''<big>parent</big>''' и '''<big>rang</big>'''.")
res = ErrorText("необходимо заполнить параметры '''<big>parent</big>''' и '''<big>rang</big>'''.")
else
res = ErrorText(NoTaxTempl(taxon) .. ". Заполните параметры '''<big>parent</big>''' и '''<big>rang</big>'''.")
end
return FormatOutput(res .. TaxString(args, "last"), false)
end
end
end
end
Строка 101: Строка 131:
taxon = parent
taxon = parent
taxlist[taxon] = true
taxlist[taxon] = true
ok, parent = pcall(frame.expandTemplate, frame, {title = taxon, args = {"parent"}})
ok, parent = pcall(getTaxPar, frame, taxon, "parent")
if not ok then -- error: no template
if not ok then -- error: no template
res = ErrorText("нет [[Шаблон:Таксон#Система таксономической навигации|таксономического шаблона]] {{[[Шаблон:" .. taxon .. "|" .. taxon .. "]]}}, который должен описывать систематическое положение таксона ''[[" .. taxon .. "]]''.") .. res
res = ErrorText(NoTaxTempl(taxon) .. ", который должен описывать систематическое положение таксона ''[[" .. taxon .. "]]''.") .. res
break
return FormatOutput(res, false)
end
end
if taxlist[parent] then -- error: loop
if taxlist[parent] then -- error: loop
res = ErrorText("обнаружена петля — [[Шаблон:Таксон#Система таксономической навигации|таксономический шаблон]] {{[[Шаблон:" .. taxon .. "|" .. taxon .. "]]}} ссылается на свой подчинённый таксон.") .. res
res = ErrorText("обнаружена петля — [[Шаблон:Таксон#Система таксономической навигации|таксономический шаблон]] {{[[Шаблон:" .. taxon .. "|" .. taxon .. "]]}} ссылается на свой подчинённый таксон.") .. res
ok = false
return FormatOutput(res, false)
break
end
end
args = { latin = frame:expandTemplate {title = taxon, args = {"latin"}},
args = { latin = getTaxPar(frame, taxon, "latin"),
rang = frame:expandTemplate {title = taxon, args = {"rang"}},
rang = getTaxPar(frame, taxon, "rang"),
ext = frame:expandTemplate {title = taxon, args = {"ext"}},
ext = getTaxPar(frame, taxon, "ext"),
name = frame:expandTemplate {title = taxon, args = {"name"}},
name = getTaxPar(frame, taxon, "name"),
monoaut = frame:expandTemplate {title = taxon, args = {"monoaut"}},
monoaut = getTaxPar(frame, taxon, "monoaut"),
ref = frame:expandTemplate {title = taxon, args = {"ref"}},
ref = getTaxPar(frame, taxon, "ref"),
vis = getTaxPar(frame, taxon, "vis")
}
}
args.ref = (args.ref ~= "") and frame:extensionTag {name = "ref", content = args.ref}
args.ref = (args.ref ~= "") and frame:extensionTag {name = "ref", content = args.ref}
if (args.rang == regnumRang) and (args.name ~= regnum) then
res = res .. "[[Категория:Википедия:Биологические статьи с неправильным царством в карточке]]"
end
res = TaxString(args) .. res
res = TaxString(args) .. res
end
end


return '<div class="NavFrame' ..
return FormatOutput(res, ok)
(ok and ' collapsed' or '') ..
'" style="background-color: transparent; border:0;">' ..
(ok and string.find(res, "NavContent", 1, true) and '<div class="NavHead nomobile" style="background-color: transparent; border:0;"><small style="display:block; margin-bottom:-15px;">промежуточные ранги</small></div>' or "") ..
res ..
"</div>"
end
end



Текущая версия от 16:40, 19 июня 2024

Документация

Вспомогательный модуль для шаблона {{Таксон}}. Создаёт секцию карточки «Научная классификация».

См. также

local p = {}
local Taxonomy_latin = require("Module:Taxonomy/latin")

local Rangs = { --классификация рангов
    Osn = "/Домен/Реалм/Царство/Тип/Отдел/Класс/Отряд/Порядок/Семейство/Род/Вид/Ихнород/Ихновид/", --основные
    Prom = "/Субреалм/Подцарство/Надтип/Надотдел/Подтип/Подотдел/Инфратип/Надкласс/Подкласс/Инфракласс/Надотряд/Надпорядок/Подотряд/Подпорядок/Инфраотряд/Надсемейство/Подсемейство/Надтриба/Триба/Подтриба/Раздел/Подраздел/Подрод/Надсекция/Секция/Подсекция/Ряд/Подряд/Комплекс видов/Подвид/Вариетет/Разновидность/Подразновидность/Форма/Подформа/Наддомен/", --промежуточные
    Bez = "/Группа/Клада/Без ранга/",
    Ich = "/Ихнород/Ихновид/", --ихнотаксоны
    Err = "'''???'''", --в случае, если ранг не заполнен
    Spec = "/Вид/Подвид/Вариетет/Разновидность/Подразновидность/Форма/Подформа/Ихновид/Штамм/Биовар/Биотип/Cеровар/Серотип/Изолят/" --вид и ниже
}
local RangColors = {Osn = "inherit", Prom = "#007878", Dop = "DarkRed", Bez = "#6F6F00", Ich = "DarkViolet", Err = "Red"}

local regnum

local function RangClass(rang) -- класс mw-collapsible-content для сворачивания всех неосновных рангов
    return (string.find(Rangs.Osn, "/" .. rang .. "/", 1, true) or (rang == Rangs.Err)) and "" or " mw-collapsible-content"
end

local function RangColor(rang) -- эта функция возвращает цвет ранга (то же, что шаблон Rang/color)
    local srang = "/" .. rang .. "/"
    return (string.find(Rangs.Ich, srang, 1, true) and RangColors.Ich)
            or (string.find(Rangs.Osn, srang, 1, true) and RangColors.Osn)
            or (string.find(Rangs.Prom, srang, 1, true) and RangColors.Prom)
            or (string.find(Rangs.Bez, srang, 1, true) and RangColors.Bez)
            or ((rang == Rangs.Err) and RangColors.Err)
            or RangColors.Dop
end

local function NameString(args, last) -- форматирует название таксона
    local latlink = string.gsub(args.latin, " *|.*", "", 1)
    local latname = string.gsub(args.latin, ".*| *", "", 1)
    latname = Taxonomy_latin.latin { args = {latname, rang = args.rang, regnum = regnum}}
    local name = (args.name ~= "") and args.name or latname

    if last then
        return "'''" .. name .. "'''"
    elseif (args.monoaut == "") then
        return "[[" .. latlink .. "|" .. name .. "]]"
    else
        local aut = (args.monoaut == "1") and "" or " " .. Taxonomy_latin.author {args = {args.monoaut}}
        if args.name == "" then
            return "'''" .. name .. "'''" .. aut
        else
            return "'''" .. name .. "'''" .. " (" .. latname .. aut .. ")"
        end
    end
end

local function TaxString(args, last) -- форматирует строку классификации вида "Ранг: Таксон" (то же что шаблон TaxString)
	args.rang = mw.ustring.gsub(args.rang, ".", mw.ustring.upper, 1) -- на всякий случай первую букву делаем прописной
	local rang = (args.rang ~= "") and args.rang or Rangs.Err

	return "<div class='ts-Taxonomy-rang-row" .. ((last or args.vis == "1") and "" or RangClass(rang)) .. "'>" ..
	        "<div class='ts-Taxonomy-rang-label' style='color:" .. RangColor(rang) .. "'>" .. rang .. ":</div>" ..
	        "<div class='ts-Taxonomy-rang-name'>" ..
	            ((args.ext ~= "") and "†&nbsp;" or "") ..
	            NameString(args, last) ..
	            (args.ref or "") ..
	        "</div>" ..
	    "</div>"
end

local function NoTaxTempl(taxon)
return 'нет [[Шаблон:Таксон#Система таксономической навигации|таксономического шаблона]] ' ..
    mw.getCurrentFrame():expandTemplate({title = 'RedTaxLink', args = {taxon}})
end

local function ErrorText(text)
return '<div class="ts-Taxonomy-error">ОШИБКА: ' .. text .. '</div>\n' ..
    ((mw.title.getCurrentTitle().namespace == 0) and "[[Категория:Википедия:Биологические статьи без таксошаблона]]" or "")
end

local function FormatOutput(text, ok)
local collapse = ok and string.find(text, "mw-collapsible", 1, true)
return '<div ' .. (collapse and 'data-expandtext="подробно" data-collapsetext="кратко" class="mw-collapsible mw-collapsed" ' or '') .. 'style="font-size:95%; background-color: transparent; color: inherit; border:0;">' .. text .. '</div>'
end

local function getTaxPar(frame, taxon, parName)
    return mw.text.trim(frame:expandTemplate({title = taxon, args = {parName}}))
end

function p.TaxRecursion(frame)
    local i = 0
    local args = {}
    local res = ""
    local taxon = frame.args["latin"] or ""

    regnum = frame.args["regnum"]
    regnum = (regnum == "Организмы") and "" or regnum
	local regnumRang = ((regnum == "Бактерии") or (regnum == "Археи") or (regnum == "Вирусы")) and "Домен" or "Царство"

    if (taxon == "") then
        return ErrorText("не заполнен параметр '''<big>latin</big>'''.")
    end

    local ok, parent
    local lastTemplate = mw.title.new("Шаблон:" .. taxon)
    if lastTemplate and lastTemplate.exists then
        ok, parent = pcall(getTaxPar, frame, taxon, "parent")
    end

    if ok then -- есть шаблон {{{latin}}}, берём оттуда
        args = { latin = getTaxPar(frame, taxon, "latin"),
                  rang = getTaxPar(frame, taxon, "rang"),                 
                   ext = getTaxPar(frame, taxon, "ext"),
                  name = getTaxPar(frame, taxon, "name"),
               }
    else -- нет шаблона {{{latin}}}, берём из параметров
        parent = frame.args["parent"] or ""
        args = { latin = frame.args["latin"],
                  rang = frame.args["rang"] or "",
                   ext = frame.args["Вымер"] or "",
                  name = frame.args["name"] or "",
               }
        if (parent == "") then
            if ((args.rang == "") or string.find(Rangs.Spec, "/" .. args.rang .. "/", 1, true)) then
                res = ErrorText("необходимо заполнить параметры '''<big>parent</big>''' и '''<big>rang</big>'''.")
            else
                res = ErrorText(NoTaxTempl(taxon) .. ". Заполните параметры '''<big>parent</big>''' и '''<big>rang</big>'''.")
            end
            return FormatOutput(res .. TaxString(args, "last"), false)
        end
    end

    res = TaxString(args, "last")

    local taxlist = {}
    while (parent ~= "Null") and (i < 100) do
        i = i + 1
        taxon = parent
        taxlist[taxon] = true
        ok, parent = pcall(getTaxPar, frame, taxon, "parent")
        if not ok then -- error: no template
            res = ErrorText(NoTaxTempl(taxon) .. ", который должен описывать систематическое положение таксона ''[[" .. taxon .. "]]''.") .. res
            return FormatOutput(res, false)
        end
        if taxlist[parent] then -- error: loop
            res = ErrorText("обнаружена петля — [[Шаблон:Таксон#Система таксономической навигации|таксономический шаблон]] {{[[Шаблон:" .. taxon .. "|" .. taxon .. "]]}} ссылается на свой подчинённый таксон.") .. res
            return FormatOutput(res, false)
        end
        args = {   latin = getTaxPar(frame, taxon, "latin"),
                    rang = getTaxPar(frame, taxon, "rang"),
                     ext = getTaxPar(frame, taxon, "ext"),
                    name = getTaxPar(frame, taxon, "name"),
                 monoaut = getTaxPar(frame, taxon, "monoaut"),
                     ref = getTaxPar(frame, taxon, "ref"),
                     vis = getTaxPar(frame, taxon, "vis")
               }
        args.ref = (args.ref ~= "") and frame:extensionTag {name = "ref", content = args.ref}
        if (args.rang == regnumRang) and (args.name ~= regnum) then
                res = res .. "[[Категория:Википедия:Биологические статьи с неправильным царством в карточке]]"
        end
        res = TaxString(args) .. res
    end

    return FormatOutput(res, ok)
end

return p