package Video::XawTV; =head1 NAME Video::XawTV - read, create and edit .xawtvrc's. =head1 SYNOPSIS use Video::XawTV; $rc = new Video::XawTV; # - or - $rc = new Video::XawTV "$HOME{ENV}/.xawtv"; $rc->load("otherrcfile"); $rc->save; $rc->save("filename"); $source = $rc->opt('source'); $rc->opt('source') = "Television"; @channels = $rc->channels; $rc->channels(@channels); print $channels[0]{name}; # Arte print $channels[0]{channel}; # E4 =head1 DESCRIPTION Pardon? Ha! Haa! Hahahahahaha!!! =cut $VESRSION = 0.1; use Carp; sub new { my $self = bless {}, shift; $self->load(shift) if @_; $self; } my %std_global = ( norm => 1, capture => 1, source => 1, color => 1, bright => 1, hue => 1, contrast => 1, fullscreen => 1, wm-off-by => 1, freqtab => 1, pixsize => 1, 'jpeg-quality'=> 1, mixer => 1, lauch => 1, ); my %std_channel = ( channel => 1, fine => 1, norm => 1, key => 1, capture => 1, source => 1, color => 1, bright => 1, hue => 1, contrast => 1, ); sub load { my $self = shift; my $fn = shift; local $_; open FN, "<$fn" or croak "unable to open '$fn': $!"; $self->{fn} = $fn; $self->{channels} = []; my $channel = $self->{global} = {}; my $std = \%std_global; while () { if (/^#Video::XawTV=#\s*(\S+)\s*=\s*(.*)\s*$/) { $channel->{lc $1} = $2; } elsif (/^\s*#(.*)$/) { # comments are being reordered, but.. my! $channel->{"#$1"} = 1; } elsif (/^\s*(\S+)\s*=\s*(.*)\s*$/) { $channel->{lc $1} = $2; $std->{lc $1}++; } elsif (/\s*\[(.*)\]\s*$/) { push @{$self->{channels}}, $channel = { name => $1 }; $std = \%std_channel; } elsif (/\S/) { chomp; croak "unparsable statement in '$fn': '$_'"; } } close FN; } sub save_hash { my ($fh, $hash, $std) = @_; while (my ($k,$v) = each %$hash) { next if $k eq 'name'; if ($k =~ /^#/) { print $fh $k, "\n"; } else { print $fh "#Video::XawTV=#" unless $std->{lc $k}; print $fh "$k = $v\n"; } } print $fh "\n"; } sub save { my $self = shift; my $fn = shift || $self->{fn}; open FN,">$fn~" or croak "unable to open '$fn~' for writing: $!"; save_hash(*FN, $self->{global}, \%std_global); for (@{$self->{channels}}) { print FN "[", $_->{name}, "]\n"; save_hash(*FN, $_, \%std_channel); } close FN; rename "$fn~", $fn or croak "unable to replace '$fn': $!"; } sub opt { my $self = shift; my $opt = shift; $self->{global}{$opt} = shift if @_; $self->{global}{$opt}; } sub channels { my $self = shift; if (@_) { $self->{channels} = ref $_[0] eq "ARRAY" ? $_[0] : [@_]; } wantarray ? @{$self->{channels}} : $self->{channels}; } 1;