한국   대만   중국   일본 
Модуль:String2 ? Википедия Эст?лекк? к?серг?

Модуль : String2

Википедия ? ирекле энциклопедия м??л?м?те

Для документации этого модуля может быть создана страница Модуль: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