Модуль:Taxonomy/classification
Перейти к навигации
Перейти к поиску
Вспомогательный модуль для шаблона {{Таксон}}. Создаёт секцию карточки «Научная классификация».
См. также[править]
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) -- class=NavContent для сворачивания всех неосновных рангов return (string.find(Rangs.Osn, "/" .. rang .. "/", 1, true) or (rang == Rangs.Err)) and "" or "class=NavContent" 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 = "''" .. latname .. "''" 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 " .. (last and "" or RangClass(rang)) .. ">" .. "<table width=100% cellpadding=0 cellspacing=0>" .. "<tr>" .. "<td class='ts-Taxonomy-rang-label' style='color:" .. RangColor(rang) .. "'>" .. rang .. ":</td>" .. "<td class='ts-Taxonomy-rang-name'>" .. ((args.ext ~= "") and "† " or "") .. NameString(args, last) .. (args.ref or "") .. "</td>" .. "</tr></table></div>" end local function NoTaxTempl(taxon) return 'нет [[Шаблон:Таксон#Система таксономической навигации|таксономического шаблона]] ' .. mw.getCurrentFrame():expandTemplate({title = 'RedTaxLink', args = {taxon}}) end local function ErrorText(text) return '<div style="background-color:Gainsboro;font-size:85%;color:Dimgray">ОШИБКА: ' .. text .. '</div>\n' .. ((mw.title.getCurrentTitle().namespace == 0) and "[[Категория:Википедия:Биологические статьи без таксошаблона]]" or "") end local function FormatOutput(text, ok) return '<div class="NavFrame' .. (ok and ' collapsed' or '') .. '" style="background-color: transparent; border:0;">' .. (ok and string.find(text, "NavContent", 1, true) and '<div class="NavHead nomobile" style="background-color: transparent; border:0;"><small style="display:block; margin-bottom:-15px;">промежуточные ранги</small></div>' or '' ) .. 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"] 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"), } args.ref = (args.ref ~= "") and frame:extensionTag {name = "ref", content = args.ref} res = TaxString(args) .. res end return FormatOutput(res, ok) end return p