Модуль:String2
Documentation for this module may be created at Модуль: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;
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
return M