Ҳуҷҷатгузорӣ
--[[Функции, связанные с таксономией и всем таким прочим, что растёт и ползает]]

local TaxInfo={'parent','latin','name','rang','m','aut','ref'}

local function ParseTT(tt)-- Обрабатывает шаблон таксона без вызова парсера, tt — объект mw.title
    local t,r=tt:getContent(),{}
    for _,v in ipairs(TaxInfo) do r[v] = t:match('|%s*'..v..'%s*=%s*([^|]-)%s*[|}]') end
    return r
end

local function Rang(r)-- ≈ Шаблон:Rang
    return ("|Надцарство|Домен|Царство|Тип|Отдел|Класс|Отряд|Порядок|Семейство|Род|Вид|"):find('|'..r..'|',1,1) and 1
    or string.find([[|Подцарство|Раздел|Подраздел|Надтип|Надотдел|Подтип|Инфратип|Подотдел|
|Надкласс|Подкласс|Инфракласс|Надотряд|Надпорядок|Подотряд|Подпорядок|Инфраотряд|
|Надсемейство|Подсемейство|Надтриба|Триба|Подтриба|
|Подрод|Надсекция|Секция|Подсекция|Ряд|Подряд|Подвид|
|Вариетет|Разновидность|Подразновидность|Форма|Подформа|]],'|'..r..'|',1,1) and ''
    or r~='' and '?' or nil
end

local function taxtable(f)--человеческая версия Шаблон:TaxRecursion и его окружения в Шаблон:Таксо-корт
    local res, tf = {}, f.args['u'] and f:getParent() or f;-- с ключом u рассматривает параметры вызвавшего шаблона
    local a,hir,nolast,topt=tf.args,nil,1,mw.title.new(a['latin'],'Template');
    -- Защиты от зацикливания нет, будет выдавать красную ошибку "время кончилось", но это редко
    if not ( topt and topt.exists ) then
        topt = mw.title.new(a['parent'],'Template')
        if topt and topt.exists then nolast=nil else
            return '<div style="background-color:Gainsboro;font-size:85%;color:Dimgray">СООБЩЕНИЕ ОБ ОШИБКЕ<br />'..
            ( (a['parent'] or a['latin']) and string.format(
[=[Нет [[Шаблон:Таксон/doc#Таксономические шаблоны|таксономического шаблона]] '''{{tl|%s }}''', который должен описывать положение [[таксон]]а ''[[%s]]'' в [[Биологическая классификация#Наименование и описание таксонов|биологической классификации]].]=],
              a['parent'] or a['latin'], a['parent'] or a['latin'])
              or "<br />Параметры '''<big>latin</big>''' и '''<big>parent</big>''' пусты."
            )..( (mw.title.getCurrentTitle().namespace==0) and '</div>[[Category:Википедия:Мақолаҳои биологии бетаксошаблон]]' or '</div>' )
        end
    end-- выбор верхнего таксошаблона topt
    --TaxRecursion + FirstRang
    local parent, q = nolast and a.latin or a.parent
    while parent ~= 'Null' do
        q = ParseTT(topt)
        table.insert(res,1,f:expandTemplate{title='TaxString',args=q})
        parent = q.parent
        if Rang(q.rang)~='' then hir=1 end
        topt = mw.title.new(parent,'Template')
    end
    return ( hir and
        '<div class="NavHead" style="background-color: transparent; border:0"><small>табақаҳои мобайнӣ</small></div>\n'
        or '' ) .. f:expandTemplate{title=nolast and 'LastRang' or 'TaxString', args=a} .. table.concat(res,"\n")
end

return { TaxInfo=TaxInfo, ParseTT=ParseTT, Rang=Rang,
    taxtable=taxtable }