65
65
our @type_ok = qw(scatter line histogram heatmap highlight tile text connector);
68
my ($conf_leaf,$track_default,$type) = @_;
70
# If the tracks are stored as named blocks, associate the
71
# name with the __id parameter for each track. Otherwise, generate __id
72
# automatically using an index
73
if(ref $conf_leaf eq "HASH") {
74
# Could be one or more named blocks, or a single unnamed block.
75
# If each value is a hash, then assume that we have named blocks
76
my @values = values %$conf_leaf;
77
my $values_hash = grep(ref $_ eq "HASH", @values);
78
if($values_hash == @values) {
68
my ($conf_leaf,$track_default,$type) = @_;
70
# If the tracks are stored as named blocks, associate the
71
# name with the __id parameter for each track. Otherwise, generate __id
72
# automatically using an index
73
if (ref $conf_leaf eq "HASH") {
74
# Could be one or more named blocks, or a single unnamed block.
75
# If each value is a hash, then assume that we have named blocks
76
my @values = values %$conf_leaf;
77
my $values_hash = grep(ref $_ eq "HASH", @values);
78
if ($values_hash == @values) {
79
79
# likely one or more named blocks
80
80
printdebug_group("conf","found multiple named tracks");
81
81
for my $track_name (keys %$conf_leaf) {
82
printdebug_group("conf","adding named track [$track_name]");
83
my $track = $conf_leaf->{$track_name};
84
if ( ref $track eq "ARRAY" ) {
85
fatal_error("track","duplicate_names",$track_name);
87
if(defined $track->{id}) {
88
$track->{__id} = $track->{id};
82
printdebug_group("conf","adding named track [$track_name]");
83
my $track = $conf_leaf->{$track_name};
84
if ( ref $track eq "ARRAY" ) {
85
fatal_error("track","duplicate_names",$track_name);
87
if (defined $track->{id}) {
88
$track->{__id} = $track->{id};
90
$track->{id} = $track->{__id} = $track_name;
90
$track->{id} = $track->{__id} = $track_name;
95
# likely a single unnamed block
96
printdebug_group("conf","found single unnamed track block");
97
push @tracks, $conf_leaf;
95
# likely a single unnamed block
96
printdebug_group("conf","found single unnamed track block");
97
push @tracks, $conf_leaf;
99
} elsif(ref $conf_leaf eq "ARRAY") {
100
# Multiple unnamed/named blocks. A named block will be a
101
# hash with a single key whose value is a hash
102
printdebug_group("conf","found multiple unnamed/named track blocks");
103
for my $track (@$conf_leaf) {
104
if(ref $track eq "HASH" && keys %$track == 1) {
99
} elsif (ref $conf_leaf eq "ARRAY") {
100
# Multiple unnamed/named blocks. A named block will be a
101
# hash with a single key whose value is a hash
102
printdebug_group("conf","found multiple unnamed/named track blocks");
103
for my $track (@$conf_leaf) {
104
if (ref $track eq "HASH" && keys %$track == 1) {
105
105
# this could be a named track, or an unnamed track with
107
107
my ($track_name) = keys %$track;
108
if(ref $track->{$track_name} eq "HASH") {
109
$track = $track->{$track_name};
110
# it's named, because its entry is a hash
111
if(defined $track->{id}) {
112
$track->{__id} = $track->{id};
114
$track->{id} = $track->{__id} = $track_name;
116
printdebug_group("conf","adding named track block [$track_name]");
117
push @tracks, $track;
108
if (ref $track->{$track_name} eq "HASH") {
109
$track = $track->{$track_name};
110
# it's named, because its entry is a hash
111
if (defined $track->{id}) {
112
$track->{__id} = $track->{id};
114
$track->{id} = $track->{__id} = $track_name;
116
printdebug_group("conf","adding named track block [$track_name]");
117
push @tracks, $track;
120
120
printdebug_group("conf","adding unnamed track block");
121
121
push @tracks, $track;
125
125
printdebug_group("conf","adding unnamed track block");
126
126
push @tracks, $track;
130
130
assign_auto_id(@tracks);
131
132
# assign auto type
132
133
for my $t (@tracks) {
133
if(! defined $t->{type}) {
134
$t->{type} ||= seek_parameter("type",$track_default);
135
$t->{type} ||= $type;
136
if(! defined $t->{type}) {
137
fatal_error("track","no_type",join(",",get_track_types()),$t->{id},Dumper($t));
140
if(! defined $t->{file}) {
141
fatal_error("track","no_file",$t->{type},$t->{id},Dumper($t));
134
if (! defined $t->{type}) {
135
$t->{type} ||= seek_parameter("type",$track_default);
136
$t->{type} ||= $type;
137
if (! defined $t->{type}) {
138
fatal_error("track","no_type",join(",",get_track_types()),$t->{id},Dumper($t));
141
$t->{file} ||= seek_parameter("file",$track_default);
142
if (! defined $t->{file}) {
143
fatal_error("track","no_file",$t->{type},$t->{id},Dumper($t));
144
146
assign_defaults(\@tracks,$track_default);
145
clear_undef(\@tracks);
147
#clear_undef(\@tracks);
149
152
sub clear_undef {
151
for my $t (@$tracks) {
152
for my $param (keys %$t) {
154
for my $t (@$tracks) {
155
for my $param (keys %$t) {
153
156
delete $t->{$param} if $t->{$param} eq "undef";
158
161
sub assign_defaults {