Модуль:String2

Материал из Буквицы
Версия от 18:32, 11 декабря 2013; Karaby (обсуждение | вклад) (Новая страница: «--Кое-какие дополнительные функции для строк local M = { bs=function(f)-- первый параметр до н…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Для документации этого модуля может быть создана страница Модуль:String2/doc

--[[
    Кое-какие дополнительные функции для строк
]]
local M = {
    bs=function(f)-- первый параметр до начала второго параметра (или до конца, если он не встретился)
        --необяз. 3-й параметр - с какого по номеру (с 1) символа начинать поиск.
        return mw.ustring.sub(f.args[1], 1, (mw.ustring.find(f.args[1],f.args[2],tonumber(f.args[3] or 1),true) or 0)-1)
    end;
    Tr=function(s,f,t,cf,df,sf)-- транслитерация первого параметра путём замены символов из второго параметра символами из третьего.
    -- Отдельными параметрами можно передавать флаги c, d и s, как в Perl; диапазоны в замене не работают, только в левой части
    -- (т.е. дефис надо передавать первым или последним). Второй результат - число заменённых символов
        local r, l, l2 = {}, mw.ustring.len(f), mw.ustring.len(t);
        for i = 1, l do
            r[mw.ustring.sub(f,i,i)] = i<=l2 and mw.ustring.sub(t,i,i) or df and '' or mw.ustring.sub(t,l2,l2)
        end
        local n2=0;
        local res, n = mw.ustring.gsub(
            s,
            ('[%s%s]%s'):format(
                cf and '^' or '',
                f:gsub('%','%%'):gsub(']','%]'):gsub('^%^','%^'),
                sf and '+' or ''
            ),
            sf and function(cc)
                n2 = n2+mw.ustring.len(cc)-1;
                return mw.ustring.gsub(cc,'.',r)
            end or r
        )
        return res, n+n2
    end;
   -- tr = function(f) return (M.Tr(f.args[1],f.args[2],f.args[3],f.args['c'],f.args['d'],f.args['s'])) end;-- транслитерировать
   -- trс = function(f) return ({M.Tr(f.args[1],f.args[2],f.args[3],f.args['c'],f.args['d'],f.args['s'])})[2] end;-- посчитать символы
    Trg = function(s,t,f,fi)-- Производит замену строк произвольной длины (если с fi, регистр не учитывает).
    -- Приоритет - по порядку в таблицах.
        for n,p in ipairs(t) do
            t[n] = {fi and mw.ustring.upper(p) or p,mw.ustring.len(p)}
        end
        local r,i,l,N = {},1,mw.ustring.len(s),0
        while i<=l do
            (function()
                for n,p in ipairs(t) do
                    if ( fi and mw.ustring.upper(mw.ustring.sub(s,i,i+p[2]-1)) or mw.ustring.sub(s,i,i+p[2]-1) ) == p[1] then
                        table.insert(r,f[n]);
                        i = i+p[2]; N=N+1;
                        return
                    end
                end
                table.insert(r,mw.ustring.sub(s,i,i));
                i=i+1;
                return
            end)()
        end
        return table.concat(r),N
    end;
    trg = function(frame)--Работает с номерными аргументами шаблона,если задан параметр u, иначе со своими.
        --  Заменяет в первом аргументе аргументы 2, 4, 6... на аргументы 3, 5, 7...
        local tf, t, f, i= frame.args['u'] and frame.getParent() or f, {}, {}, 1;
        while tf.args[2*i] do t[tf.args[2*i]]=tf.args[2*i+1] or '' end
        return ( M.Trg(tf.args[1],t,f,(frame.args['i'] or '')~='') )
    end
}

return M