our
$VERSION
=
'0.01'
;
sub
new {
my
(
$class
) =
@_
;
my
$self
=
bless
{},
$class
;
return
$self
;
}
sub
sort_functions {
my
(
$self
,
$functions
,
$order
) =
@_
;
return
$functions
if
not
$order
;
my
@sorted
;
if
(
$order
eq
'alphabetical'
) {
my
@expected
= ();
my
@unknown
= ();
foreach
my
$function
(
@$functions
) {
if
(
$function
=~ /^([^a-zA-Z0-9]*)(.*)$/ ) {
push
@expected
, [
$function
, $1,
lc
($2) ];
}
else
{
push
@unknown
,
$function
;
}
}
@expected
=
map
{
$_
->[0] }
sort
{
$a
->[2] cmp
$b
->[2]
||
length
(
$a
->[1] ) <=>
length
(
$b
->[1] )
||
$a
->[1] cmp
$b
->[1]
||
$a
->[0] cmp
$b
->[0]
}
@expected
;
@unknown
=
sort
{
lc
(
$a
) cmp
lc
(
$b
) ||
$a
cmp
$b
}
@unknown
;
@sorted
= (
@expected
,
@unknown
);
}
elsif
(
$order
eq
'alphabetical_private_last'
) {
my
@expected
= ();
my
@unknown
= ();
foreach
my
$function
(
@$functions
) {
if
(
$function
=~ /^([^a-zA-Z0-9]*)(.*)$/ ) {
push
@expected
, [
$function
, $1,
lc
($2) ];
}
else
{
push
@unknown
,
$function
;
}
}
@expected
=
map
{
$_
->[0] }
sort
{
length
(
$a
->[1] ) <=>
length
(
$b
->[1] )
||
$a
->[1] cmp
$b
->[1]
||
$a
->[2] cmp
$b
->[2]
||
$a
->[0] cmp
$b
->[0]
}
@expected
;
@unknown
=
sort
{
lc
(
$a
) cmp
lc
(
$b
) ||
$a
cmp
$b
}
@unknown
;
@sorted
= (
@expected
,
@unknown
);
}
return
\
@sorted
;
}
sub
newline {
qr{\cM?\cJ}
};
sub
find {
my
(
$self
,
$text
,
$sort
) =
@_
;
return
()
if
not
$text
;
my
$function_re
=
$self
->function_re;
my
@functions
=
grep
{
defined
$_
}
$text
=~ /
$function_re
/g;
return
@{
$self
->sort_functions( \
@functions
,
$sort
) };
}
1;