Модуль:String2

{{i}} Документація модуля]
--[[    Деякі додаткові функції для рядків]]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;    as=function(f)-- Перший параметр після початку другого параметра.        return mw.ustring.sub(f.args[1], (mw.ustring.find(f.args[1],f.args[2],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;    join = function (f) -- Об’єднує нумеровані аргументи вихідного шаблону    -- від from або 1 до to або першого відсутнього через перший параметр invoke.    -- Останній елемент можна приєднувати інакше, задавши другий параметр:    -- за замовчанням ',' & 'и'.    -- Якщо 3-й параметр invoke — "s", рядки з пробілів ігноруються. Якщо "_", ігноруються пусті рядки.    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}function M.formatRound(frame) -- Форматує число, щоби воно мало order знаків після коми. return string.format("%0."..frame.args[2].."f",tonumber(frame.args[1])); end-- split splits text at boundaries specified by separator-- and returns the chunk for the index idx (starting at 1)-- #invoke:String2 |split |text |separator |index |true/false-- #invoke:String2 |split |txt=text |sep=separator |idx=index |plain=true/false-- if plain is false/no/0 then separator is treated as a Lua pattern - defaults to plain=trueM.split = function(frame)local args = frame.argsif not(args[1] or args.txt) then args = frame:getParent().args endlocal txt = args[1] or args.txt or ""if txt == "" then return nil endlocal sep = (args[2] or args.sep or ""):gsub('"', '')local idx = tonumber(args[3] or args.idx) or 1local plain = (args[4] or args.plain or "true"):sub(1,1)plain = (plain ~= "f" and plain ~= "n" and plain ~= "0")local splittbl = mw.text.split( txt, sep, plain )if idx < 0 then idx = #splittbl + idx + 1 endreturn splittbl[idx]endreturn M