#!/usr/bin/perl -w # drakfont Future Overview # - Fonts import : # pfb ( Adobe Type 1 binary ) # pfa ( Adobe Type 1 ASCII ) # ttf ( True-Type ) # pcf.gz # Speedo # and Bitmap (PCF, BDF, and SNF) # - Features # - Install fonts from any directory # - Get windows fonts on any vfat partitions # - UN-installation of any fonts (even if not installed through drakfont) # - Support # - Xfs # - ghostscript & printer # - Staroffice & printer # - abiword # - Koffice, Gnumeric, ... studying # - all fonts supported by printer # ( aliases by RENDER in Xfree86 .... -> later ) # Visual Interface: # Window interface: # - Fontselectiondialog widget # - Command buttons under Fontselectiondialog (like the actual frontend). # Commands buttons: # - import from windows partition. # import from all fat32 partitions and look for winnt/windows/font # and import all (delete doublon) but don't import if already exist. # - import from directory # look for if it exist before for each font and not delete the original. # (replace all, no, none) # expert options: # ask the directory, and look for if it exist before # if it exist ask: (replace all, no, none) # - uninstall with list per font type # Expert additional switch # - option support: ghostscript, Staroffice, etc... # check-button. (by default all check) # - Printer Application Fonts Support... # check-button. (by default all check) use Gtk; use lib qw(/usr/lib/libDrakX); #use interactive; #use standalone; use my_gtk qw(:helpers :wrappers); use common; use strict; use MDK::Common::Globals "network", qw($in $prefix $connect_file $disconnect_file $connect_prog); if ("@ARGV" =~ /--help|-h/) { print q(Font Importation and monitoring application --windows_import : import from all available windows partitions. --xls_fonts : show all fonts that already exist from xls --strong : strong verification of font. --install : accept any font file and any directry. --uninstall : uninstall any font or any directory of font. --replace : replace all font if already exist --application : 0 none application. : 1 all application available supported. : name_of_application" like staroffice for only this one. ); exit(0); } my $xlsfonts; my $windows; my $strong; my $replace; my $application; my $install; my $uninstall; my $mode = -1; my @application; my @install; my @uninstall; foreach (@ARGV) { /--xls_fonts/ and $xlsfonts = 1, $mode=-1; /--windows_import|-wi/ and $windows = 1, $mode=-1; /--strong|-s/ and $strong = 1, $mode=-1; /--replace|-r/ and $replace = 1, $mode=-1; /--application/ and $mode = 0, next; $mode == 0 and push @application, $_; /--install/ and $mode = 1, next; $mode == 1 and push @install, $_; /--uninstall/ and $mode = 2, next; $mode == 2 and push @uninstall, $_; } print "app : @application\n"; print "install : @install\n"; print "uninstall : @uninstall\n"; my $xfs_conffile = '/etc/X11/fs/config'; my $drakfont_dir = '/home/seb/new_drackfont'; my $chkfontpath = '/usr/sbin/chkfontpath'; my $part; my @list_part; my @test; my @font_list; my @installed_fonts; my @installed_fonts_path; my @fontsdir_to_install; my @fontsdir_to_uninstall; my @installed_fonts_full_path; sub list_fontpath { foreach (grep { /\d+:\s/ } `$chkfontpath -l`) { chomp; s/\d+:\s//gi; s/:\w*$//gi; push @installed_fonts_path, $_; } } sub search_installed_fonts { list_fontpath(); push @installed_fonts, all($_) foreach @installed_fonts_path; } sub search_installed_fonts_full_path { list_fontpath(); foreach my $i (@installed_fonts_path) { foreach my $j (all($i)) { push @installed_fonts_full_path, "$i/$j"; } } } sub search_windows_font { foreach my $fstab_line (grep { /ext2/ } cat_('/etc/mtab') ) { my $win_dir = (split('\s', $fstab_line))[1]; my @list_fonts_win = all("$win_dir/windows/fonts"); my @list_fonts_winnt = all("$win_dir/winnt/fonts"); if(!@list_fonts_win && !@list_fonts_winnt) { print "drakfont:: could not find any font in $win_dir/win*/fonts \n"; return 0; } # TODO : handle replace like on the other function # !$replace && grep(/$i/, @installed_fonts) and next; # if (!$replace) { foreach $_ ([\@list_fonts_win, "windows"], [\@list_fonts_winnt, "winnt"]) { # print "totoottoootototo (@{$_[0]}) \n"; foreach my $i (@{$_[0]}) { print "result__________ : $i \n"; !$replace && grep(/$i/, @installed_fonts) and next; grep ( /$i$/, @font_list) or push @font_list, "$win_dir/$_[1]/fonts/$i"; } } # foreach my $i (@list_fonts_win) { # grep ( /$i$/, @font_list) || grep (/$i/, @installed_fonts) or push @font_list, "$win_dir/windows/fonts/$i"; # foreach my $i (@list_fonts_winnt) { # grep ( /$i$/, @font_list) || grep (/$i/, @installed_fonts) or push @font_list, "$win_dir/winnt/fonts/$i"; # } # } else { # foreach ([\@list_fonts_win, "windows"], [\@list_fonts_winnt, "winnt"]) { #TODO : add a foreach to factorize # foreach my $i (@list_fonts_win) { # grep ( /$i$/, @font_list) or push @font_list, "$win_dir/windows/fonts/$i"; # } # foreach my $i (@list_fonts_winnt) { # grep ( /$i$/, @font_list) or push @font_list, "$win_dir/winnt/fonts/$i"; # } # } } 1; } #TODO : replace ($i =~ /.ttf$/i) || ($i =~ /.pfa$/i) || ($i =~ /.pfb$/i) || ($i =~ /.pcf$/i) || ($i =~ /.pcf.gz$/i) by a function sub is_a_font { local $_ = $_[0]; /.ttf$/i || /.pfa$/i || /.pfb$/i || /.pcf$/i || /.pcf.gz$/i; } sub search_dir_font { my ($fn) = @_; my @font_list_tmp = (); my @font_list_tmpp = (); my $dir ; if (!(-e $fn )) { print "$_ :: no such file or directory \n" } else { if ( -d $fn ) { $dir = $fn; foreach my $i (all($fn)) { if (is_a_font($i)) { push @font_list_tmp, "$i"; foreach my $i (@font_list_tmp) { !$replace && grep(/$i/, @installed_fonts) and next; grep /$i/, @font_list or push @font_list, "$fn/$i"; } } } } else { # TODO: add replace handling, and @font_list_tmp filling. if (($fn =~ /.ttf$/i) || ($fn =~ /.pfa$/i) || ($fn =~ /.pfb$/i) || ($fn =~ /.pcf$/i) || ($fn =~ /.pcf.gz$/i)) { !grep /$fn/, (@installed_fonts) and push @font_list, "$fn"; } } print "Fonts in directory ".$dir." : ".$_."\n" foreach (@font_list_tmp); } } sub search_dir_font_uninstall { my @font_list_tmp = (); my $fn = $_; if ( -d $fn ) { foreach my $i (all($fn)) { if (($i =~ /.ttf$/i) || ($i =~ /.pfa$/i) || ($i =~ /.pfb$/i) || ($i =~ /.pcf$/i) || ($i =~ /.pcf.gz$/i)) { push @font_list_tmp, "$i"; } } } else { if (($fn =~ /.ttf$/i) || ($fn =~ /.pfa$/i) || ($fn =~ /.pfb$/i) || ($fn =~ /.pcf$/i) || ($fn =~ /.pcf.gz$/i)) { push @font_list_tmp, "$fn"; } } foreach my $i (@installed_fonts_full_path) { foreach my $j (@font_list_tmp) { if ( $i =~ /$j/) { push @font_list, "$i" ;} } } print "Fonts to uninstal : ".$_."\n" foreach (@font_list); } sub print_list { print "Font(s) to Install :\n\n"; print "$_\n" foreach (@font_list) } sub put_font_dir { # mkdir_p($drakfont_dir); # cp_af(@font_list, $drakfont_dir); # system ("cd $drakfont_dir && type1inst && chkfontpath -a $drakfont_dir"); # xlsfonts | less pour verifier l'installation des polices. } $xlsfonts || $windows || $install[0] || $uninstall[0] ? backend_mod() : interactive_mode(); sub backend_mod { if ($xlsfonts) { system ("xlsfonts"); } if ($windows) { print "........Windows fonts Installation........\n\n"; search_installed_fonts(); if(search_windows_font()) { print_list(); put_font_dir(); } print "\n...............The End...................\n"; } #TODO : test directly @install if ($install[0]) { print ".......Install Specifics Fonts...........\n\n"; search_installed_fonts(); search_dir_font $_ foreach (@install); print ".................................................\n\n"; print "Font to install : ".$_."\n" foreach (@font_list); #put_font_dir(); print "\n...............The End...................\n"; } if ($uninstall[0]) { print "........Uninstall Specifics Fonts........\n\n"; search_installed_fonts_full_path(); search_dir_font_uninstall $_ foreach (@uninstall); print "\n...............The End...................\n"; } } sub interactive_mode { #gtk } # faire la gestion des applications + printer # faire une valeure de retour pour toutes les fonctions