Revision 9fac28d8
Von Sven Schöling vor etwa 12 Jahren hinzugefügt
SL/Controller/Helper/ParseFilter.pm | ||
---|---|---|
|
||
return () unless 'ARRAY' eq ref $flattened;
|
||
|
||
my %sorted = ( @$flattened );
|
||
$flattened = _collapse_indirect_filters($flattened);
|
||
|
||
my @result;
|
||
for (my $i = 0; $i < scalar @$flattened; $i += 2) {
|
||
my ($key, $value) = ($flattened->[$i], $flattened->[$i+1]);
|
||
($key, $value) = _apply_all($key, $value, qr/\b:(\w+)/, { %filters, %{ $params{filters} || {} } });
|
||
($key, $value) = _apply_all($key, $value, qr/\b::(\w+)/, { %methods, %{ $params{methods} || {} } });
|
||
push @result, $key, $value;
|
||
}
|
||
return \@result;
|
||
}
|
||
|
||
sub _collapse_indirect_filters {
|
||
my ($flattened) = @_;
|
||
|
||
die 'flattened filter array length is uneven, should be possible to use as hash' if @$flattened % 2;
|
||
|
||
my (%keys_to_delete, %keys_to_move, @collapsed);
|
||
|
||
# search keys matching /::$/;
|
||
for (my $i = 0; $i < scalar @$flattened; $i += 2) {
|
||
my ($key, $value) = ($flattened->[$i], $flattened->[$i+1]);
|
||
|
||
my @keys = sort { length($b) <=> length($a) } keys %sorted;
|
||
for my $key (@keys) {
|
||
next unless $key =~ /^(.*\b)::$/;
|
||
$sorted{$1 . '::' . delete $sorted{$key} } = delete $sorted{$1} if $sorted{$1} && $sorted{$key};
|
||
|
||
$keys_to_delete{$key}++;
|
||
$keys_to_move{$1} = $1 . '::' . $value;
|
||
}
|
||
|
||
my %result;
|
||
while (my ($key, $value) = each %sorted) {
|
||
($key, $value) = _apply_all($key, $value, qr/\b:(\w+)/, { %filters, %{ $params{filters} || {} } });
|
||
($key, $value) = _apply_all($key, $value, qr/\b::(\w+)/, { %methods, %{ $params{methods} || {} } });
|
||
$result{$key} = $value;
|
||
for (my $i = 0; $i < scalar @$flattened; $i += 2) {
|
||
my ($key, $value) = ($flattened->[$i], $flattened->[$i+1]);
|
||
|
||
if ($keys_to_move{$key}) {
|
||
push @collapsed, $keys_to_move{$key}, $value;
|
||
next;
|
||
}
|
||
if (!$keys_to_delete{$key}) {
|
||
push @collapsed, $key, $value;
|
||
}
|
||
}
|
||
return [ %result ];
|
||
|
||
return \@collapsed;
|
||
}
|
||
|
||
sub _prefix {
|
Auch abrufbar als: Unified diff
ParseFilter: _collapse_indirect_filters ausgelagert und algorithmus auf array umgeschrieben