Модуль:Taxonomy/classification: различия между версиями
Перейти к навигации
Перейти к поиску
[отпатрулированная версия] | [отпатрулированная версия] |
Содержимое удалено Содержимое добавлено
VladXe (обсуждение | вклад) наддомен в промежуточные ранги |
Putnik (обсуждение | вклад) поддержка тёмного режима |
||
(не показана 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) -- класс mw-collapsible-content для сворачивания всех неосновных рангов |
|||
⚫ | |||
end |
end |
||
local function |
local function RangColor(rang) -- эта функция возвращает цвет ранга (то же, что шаблон Rang/color) |
||
⚫ | |||
local srang = "/" .. rang .. "/" |
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.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 = |
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 last then |
|||
⚫ | |||
⚫ | |||
return "[[" .. latlink .. "|" .. name .. "]]" |
return "[[" .. latlink .. "|" .. name .. "]]" |
||
else |
else |
||
local aut = |
local aut = (args.monoaut == "1") and "" or " " .. Taxonomy_latin.author {args = {args.monoaut}} |
||
if args.name == "" then |
|||
return "'''" .. name .. "'''" .. aut |
|||
⚫ | |||
⚫ | |||
return "'''" .. name .. "'''" .. " (" .. latname .. aut .. ")" |
|||
⚫ | |||
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) -- на всякий случай первую букву делаем прописной |
||
⚫ | |||
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'>" .. |
|||
": </td><td width=60% align=left>" .. |
|||
((args.ext ~= "") and "† " or "") .. |
((args.ext ~= "") and "† " or "") .. |
||
NameString(args, last) .. |
|||
(args.ref or "") .. |
|||
"</div>" .. |
|||
"</div>" |
|||
⚫ | |||
end |
|||
(args.ref or "") .. |
|||
"</td></tr></table></div>" |
|||
⚫ | |||
⚫ | |||
mw.getCurrentFrame():expandTemplate({title = 'RedTaxLink', args = {taxon}}) |
|||
end |
end |
||
local function ErrorText( |
local function ErrorText(text) |
||
return '<div |
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 |
if (taxon == "") then |
||
return ErrorText("не заполнен параметр '''<big>latin</big>'''.") |
return ErrorText("не заполнен параметр '''<big>latin</big>'''.") |
||
end |
end |
||
local ok, 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 |
args = { latin = getTaxPar(frame, taxon, "latin"), |
||
rang = frame |
rang = getTaxPar(frame, taxon, "rang"), |
||
ext = frame |
ext = getTaxPar(frame, taxon, "ext"), |
||
name = frame |
name = getTaxPar(frame, taxon, "name"), |
||
⚫ | |||
} |
} |
||
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 |
|||
⚫ | |||
res = ErrorText("необходимо заполнить параметры '''<big>parent</big>''' и '''<big>rang</big>'''.") |
|||
⚫ | |||
res = ErrorText(NoTaxTempl(taxon) .. ". Заполните параметры '''<big>parent</big>''' и '''<big>rang</big>'''.") |
|||
⚫ | |||
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( |
ok, parent = pcall(getTaxPar, frame, taxon, "parent") |
||
if not ok then -- error: no template |
if not ok then -- error: no template |
||
res = ErrorText( |
res = ErrorText(NoTaxTempl(taxon) .. ", который должен описывать систематическое положение таксона ''[[" .. taxon .. "]]''.") .. res |
||
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 |
||
return FormatOutput(res, false) |
|||
break |
|||
end |
end |
||
args = { latin = frame |
args = { latin = getTaxPar(frame, taxon, "latin"), |
||
rang = frame |
rang = getTaxPar(frame, taxon, "rang"), |
||
ext = frame |
ext = getTaxPar(frame, taxon, "ext"), |
||
name = frame |
name = getTaxPar(frame, taxon, "name"), |
||
monoaut = frame |
monoaut = getTaxPar(frame, taxon, "monoaut"), |
||
ref = frame |
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 .. "[[Категория:Википедия:Биологические статьи с неправильным царством в карточке]]" |
|||
⚫ | |||
res = TaxString(args) .. res |
res = TaxString(args) .. res |
||
end |
end |
||
return |
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 "") .. |
|||
⚫ | |||
⚫ | |||
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 "† " 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