Модуль:Transclude — различия между версиями

Материал из Вики Аккордов
Перейти к: навигация, поиск
(Новая страница: «local M={} --------------------------------------------------------- -- Функции для работы с параметрами вызвавшего шабл…»)
 
 
Строка 1: Строка 1:
−
local M={}
+
{{module rating|p}}
−
---------------------------------------------------------
+
== Функции ==
−
-- Функции для работы с параметрами вызвавшего шаблона --
+
−
---------------------------------------------------------
+
−
function M.uni(f)-- Унификация имён параметров; псевдонимы.
+
−
    local tf, cs=f:getParent(), {};
+
−
    local findcs=function(a) cs[a]=f.args[a] end;
+
−
    (f.args['|фиксрег'] or f.args['|fixreg'] or ''):gmatch(' *([^%n]+) *', findcs);
+
−
    -- {{!}}фиксрег = список разделённых новыми строками аргументов, регистр которых не менять
+
−
    local args,am={};
+
−
    for a,v in pairs(tf.args) do
+
−
        am = a:lower():gsub('[_ ]+',' ');
+
−
        args[ cs[a] and a  or  ( f.args[am] or am ) ] = v
+
−
    end
+
−
    return tf:expandTemplate{title=f.args[1]; args=args}
+
−
end
+
  
−
M['forall'] = function(f)-- Итератор по аргументам вызывающего шаблона.
+
=== uni ===
−
    -- f.args[1] — имя вызываемого шаблона.
+
{{#invoke:Transclude|uni|''имя шаблона''|''список параметров''…}}
−
    local tf,ac,res,tln,sep,gl=f:getParent(),{},{},f.args[1]:match('^%s*([^#]-)%s*#(.*)$'),tonumber(f.args[2]) or 1;
+
−
    if not tln then tln,sep=f.args[1]:match('^%s*(.-)%s*$'),'' end
+
−
    for p,k in pairs(f.args) do if type(p)=='string' then ac[p]=k end end
+
−
    local ans,i,ablk={},1;
+
−
    while tf.args[i] do
+
−
        if gl==1 then
+
−
            ans[i] = tf:expandTemplate{ title=tln; args={tf.args[i], unpack(ac)} }
+
−
        else
+
−
            ablk={}; for j = 0, gl-1 do ablk[j] = tf.args[i*gl+j] end;
+
−
            for k,v in pairs(ac) do ablk[k]=v end;
+
−
            ans[i] = tf:expandTemplate{ title=tln; args=ablk }
+
−
        end
+
−
        i = i+1
+
−
    end
+
−
    return table.concat(ans,sep)
+
−
end
+
  
−
function M.escapeparams(f)-- Нормализация
+
Унифицирует обращение к шаблону, преобразует все имена параметров к нижнему регистру и позволяет задавать удобные псевдонимы (вводить параметрами в нижнем регистре).
−
-- (обезопасивание) значений параметров.
+
−
    local i,ac,acn=0,{},{};
+
−
    local function repl(s)
+
−
        return s:gsub('{{','{{Х'):gsub('}}',"{{ЪЪ}}"):gsub('{{Х','{{ХХ}}')--: --замена фигурных скобок
+
−
          :gsub('=','{{=}}'):gsub('|','{{!}}')
+
−
    end
+
−
    for k,v in pairs(f:getParent().args) do
+
−
        if type(k)=='number' then ac[k]=repl(v); i=i+1
+
−
        else acn[repl(k)]=repl(v)end
+
−
    end
+
−
    if i ~= #ac-1 then --нумерованные параметры не сплошные
+
−
        for k,v in pairs(ac) do
+
−
            if k>i then acn[tostring(k)] = v; ac[k]=nil end-- удалять в pairs можно
+
−
        end
+
−
    end
+
−
    for k,v in pairs(acn) do
+
−
        table.insert(ac, table.concat(f.args[2] or "\n ", k, f.args[3] or ' = ', v, f.args[4] or '') )
+
−
    end
+
−
    return table.concat(ac,'|')
+
−
end
+
  
−
function M.npc(f)-- Итератор по именованно-нумерованным параметрам.
+
=== forall ===
−
    local tf, ac, ns = f:getParent(), {}, {};
+
{{#invoke:Transclude|forall|''имя шаблона''}}
−
    for k,v in pairs(tf.args) do
+
−
        local b,n = string.match(k,"^(.-)%s*(%d*)$");
+
−
        n = tonumber(n);
+
−
        if n then
+
−
            if f.args[b] then
+
−
                if not ac[n] then
+
−
                    ac[n] = mw.clone(f.args)
+
−
                    setmetatable( ac[n], nil ) -- metatable ломает expandTemplate
+
−
                    table.insert(ns,n)
+
−
                end
+
−
                ac[n][b] = v
+
−
            end--if f.args[b]
+
−
        end--if n
+
−
    end--for
+
−
    table.sort(ns);
+
−
    local tmod = #f.args-1
+
−
    for n,i in ipairs(ns) do
+
−
        ns[n]=tf:expandTemplate{ title=f.args[n % tmod+1]; args=ac[i] }
+
−
    end
+
−
    return table.concat(ns)
+
−
end
+
  
−
function M.call(f)-- Просто вызывает шаблон с аргументами вызывающего.
+
Применяет шаблон<!--, переданный первым параметром invoke, нихрена не понял, что Ignatus имел в виду --Incnis Mrsi -->
−
    return f:getParent():expandTemplate{ title=f.args[1]; args=f:getParent().args }
+
ко всем аргументам вызывающего шаблона или их группам, можно задавать доп. опции.
−
end
+
  
−
function M.join(f)-- Версия forall с разделителем вместо шаблона.
+
Если после имени шаблона поставить «#», следующая часть параметра будет разделителем, по умолчанию ничего.
−
    -- f.args[1] — разделитель.
+
−
    local t, tf, i = {}, f:getParent(), tonumber(f.args.from) or 1
+
−
    local k,j,m = tonumber(f.args.to),i,f.args[3]
+
−
    while k and i<=k or tf.args[i] do
+
−
    if (
+
−
    ({
+
−
    ['_']=function(s)return s~=''end;
+
−
    ['s']=function(s)return not tostring(s):match("^%s*$")end
+
−
    })[m] or function() return true end
+
−
    )(tf.args[i]) then
+
−
    t[j]=tf.args[i];
+
−
    j=j+1
+
−
    end;
+
−
    i=i+1
+
−
    end
+
−
    return mw.text.listToText(t,f.args[1],f.args[2] or f.args[1])
+
−
end
+
−
-------------------------------------------------------
+
−
-- Функции для работы с параметрами шаблона в invoke --
+
−
-------------------------------------------------------
+
−
--[[
+
−
function M.split(f)-- Разрезает строку f.args[3]
+
−
-- указанным в f.args[2](?) разделителем
+
−
    -- и передаёт куски шаблону f.args[1].
+
−
    local tf, ac, oldi, i, e =f:getParent(), {}, 1, f.args[3]:find(f.args[1],1,true)
+
−
    -- «f.args[1]» в строке выше — точно не ошибка? --Incnis Mrsi
+
−
    while i do
+
−
        table.insert( ac,  f.args[3]:sub(oldi, i-1) ); oldi=e+1
+
−
    end
+
−
    table.insert( ac, f.args[3]:sub(oldi, #f.args[3]-1) )
+
−
    return f:getParent():expandTemplate{ title=f.args[1]; args=ac }
+
−
end
+
−
]]
+
  
−
function M.cycle(f)-- Действует аналогично forall по числовой переменной,
+
=== escapeparams ===
−
    -- изменяющейся (по умолчанию, от 1) до f.args[2].
+
&#123;{#invoke:Transclude|escapeparams|(зарезервировано автором?)
−
    local tf,ac=f:getParent(),{};
+
|''разделитель пар''|''альтернатива знаку равенства''
−
    for p,k in pairs(f.args) do
+
|''суффикс''}}
−
        if type(p)=='number' then
+
 
−
            if p>2 then ac[p-1]=k end
+
Возвращает параметры (вызывающего шаблона? --[[user:Incnis Mrsi|Incnis Mrsi]]) через «|» с заменой «=» на «{{tl|1==}}» и «|» на «{{tl|!}}». Параметры предусмотрены, но необязательны.
−
        else ac[p]=k
+
 
−
        end
+
Предполагается когда-то снабдить интеллектом для незамены палочек в вики-ссылках и сортировки.
−
    end
+
 
−
    local s,fh = f.args[2]:match('^%s*(%-?%d+)%s*%.%.') or 1,
+
<small>Назначение параметров f.args[2], f.args[3] и f.args[4] угадано участником Incnis Mrsi и может не соответствовать замыслу автора, исходная документация на них отсутствовала.</small>
−
        f.args[2]:match('%.%.%s*(%S.*)%s*$') or f.args[2] or '';
+
 
−
    fh=tonumber(fh) or fh:match('^%s*(.-)%s*$');
+
=== npc ===
−
    local acr={};
+
&#123;{#invoke:Transclude|npc|''имя шаблона 1''[|''имя шаблона 2''…]
−
    if not tonumber(s) then error('Начало цикла «'..s..'» — не число') end
+
|''базовое имя''[=''значение'']|…}}
−
    local function dc()
+
 
−
            local r=tf:expandTemplate{ title=f.args[1]; args={s,unpack(ac)} }
+
<small>Абзац сильно переписан, т.к. авторский текст был тотально невразумителен. --Incnis Mrsi</small>
−
            s=s+1;
+
: [[Итератор]] по массиву из групп параметров типа «параметр{{mvar|k}}=…» (где номер {{mvar|k}} группы — десятичное число) вызываемого шаблона. Группы подставляются в список из одного или более указанных шаблонов, заданных в виде нумерованных параметров. Одна группа в один из шаблонов, которые применяются по круговой очереди с возрастанием {{mvar|k}}. Вывод шаблонов [[конкатенация|соединяется]] в том же порядке. Пример использования с двумя шаблонами: полосатые строки в таблицах.  
−
            if r~='' then table.insert(acr,r); return r end
+
 
−
    end
+
Именованные параметры представляют базовые имена вызывающего шаблона (автор хотел сказать, его параметров? --Incnis Mrsi), которые будут также именами параметров для вызываемых шаблонов. Их значения (необязательные) будут использоваться по умолчанию, если для какого-то {{mvar|k}} есть некоторые, но не все значения. <small>По-видимому автор намекает на то, что когда для какого-то {{mvar|k}} нет значений никаких, на нём процесс и останавливается. --Incnis Mrsi</small>
−
    if type(fh)=='number' then
+
 
−
        while s<fh do dc() end
+
Параметры сортируются <u>при выводе</u> по числам (начиная с ничего, потом ноль).{{непонятно}}<small> видимо, отсылка к оператору table.sort(ns); но смысл ускользает. --Incnis Mrsi</small>
−
    elseif fh~='' then
+
 
−
        while tf:expandTemplate{ title=fh; args={s,unpack(ac)} } do dc() end
+
=== call ===
−
    else
+
&#123;{#invoke:Transclude|call|''имя шаблона''}}
−
        while dc() do end
+
 
−
    end
+
Просто вызывает указанный шаблон с аргументами вызывающего.
−
    return table.concat(acr)
+
 
−
end
+
=== join ===
−
--[[Функция не пашет как можно ждать — пробелы отсекаются после передачи параметров в expandTemplate
+
&#123;{#invoke:Transclude|join|''разделитель''|''терминальный разделитель''
−
function M.pass(f)-- Передаёт шаблону параметры без подрезки.
+
|''игнор''|[from=''номер''|][to=''номер''|]''список параметров''…}}
−
    local ac,i={},1;
+
 
−
    while f.args[2*i] do ac[ tonumber(f.args[2*i]) or f.args[2*i] ] = f.args[2*i+1]; i=i+1 end;
+
Версия [[#forall]] без шаблона, объединяет нумерованные аргументы от <tt>from</tt> или 1 до <tt>to</tt> или первого отсутствующего через указанный ''разделитель''.
−
    return  f:getParent():expandTemplate{ title=f.args[1]; args=ac }
+
 
−
end
+
Последний элемент можно присоединять иначе, задав ''терминальный разделитель'' (необязательный; по умолчанию «,» или «и»).
−
]]
+
 
−
return M
+
Если значение параметра ''игнор'' равно «s», то строки из пробелов игнорируются; если оно равно «_», то игнорируются пустые строки.
 +
 
 +
<!-- === split ===
 +
&#123;{#invoke:Transclude|split|''имя шаблона''|''разделитель''|''строка параметров''}}
 +
 
 +
Разрезает строку указанным разделителем и передаёт куски шаблону.
 +
 
 +
Примечание: по состоянию на 15 мая не удалось сделать демонстрацию работы данной функции. Есть предположение, что в коде (см. комментарии) имеется ошибка.
 +
 
 +
{{#invoke:Transclude|split|code| |за code сада}}
 +
{{#invoke:Transclude|split|code| |засада}}
 +
{{#invoke:Transclude|split|code|-|за-сада}}
 +
-->
 +
=== cycle ===
 +
&#123;{#invoke:Transclude|cycle|''имя шаблона''|{{mvar|n}}|''список параметров''…}}
 +
 
 +
Действует аналогично [[#forall]] по числовой переменной,  изменяющейся от 1 до {{mvar|n}}. Другое начало можно задать в виде «-10..10» вместо {{mvar|n}}. Также можно задать предел цикла в виде имени шаблона (если второго параметра нет или он имеет вид «1..»,  шаблон раскрывается, пока не пуст). Не увлекитесь!
 +
 
 +
Замечание: номера нумерованных параметров шаблона при записи увеличить на 1.
 +
<!--Не работает
 +
=== pass ===
 +
&#123;{#invoke:Transclude|pass|''имя шаблона''|''имя параметра''|''значение''…}}
 +
 
 +
Передаёт шаблону параметры без подрезки.
 +
-->
 +
== Примеры использования ==
 +
* [[Шаблон: Карточка/Temp]] (для &#123;{#invoke:Transclude|npc}})
 +
 
 +
 
 +
<noinclude>
 +
[[Категория:Модули:Документация]]</noinclude>

Текущая версия на 17:44, 27 октября 2017

{{#invoke:Error|error|Этот шаблон должен использоваться в пространстве модулей.|tag=}}

Функции[править]

uni[править]

{{#invoke:Transclude|uni|имя шаблона|список параметров…}}

Унифицирует обращение к шаблону, преобразует все имена параметров к нижнему регистру и позволяет задавать удобные псевдонимы (вводить параметрами в нижнем регистре).

forall[править]

{{#invoke:Transclude|forall|имя шаблона}}

Применяет шаблон ко всем аргументам вызывающего шаблона или их группам, можно задавать доп. опции.

Если после имени шаблона поставить «#», следующая часть параметра будет разделителем, по умолчанию ничего.

escapeparams[править]

{{#invoke:Transclude|escapeparams|(зарезервировано автором?)
|разделитель пар|альтернатива знаку равенства
|суффикс}}

Возвращает параметры (вызывающего шаблона? --Incnis Mrsi) через «|» с заменой «=» на «{{=}}» и «|» на «{{!}}». Параметры предусмотрены, но необязательны.

Предполагается когда-то снабдить интеллектом для незамены палочек в вики-ссылках и сортировки.

Назначение параметров f.args[2], f.args[3] и f.args[4] угадано участником Incnis Mrsi и может не соответствовать замыслу автора, исходная документация на них отсутствовала.

npc[править]

{{#invoke:Transclude|npc|имя шаблона 1[|имя шаблона 2…]
|базовое имя[=значение]|…}}

Абзац сильно переписан, т.к. авторский текст был тотально невразумителен. --Incnis Mrsi

Итератор по массиву из групп параметров типа «параметрШаблон:Mvar=…» (где номер Шаблон:Mvar группы — десятичное число) вызываемого шаблона. Группы подставляются в список из одного или более указанных шаблонов, заданных в виде нумерованных параметров. Одна группа в один из шаблонов, которые применяются по круговой очереди с возрастанием Шаблон:Mvar. Вывод шаблонов соединяется в том же порядке. Пример использования с двумя шаблонами: полосатые строки в таблицах.

Именованные параметры представляют базовые имена вызывающего шаблона (автор хотел сказать, его параметров? --Incnis Mrsi), которые будут также именами параметров для вызываемых шаблонов. Их значения (необязательные) будут использоваться по умолчанию, если для какого-то Шаблон:Mvar есть некоторые, но не все значения. По-видимому автор намекает на то, что когда для какого-то Шаблон:Mvar нет значений никаких, на нём процесс и останавливается. --Incnis Mrsi

Параметры сортируются при выводе по числам (начиная с ничего, потом ноль).Шаблон:Непонятно видимо, отсылка к оператору table.sort(ns); но смысл ускользает. --Incnis Mrsi

call[править]

{{#invoke:Transclude|call|имя шаблона}}

Просто вызывает указанный шаблон с аргументами вызывающего.

join[править]

{{#invoke:Transclude|join|разделитель|терминальный разделитель
|игнор|[from=номер|][to=номер|]список параметров…}}

Версия #forall без шаблона, объединяет нумерованные аргументы от from или 1 до to или первого отсутствующего через указанный разделитель.

Последний элемент можно присоединять иначе, задав терминальный разделитель (необязательный; по умолчанию «,» или «и»).

Если значение параметра игнор равно «s», то строки из пробелов игнорируются; если оно равно «_», то игнорируются пустые строки.

cycle[править]

{{#invoke:Transclude|cycle|имя шаблона|Шаблон:Mvar|список параметров…}}

Действует аналогично #forall по числовой переменной, изменяющейся от 1 до Шаблон:Mvar. Другое начало можно задать в виде «-10..10» вместо Шаблон:Mvar. Также можно задать предел цикла в виде имени шаблона (если второго параметра нет или он имеет вид «1..», шаблон раскрывается, пока не пуст). Не увлекитесь!

Замечание: номера нумерованных параметров шаблона при записи увеличить на 1.

Примеры использования[править]