--[[
Кое-какие дополнительные функции для строк
]]
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