Модуль:Taxonomy/classification

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Землеройкин (обсуждение | вклад) в 20:37, 24 декабря 2019. Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску
Документация

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

См. также

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

Rang_Osn = "/Домен/Реалм/Царство/Тип/Отдел/Класс/Отряд/Порядок/Семейство/Род/Вид/Ихнород/Ихновид/"
Rang_Dop = "/Надцарство/Субреалм/Подцарство/Надтип/Надотдел/Подтип/Подотдел/Инфратип/Надкласс/Подкласс/Инфракласс/Надотряд/Надпорядок/Подотряд/Подпорядок/Инфраотряд/Секция/Подсекция/Надсемейство/Подсемейство/Надтриба/Триба/Подтриба/Раздел/Подраздел/Подрод/Надсекция/Секция/Подсекция/Ряд/Подряд/Подвид/Вариетет/Разновидность/Подразновидность/Форма/Подформа/"
Rang_Bez = "/Группа/Клада/Без ранга/"
Rang_Ich = "/Ихнород/Ихновид/"

local function RangClass(rang)
    return string.find(Rang_Osn, "/" .. rang .. "/", 1, true) and "" or "class=NavContent"
end

local function RangString(rang)
    rang = (rang ~= "") and rang or "'''???'''"
    local srang = "/" .. rang .. "/"
    local color = (string.find(Rang_Ich, srang, 1, true) and "DarkViolet")
            or (string.find(Rang_Osn, srang, 1, true) and "inherit")
            or (string.find(Rang_Dop, srang, 1, true) and "#007878")
            or (string.find(Rang_Bez, srang, 1, true) and "#6F6F00")
            or ((rang == "'''???'''") and "Red")
            or "DarkRed"
    return '<span style="color:' .. color .. ';">' .. rang .. '</span>'
end

local function NameString(args)
    local latlink = string.gsub(args.latin, "|.*", "")
    local latname = "''" .. string.gsub(latlink, " %(.*", "") .. "''"
    local name = (args.name ~= "") and args.name or latname
    if (args.monoaut == "") then
        return "[[" .. latlink .. "|" .. name .. "]]"
    else
        local aut = ((args.monoaut == "1") and "")
                    or ((args.name == "") and " " .. Taxonomy_latin.author {args = {args.monoaut}})
                    or " (" .. latname .. " " .. Taxonomy_latin.author {args = {args.monoaut}} .. ")"
        return "'''" .. name .. "'''" .. aut
    end
end

local function TaxString(args, last)
args.rang = mw.ustring.gsub(args.rang, ".", mw.ustring.upper, 1) -- на всякий случай
return "<div " ..
    (last and "" or RangClass(args.rang)) ..
    "><table width=100% cellpadding=0 cellspacing=0><tr><td width=40% align=right valign=top>" ..
    RangString(args.rang) ..
    ":&nbsp;</td><td width=60% align=left>" ..
    ((args.ext ~= "") and "†&nbsp;" or "") ..
    NameString { name = args.name,
                latin = args.latin,
              monoaut = args.monoaut
               } ..
    (args.ref or "") ..
    "</td></tr></table></div>"
end

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

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

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

    local ok, parent = pcall(frame.expandTemplate, frame, {title = taxon, args = {"parent"}})
    if ok then -- есть шаблон {{{latin}}}, берём оттуда
        args = { latin = frame:expandTemplate {title = taxon, args = {"latin"}},
                  rang = frame:expandTemplate {title = taxon, args = {"rang"}},                 
                   ext = frame:expandTemplate {title = taxon, args = {"ext"}},
                  name = frame:expandTemplate {title = taxon, args = {"name"}},
               monoaut = "1"
               }
    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 "",
               monoaut = "1"
               }
        if (parent == "") then
            return ErrorText("нет шаблона «[[Шаблон:" .. taxon .. "|" .. taxon .. "]]». Заполните параметры '''<big>parent</big>''' и '''<big>rang</big>'''.")
        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(frame.expandTemplate, frame, {title = taxon, args = {"parent"}})
        if not ok then -- error: no template
            res = ErrorText('нет [[Шаблон:Таксон#Система таксономической навигации|таксошаблона]] «[[Шаблон:' .. taxon .. '|' .. taxon .. ']]», который должен описывать систематическое положение таксона [[' .. taxon .. ']].') .. res
            break
        end
        if taxlist[parent] then -- error: loop
            res = ErrorText('обнаружена петля: [[Шаблон:Таксон#Система таксономической навигации|таксошаблон]] «[[Шаблон:' .. taxon .. '|' .. taxon .. ']]» ссылается на свой подчинённый таксон.') .. res
            ok = false
            break
        end
        args = {   latin = frame:expandTemplate {title = taxon, args = {"latin"}},
                    rang = frame:expandTemplate {title = taxon, args = {"rang"}},
                     ext = frame:expandTemplate {title = taxon, args = {"ext"}},
                    name = frame:expandTemplate {title = taxon, args = {"name"}},
                 monoaut = frame:expandTemplate {title = taxon, args = {"monoaut"}},
                     ref = frame:expandTemplate {title = taxon, args = {"ref"}},                     
               }
        args.ref = (args.ref ~= "") and frame:extensionTag {name = "ref", content = args.ref}
        res = TaxString(args) .. res
    end

    return '<div class="NavFrame' ..
        (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

return p