# home to all my small misc functions. use strict; use warnings; sub ci_sort { my @sortme2 = sort { lc($a) cmp lc($b) } @_; return @sortme2; } #-------------------------------------------------------------------------------------------------------------- # nf_error #-------------------------------------------------------------------------------------------------------------- sub nf_error { my $msg = shift; print "ERROR: $msg\n"; } #-------------------------------------------------------------------------------------------------------------- # readdir, also removes . and .. from listing which nf needs #-------------------------------------------------------------------------------------------------------------- sub readdir { my $d = shift; my @dl_1 = (); my @dl_2 = (); opendir(DIR, "$d") or nf_error("sub readdir cant open directory $d, $!"); @dl_1 = readdir(DIR); closedir DIR; for(@dl_1) { if($_ eq ".") { next; } push @dl_2, $_; } return @dl_2; } sub br_readdir { my $d = shift; my @dl_1 = (); my @dl_2 = (); opendir(DIR, "$d") or nf_error("sub readdir cant open directory $d, $!"); @dl_1 = CORE::readdir(DIR); closedir DIR; for(@dl_1) { s/^\s+|\s+$//g; if($_ eq "." || $_ eq ".." || $_ eq "") { next; } if($main::proc_dirs && !-d $_) { next; } if($main::ig_type == 0 && $_ !~ /\.($main::file_ext_2_proc)$/i) { next; } push @dl_2, $_; } return @dl_2; } #-------------------------------------------------------------------------------------------------------------- # save_file #-------------------------------------------------------------------------------------------------------------- sub save_file { my $file = shift; my $t = shift; print "file = $file\n"; $t =~ s/^\n//g; # no blank line @ start of file $t =~ s/\n\n+/\n/g; # no blank lines in file open(FILE, ">$file") or die "ERROR: sub save_file, Couldnt open $file to write to. $!"; print FILE $t; close(FILE); } sub file_append { my $file = shift; my $string = shift; open(FILE, ">>$file") or die "ERROR: Couldnt open $file to append to. $!"; print FILE $string; close(FILE); } #-------------------------------------------------------------------------------------------------------------- # read file #-------------------------------------------------------------------------------------------------------------- sub readf { my $file = $_[0]; open(FILE, "$file") or die("ERROR: Couldnt open $file to read.\n"); my @file = ; close(FILE); # clean file of empty lines $file =~ s/^\n//g; $file =~ s/\n\n+/\n/g; return @file; } #-------------------------------------------------------------------------------------------------------------- # read and sort file #-------------------------------------------------------------------------------------------------------------- sub readsf { my $file = $_[0]; open(FILE, "$file") or die("ERROR: Couldnt open $file to read.\n"); my @file = ; close(FILE); # clean file of empty lines $file = join('', sort @file); $file =~ s/^\n//g; $file =~ s/\n\n+/\n/g; @file = split('\n+', $file); return @file; } #-------------------------------------------------------------------------------------------------------------- # read, sort and join file #-------------------------------------------------------------------------------------------------------------- sub readsjf { my $file = $_[0]; open(FILE, "$file") or die("ERROR: Couldnt open $file to read.\n"); my @file = ; close(FILE); $file = join('', sort @file); $file =~ s/^\n//g; $file =~ s/\n\n+/\n/g; return $file; } #-------------------------------------------------------------------------------------------------------------- # read and join file #-------------------------------------------------------------------------------------------------------------- sub readjf { my $file = $_[0]; open(FILE, "$file") or die("ERROR: Couldnt open $file to read.\n"); my @file = ; close(FILE); $file = join('', @file); $file =~ s/^\n//g; $file =~ s/\n\n+/\n/g; return $file; } #-------------------------------------------------------------------------------------------------------------- # multiscroll Y axis #-------------------------------------------------------------------------------------------------------------- sub multiscrolly { my ($sb,$wigs,@args) = @ARG; my $w; foreach $w (@$wigs) { $w->yview(@args); } } #-------------------------------------------------------------------------------------------------------------- # clear options #-------------------------------------------------------------------------------------------------------------- sub clr_no_save { # clear options that are never saved $main::replace = 0; $main::rpwold = ""; $main::rpwnew = ""; $main::front_a = 0; $main::faw = ""; $main::end_a = 0; $main::eaw = ""; $main::id3_art_str = ""; $main::id3_alb_str = ""; $main::id3_com_str = ""; $main::id3_gen_str = "Metal"; $main::id3_year_str = ""; $main::id3_art_set = 0; $main::id3_alb_set = 0; $main::id3_com_set = 0; $main::id3_gen_set = 0; $main::id3_year_set = 0; $main::id3v1_rm = 0; $main::id3v2_rm = 0; } #-------------------------------------------------------------------------------------------------------------- # Escape strings for use in regexp - wrote my own cos uri is fucked. #-------------------------------------------------------------------------------------------------------------- sub escape_string { my $s = shift; $s =~ s/(\~|\`|\!|@|\#|\$|\%|\^|\&|\(|\)|\=|\+|\{|\[|\]|\}|\:|\;|\"|\'|\<|\,|\.|\>|\?)/"\\".$1/eg; # pulled out - return $s; } #-------------------------------------------------------------------------------------------------------------- # namefix print #-------------------------------------------------------------------------------------------------------------- sub nf_print { my $s1 = shift; my $s2 = shift; my $fi = ""; chomp $s1; if(!$s2) { $s2 = ""; } chomp $s2; my $hlist_file = $s1; if(!$main::LISTING && !$main::testmode) { $hlist_file = $s2; } $main::hlist2->add ( $main::hl_counter, -data=>[$hlist_file, $main::hlist_cwd] ); if($s1 =~ /^\s+$/) { $main::hlist2->itemCreate ( $main::hl_counter, 0, -itemtype => "text", -text => " " ); } elsif ( (($main::LISTING || $main::testmode) && -d $s1) || # listing check if s1 is file (!$main::LISTING && -d $s2) # file renamed, check if s2 is file :) ) { $main::hlist2->itemCreate ( $main::hl_counter, 0, -itemtype=>'imagetext', -image=>$main::folderimage ); } elsif ( (($main::LISTING || $main::testmode) && -f $s1) || (!$main::LISTING && -f $s2) ) { $main::hlist2->itemCreate ( $main::hl_counter, 0, -itemtype=>'imagetext', -image=>$main::fileimage ); } else { $main::hlist2->itemCreate ( $main::hl_counter, 0, -itemtype => "text", -text => " " ); } if($main::id3_mode == 1) { my $art = shift; my $tit = shift; my $tra = shift; my $alb = shift; my $com = shift; my $gen = shift; my $year = shift; my $newart = shift; my $newtit = shift; my $newtra = shift; my $newalb = shift; my $newcom = shift; my $newgen = shift; my $newyear = shift; if(!$s2) { $fi = $s1; } else { chomp $s2; $fi = $s2; } $main::hlist2->itemCreate($main::hl_counter, 1, -text => "$s1"); if($art) { $main::hlist2->itemCreate($main::hl_counter, 2, -text => "$art"); } if($tra) { $main::hlist2->itemCreate($main::hl_counter, 3, -text => "$tra"); } if($tit) { $main::hlist2->itemCreate($main::hl_counter, 4, -text => "$tit"); } if($alb) { $main::hlist2->itemCreate($main::hl_counter, 5, -text => "$alb"); } if($gen) { $main::hlist2->itemCreate($main::hl_counter, 6, -text => "$gen"); } if($year) { $main::hlist2->itemCreate($main::hl_counter, 7, -text => "$year"); } if($com) { $main::hlist2->itemCreate($main::hl_counter, 8, -text => "$com"); } if($main::LISTING == 0) { $main::hlist2->itemCreate($main::hl_counter, 9, -text => " -> "); $main::hlist2->itemCreate($main::hl_counter, 10, -text => "$fi"); if($newart) { $main::hlist2->itemCreate($main::hl_counter, 11, -text => "$newart"); } if($newtra) { $main::hlist2->itemCreate($main::hl_counter, 12, -text => "$newtra"); } if($newtit) { $main::hlist2->itemCreate($main::hl_counter, 13, -text => "$newtit"); } if($newalb) { $main::hlist2->itemCreate($main::hl_counter, 14, -text => "$newalb"); } if($newgen) { $main::hlist2->itemCreate($main::hl_counter, 15, -text => "$newgen"); } if($newyear) { $main::hlist2->itemCreate($main::hl_counter, 16, -text => "$newyear"); } if($newcom) { $main::hlist2->itemCreate($main::hl_counter, 17, -text => "$newcom"); } } } else { if(!$s2) { $s2 = $s1; } $main::hlist2->itemCreate($main::hl_counter, 1, -text => "$s1"); if($main::LISTING == 0) { $main::hlist2->itemCreate($main::hl_counter, 2, -text => " -> "); $main::hlist2->itemCreate($main::hl_counter, 3, -text => "$s2"); } } $main::hl_counter++; $main::mw->update(); } #-------------------------------------------------------------------------------------------------------------- # draw_list #-------------------------------------------------------------------------------------------------------------- sub draw_list { my $columns = 4; if($main::id3_mode == 1) { $columns = 18; } if($main::hlist2) { $main::hlist2->destroy; } our $hlist2 = $main::frm_right2 -> Scrolled ( "HList", -scrollbars=>"osoe", -header => 1, -columns=>$columns, -selectbackground => 'Cyan', -browsecmd => sub { # when user clicks on an entry update global variables $main::hlist_selection = shift; ($main::hlist_file, $main::hlist_cwd) = $main::hlist2->info("data", $main::hlist_selection); }, -command=> sub { # user has double clicked &hlist_cd($main::hlist_file, $main::hlist_cwd); } ) ->pack ( -side=>'bottom', -expand=>1, -fill=>'both' ); $main::hlist2->header('create', 0, -text =>' '); # these 2 columns are the same $main::hlist2->header('create', 1, -text =>'Filename'); # for norm & id3 mode if($main::id3_mode == 1) { $main::hlist2->header('create', 2, -text => 'Artist'); $main::hlist2->header('create', 3, -text => 'Track'); $main::hlist2->header('create', 4, -text => 'Title'); $main::hlist2->header('create', 5, -text => 'Album'); $main::hlist2->header('create', 6, -text => 'Genre'); $main::hlist2->header('create', 7, -text => 'Year'); $main::hlist2->header('create', 8, -text => 'Comment'); $main::hlist2->header('create', 9, -text => '#'); $main::hlist2->header('create', 10, -text => 'New Filename'); $main::hlist2->header('create', 11, -text => 'New Artist'); $main::hlist2->header('create', 12, -text => 'New Track'); $main::hlist2->header('create', 13, -text => 'New Title'); $main::hlist2->header('create', 14, -text => 'New Album'); $main::hlist2->header('create', 15, -text => 'New Genre'); $main::hlist2->header('create', 16, -text => 'New Year'); $main::hlist2->header('create', 17, -text => 'New Comment'); } else { $main::hlist2->header('create', 2, -text => '#'); $main::hlist2->header('create', 3, -text => 'New Filename'); } our $rc_menu = $main::hlist2->Menu(-tearoff=>0); $rc_menu -> command ( -label=>"Manual Rename", -underline=> 1, -command=> sub { &manual_edit($main::hlist_file, $main::hlist_cwd); } ); $main::hlist2->bind('', \&show_rc_menu); $main::hlist2->bind('',[\&hide_rc_menu, $rc_menu]); $main::hlist2->bind('',[\&hide_rc_menu, $rc_menu]); &ls_dir; } sub show_rc_menu { my ($x, $y) = $main::mw->pointerxy; my $s = $main::hlist2->nearest($y - $main::hlist2->rooty); $main::hlist2->selectionClear(); $main::hlist2->selectionSet($s); $main::hlist_selection = $s; $main::rc_menu->post($x,$y); } sub hide_rc_menu { my ($l,$m)=@_; $m->unpost(); } sub hlist_cd { my $file = shift; my $wd = shift; my $path = $wd . "/" . "$file"; if(-d $path) { $main::dir = $path; chdir $main::dir or die "couldnt chdir to $main::dir\n"; &ls_dir; return; } # not a valid path, ignore return; } 1;