Модуль:String2/пісочниця
![]()
Модуль String2 містить кілька функцій для роботи з рядками, які є менш поширеними ніж ті, що в contains Модуль:String. ФункціїasФункція as повертає частину рядка після вказаного символу (after symbol).
bsФункція bs повертає частину рядка перед вказаного символу (before symbol).
formatRoundФункція formatRound округлює десяткове число до вказаної кількості цифр після коми.
joinФункція join повертає рядок з об'єднаними аргументами вихідного шаблону.
Примітка: Прямий виклик функції через модуль не працюватиме, потрібно, щоб використовувався як виклик через шаблон. Наприклад, якщо шаблон міститиме код вище, то тоді використання шаблону виглядатиме так: Якщо припустимо, що є шаблон str2join, що містить код splitФункція split розділяє текст за межами вказаними роздільником та повертає частину для індексу idx (починається з 1). Вона може використовувати позиційні або іменовані параметри (але вони не повинні змішуватися):
Будь-які подвійні лапки (") у параметрі роздільника видаляються, що дозволяє передавати пробіли й вікітекст ось так Якщо вказано значення Параметр індексу є необов'язковим; стандартним значенням є перша частина тексту. {{string split}} є зручною обгорткою для функції split. startswithФункція startswith подібна до {{#invoke:string|endswith}}. Обидва параметри є обов'язковими, хоча вони можуть бути пустими. Пробіл на початку і в кінці враховується, використовауйте іменовані параметри, щоб цього уникнути, якщо це необхідно. Виводить «yes» для true та пусте значення для false, то може напряму передаватися до #if.
Tr
Trg
trg
ucfirstФункція ucfirst перетворює перший абетковий символ на велику літеру, але не чіпає капіталізацію всього іншого тексту. Це корисно, якщо текст містить власні назви, але вона не упорядковує речення, які, наприклад, містять весь текст великими літерами. Також працює з текстом, що містить вікіпосилання з вертикальними рисками та з html списками.
--[[
Деякі додаткові функції для рядків
]]
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
-- Similar to [[Module:String#endswith]]
function p.startswith(frame)
return (frame.args[1]:sub(1, frame.args[2]:len()) == frame.args[2]) and 'yes' or ''
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=true
M.split = function(frame)
local args = frame.args
if not(args[1] or args.txt) then args = frame:getParent().args end
local txt = args[1] or args.txt or ""
if txt == "" then return nil end
local sep = (args[2] or args.sep or ""):gsub('"', '')
local idx = tonumber(args[3] or args.idx) or 1
local 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 end
return splittbl[idx]
end
return M
|
Portal di Ensiklopedia Dunia