한국   대만   중국   일본 
Модуль: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


-- если строка s содержит число, увеличивает первое такое число на n, иначе возращает пустую строку.

-- если число начинается на 0, то увеличенное число будет содержать по крайне мере столько цифр сколько исходное.

function
 M
.
increase
(
s
,
 n
)
 
    local
 a
,
b
,
c
 =
 string.match
(
s
,
 "([^0-9]*)([0-9]+)(.*)"
)

    if
 b
==
nil
 then
 return
 s
 end

    local
 num
 =
 tonumber
(
b
)
 +
 n

    if
 b
:
sub
(
1
,
1
)
==
'0'
 
    	then
 b
 =
 string.format
(
"%0"
..
b
:
len
()
..
"d"
,
 num
)

		else
 b
=
num

	end

    return
 a
 ..
 b
 ..
 c

end



function
 M
.
ucfirst
(
frame
 )

	local
 s
 =
  mw
.
text
.
trim
(
 frame
.
args
[
1
]
 or
 ""
 )

	local
 s1
 =
 ""

	-- if it's a list chop off and (store as s1) everything up to the first <li>

	local
 lipos
 =
 string.find
(
s
,
 "<li>"
 )

	if
 lipos
 then

		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

	local
 letterpos

	if
 string.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

	if
 letterpos
 then

		local
 first
 =
 string.sub
(
s
,
 1
,
 letterpos
 -
 1
)

		local
 letter
 =
 string.sub
(
s
,
 letterpos
,
 letterpos
)

		local
 rest
 =
 string.sub
(
s
,
 letterpos
 +
 1
)

		return
 s1
 ..
 first
 ..
 string.upper
(
letter
)
 ..
 rest

	else

		return
 s1
 ..
 s

	end

end


return
 M