Модуль:String2
Харагдаса
Для документации этого модуля может быть создана страницаМодуль:String2/doc
--[[
Кое-какие дополнительные функции для строк
]]
localM={
bs=function(f)-- первый параметр до начала второго параметра (или до конца, если он не встретился)
--необяз. 3-й параметр - с какого по номеру (с 1) символа начинать поиск.
returnmw.ustring.sub(f.args[1],1,(mw.ustring.find(f.args[1],f.args[2],tonumber(f.args[3]or1),true)or0)-1)
end;
as=function(f)-- первый параметр после начала второго параметра
returnmw.ustring.sub(f.args[1],(mw.ustring.find(f.args[1],f.args[2],1,true)or0)+1)
end;
Tr=function(s,f,t,cf,df,sf)-- транслитерация первого параметра путём замены символов из второго параметра символами из третьего.
-- Отдельными параметрами можно передавать флаги c, d и s, как в Perl; диапазоны в замене не работают, только в левой части
-- (т.е. дефис надо передавать первым или последним). Второй результат - число заменённых символов
localr,l,l2={},mw.ustring.len(f),mw.ustring.len(t);
fori=1,ldo
r[mw.ustring.sub(f,i,i)]=i<=l2andmw.ustring.sub(t,i,i)ordfand''ormw.ustring.sub(t,l2,l2)
end
localn2=0;
localres,n=mw.ustring.gsub(
s,
('[%s%s]%s'):format(
cfand'^'or'',
f:gsub('%','%%'):gsub(']','%]'):gsub('^%^','%^'),
sfand'+'or''
),
sfandfunction(cc)
n2=n2+mw.ustring.len(cc)-1;
returnmw.ustring.gsub(cc,'.',r)
endorr
)
returnres,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, регистр не учитывает).
-- Приоритет - по порядку в таблицах.
forn,pinipairs(t)do
t[n]={fiandmw.ustring.upper(p)orp,mw.ustring.len(p)}
end
localr,i,l,N={},1,mw.ustring.len(s),0
whilei<=ldo
(function()
forn,pinipairs(t)do
if(fiandmw.ustring.upper(mw.ustring.sub(s,i,i+p[2]-1))ormw.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
returntable.concat(r),N
end;
trg=function(frame)--Работает с номерными аргументами шаблона,если задан параметр u, иначе со своими.
-- Заменяет в первом аргументе аргументы 2, 4, 6... на аргументы 3, 5, 7...
localtf,t,f,i=frame.args['u']andframe.getParent()orf,{},{},1;
whiletf.args[2*i]dot[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", строки из пробелов игнорируются; если "_", игнорируются пустые строки
localt,tf,i={},f:getParent(),tonumber(f.args.from)or1
localk,j,m=tonumber(f.args.to),i,f.args[3]
whilekandi<=kortf.args[i]do
if(
({
['_']=function(s)returns~=''end;
['s']=function(s)returnnottostring(s):match("^%s*$")end
})[m]orfunction()returntrueend
)(tf.args[i])then
t[j]=tf.args[i];
j=j+1
end;
i=i+1
end
returnmw.text.listToText(t,f.args[1],f.args[2]orf.args[1])
end
}
functionM.formatRound(frame)--форматирует число, чтобы оно имело order знаков после запятой
returnstring.format("%0."..frame.args[2].."f",tonumber(frame.args[1]));
end
-- если строка s содержит число, увеличивает первое такое число на n, иначе возращает пустую строку.
-- если число начинается на 0, то увеличенное число будет содержать по крайне мере столько цифр сколько исходное.
functionM.increase(s,n)
locala,b,c=string.match(s,"([^0-9]*)([0-9]+)(.*)")
ifb==nilthenreturnsend
localnum=tonumber(b)+n
ifb:sub(1,1)=='0'
thenb=string.format("%0"..b:len().."d",num)
elseb=num
end
returna..b..c
end
functionM.ucfirst(frame)
locals=mw.text.trim(frame.args[1]or"")
locals1=""
-- if it's a list chop off and (store as s1) everything up to the first <li>
locallipos=string.find(s,"<li>")
ifliposthen
s1=string.sub(s,1,lipos+3)
s=string.sub(s,lipos+4)
end
-- s1 is either "" or the first part of the list markup, so we can continue
-- and prepend s1 to the returned string
localletterpos
ifstring.find(s,"^%[%[[^|]+|[^%]]+%]%]")then
-- this is a piped wikilink, so we capitalise the text, not the pipe
local_
_,letterpos=string.find(s,"|%A*%a")-- find the first letter after the pipe
else
letterpos=string.find(s,'%a')
end
ifletterposthen
localfirst=string.sub(s,1,letterpos-1)
localletter=string.sub(s,letterpos,letterpos)
localrest=string.sub(s,letterpos+1)
returns1..first..string.upper(letter)..rest
else
returns1..s
end
end
returnM