use strict;
use SL::Auth;
-use YAML ();
use File::Spec;
use SL::MoreCommon qw(uri_encode);
-
-our $yaml_xs;
-BEGIN {
- $yaml_xs = eval { require YAML::XS };
-}
+use SL::YAML;
our %menu_cache;
for my $file (@files) {
my $data;
eval {
- if ($yaml_xs) {
- $data = YAML::XS::LoadFile(File::Spec->catfile($path, $file));
- } else {
- $data = YAML::LoadFile(File::Spec->catfile($path, $file));
- }
+ $data = SL::YAML::LoadFile(File::Spec->catfile($path, $file));
1;
} or do {
die "Error while parsing $file: $@";
for my $node (@$data) {
my $id = $node->{id};
+ die "menu: node with name '$node->{name}' does not have an id" if !$id;
+
my $merge_to = $by_id->{$id};
if (!$merge_to) {
push @{ $by_parent{ $node->{parent} // '' } //= [] }, $node;
}
+ # autovivify order in by_parent, so that numerical sorting for entries without order
+ # preserves their order and position with respect to entries with order.
+ for (values %by_parent) {
+ my $last_order = 0;
+ for my $node (@$_) {
+ if (defined $node->{order} && $node->{order} * 1) {
+ $last_order = $node->{order};
+ } else {
+ $node->{order} = ++$last_order;
+ }
+ }
+ }
+
my $tree = { };
$self->{by_id}{''} = $tree;
my $access = $node->{access};
- while ($access =~ m/^([a-z_\/]+|\||\&|\(|\)|\s+)/) {
+ while ($access =~ m/^([a-z_\/]+|\!|\||\&|\(|\)|\s+)/) {
my $token = $1;
substr($access, 0, length($1)) = "";
}
$cur_ary = $stack[-1];
- } elsif (($token eq "|") || ($token eq "&")) {
+ } elsif (($token eq "|") || ($token eq "&") || ($token eq "!")) {
push @{$cur_ary}, $token;
} else {
}
1;
-