X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=icons%2Fimport%2Fimport_theme.pl;h=42f60bb993787c476025f2087cbe4041eda51c2a;hp=e835a76ad045a2b516f64cdbde9d1d81cbbcfba5;hb=HEAD;hpb=799dbc090d9bb9ca4a85711e6253ebda9fef266e diff --git a/icons/import/import_theme.pl b/icons/import/import_theme.pl index e835a76a..42f60bb9 100755 --- a/icons/import/import_theme.pl +++ b/icons/import/import_theme.pl @@ -1,41 +1,59 @@ #!/usr/bin/perl -# This script scans the Quassel source for requested icons and imports the needed -# icons (and only them) from a KDE theme (by default Oxygen). -# This relies on all icons being requested using one of the convenience constructors in -# (K)IconLoader, like this: -# widget->setIcon(SmallIcon("fubar")); -# Additional icons can be specified in whitelist-icons; you can also blacklist icons. +# This script scans the Quassel source for required icons and imports the needed +# icons (and only them) from a full icon theme. +# Additional icons can be specified in whitelisted-icons; you can also blacklist icons. # # NOTE: Unless you are a Quassel developer and need to bump the icons we ship, you shouldn't # need to use this script! -# USAGE: ./import/import_theme.pl $systhemefolder $themename -# Run from the icon/ directory. +# USAGE: ./import/import_theme.pl $srcthemedir $themename +# +# Examples: +# import_theme.pl ~/oxygen-icons oxygen +# import_theme.pl ~/breeze-icons/icons breeze +# import_theme.pl ~/breeze-icons/icons-dark breeze-dark use strict; -use Data::Dumper; +use warnings; + +use File::Basename; use File::Find; +use File::Spec; -my $themefolder = shift; +my $scriptroot = File::Basename::dirname(File::Spec->rel2abs($0)); +my $srcroot = File::Spec->catdir($scriptroot, "..", ".."); +my $srcdir = File::Spec->catdir($srcroot, "src"); -my $source = "../src"; +my $srcthemedir = shift; my $themename = shift; -$themename = $themename ? $themename : "oxygen"; -my $qrcfile_kde = $themename . ".qrc"; -my $whitelistfile = "import/whitelist-icons"; -my $blacklistfile = "import/blacklisted-icons"; -my $extrafile = "import/extra-icons.qrc." . $themename; +# Sanity checks +die "Theme directory must be given\n" unless length $srcthemedir; +die "Theme directory \"$srcthemedir\" not found\n" unless -e $srcthemedir and -d $srcthemedir; +die "Theme name must not be empty\n" unless length $themename; + +my $destbasedir = File::Spec->catdir($srcroot, "3rdparty", "icons"); +my $destthemedir = File::Spec->catdir($destbasedir, $themename); + +my $whitelistfile = "$scriptroot/whitelisted-icons"; +my $blacklistfile = "$scriptroot/blacklisted-icons"; my %req_icons; my %found_icons; -my %blacklist; -my %themeblacklist; my %whitelist; -my $extrafilecontent; +my %blacklist; + +# Add whitelisted icons +open WHITELIST, "<$whitelistfile" or die "Could not open $whitelistfile\n"; +while() { + s/#.*//; + next unless my ($name) = /([-\w]+)\s*/; + $req_icons{$name} = 1; +} +close WHITELIST; -# First, load the icon blacklist +# Load the icon blacklist open BLACKLIST, "<$blacklistfile" or die "Could not open $blacklistfile\n"; while() { s/#.*//; @@ -44,81 +62,46 @@ while() { } close BLACKLIST; -my $hasthemeblacklist = 1; -open BLACKLIST, "<$blacklistfile.$themename" or $hasthemeblacklist = 0; -if ($hasthemeblacklist) { - while() { - s/#.*//; - next unless my ($name) = /([-\w]+)\s*/; - $blacklist{$name} = 1; - $themeblacklist{$name} = 1; - } - close BLACKLIST; -} else { - print "Info: No theme specific blacklist found...\n"; -} - -# We now grep the source for things like SmallIcon("fubar") and generate size and name from that -print "Grepping $source for requested icons...\n"; -my @results = `grep -r QIcon::fromTheme\\(\\" $source`; +# We now grep the source for icon::get() to find required icons +print "Grepping $srcdir for required icons...\n"; +my @results = `grep -r icon::get $srcdir`; foreach(@results) { - next unless my ($name) = /\W+QIcon::fromTheme\(\"([-\w]+)/; - $req_icons{$name} = 1 - unless exists $blacklist{$name}; -} - -# Add whitelist icons -open WHITELIST, "<$whitelistfile" or die "Could not open $whitelistfile\n"; -while() { - s/#.*//; - next unless my ($name) = /([-\w]+)\s*/; - $req_icons{$name} = 1 - unless exists $themeblacklist{$name}; -} -close WHITELIST; - -# Read in extra-icons -my $hasthemeextrafile = 1; -local $/; -open EXTRAFILE, "<$extrafile" or $hasthemeextrafile = 0; -if($hasthemeextrafile) { - binmode EXTRAFILE; - $extrafilecontent = ; - close EXTRAFILE; -} else { - $extrafilecontent = ""; + next unless my (@names) = /\W+icon::get\((?:\"([-\w]+)\")|(?:\{\s*\"([-\w]+)\"(?:,\s*\"([-\w]+)\")*\s*\})/; + foreach(@names) { + $req_icons{$_} = 1 unless not defined or exists $blacklist{$_}; + } } # Clean old output dir -print "Removing old $themename...\n"; -system("rm -rf $themename"); +print "Removing old $destthemedir...\n"; +system("rm -rf $destthemedir"); # Now copy the icons my %scalables; -print "Copying icons from $themefolder...\n"; -opendir (BASEDIR, "$themefolder") or die "Could not open theme basedir\n"; +print "Copying icons from $srcthemedir...\n"; +opendir (BASEDIR, "$srcthemedir") or die "Could not open theme basedir\n"; my $scalableFound = 0; foreach my $parent (readdir BASEDIR) { - next unless (-d "$themefolder/$parent"); + next unless (-d "$srcthemedir/$parent"); $scalableFound = $scalableFound ? 1 : $parent eq 'scalable'; next if $parent eq '.' or $parent eq '..' or $parent eq 'scalable' or $parent =~ /\..*/; my $ischildcat = $parent =~ /\d+x\d+/ ? 1 : 0; - opendir (SIZEDIR, "$themefolder/$parent") or die "Could not open dir $parent\n"; + opendir (SIZEDIR, "$srcthemedir/$parent") or die "Could not open dir $parent\n"; foreach my $child (readdir SIZEDIR) { next if $child eq '.' or $child eq '..'; my $cat = $ischildcat ? $child : $parent; - opendir (CATDIR, "$themefolder/$parent/$child") or die "Could not open category dir\n"; + opendir (CATDIR, "$srcthemedir/$parent/$child") or die "Could not open category dir\n"; foreach my $icon (readdir CATDIR) { my $iconname = $icon; $iconname =~ s/\.png$//; $iconname =~ s/\.svg$//; next unless exists $req_icons{$iconname}; $scalables{$cat}{$iconname} = 1; - system "mkdir -p $themename/$parent/$child" and die "Could not create category dir\n"; - system "cp -aL $themefolder/$parent/$child/$icon $themename/$parent/$child" + system "mkdir -p $destthemedir/$parent/$child" and die "Could not create category dir\n"; + system "cp -aL $srcthemedir/$parent/$child/$icon $destthemedir/$parent/$child" and die "Error while copying file $parent/$child/$icon\n"; - #print "Copy: $themefolder/$parent/$child/$icon\n"; + print "Copy: $srcthemedir/$parent/$child/$icon\n"; $found_icons{$iconname} = 1; } closedir CATDIR; @@ -130,9 +113,9 @@ closedir BASEDIR; # Copy scalables if ($scalableFound) { foreach my $cat (keys %scalables) { - system "mkdir -p $themename/scalable/$cat" and die "Could not create category dir\n"; - foreach my $scalable (keys $scalables{$cat}) { - system "cp -aL $themefolder/scalable/$cat/$scalable.svgz $themename/scalable/$cat/$scalable.svgz"; + system "mkdir -p $destthemedir/scalable/$cat" and die "Could not create category dir\n"; + foreach my $scalable (keys %{$scalables{$cat}}) { + system "cp -aL $srcthemedir/scalable/$cat/$scalable.svgz $destthemedir/scalable/$cat/$scalable.svgz"; } } } @@ -144,38 +127,33 @@ foreach my $icon (keys %req_icons) { } # Copy license etc. -system "cp $themefolder/AUTHORS $themefolder/CONTRIBUTING $themefolder/COPYING $themefolder/index.theme $themename/"; +system "cp -aL $srcthemedir/AUTHORS* $srcthemedir/CONTRIBUTING* $srcthemedir/COPYING* $srcthemedir/index.theme $destthemedir/ | true"; # Generate .qrc -my @file_list; -generate_qrc($themename, $qrcfile_kde, $extrafilecontent); +#my $qrcfile = $themename."_icon_theme.qrc"; +#$qrcfile =~ s/-/_/g; +my $qrcfile = File::Spec->catdir($destbasedir, ($themename."_icon_theme.qrc") =~ s/-/_/gr); +print "Generating $qrcfile...\n"; -print "Done.\n"; - -######################################################################################## -sub generate_qrc { - my $dir = shift; - my $qrcfile = shift; - - @file_list = (); - find(\&push_icon_path, $dir); - @file_list = sort(@file_list ); - my $files = join "\n", @file_list; - - my $qrc = "\n" - ." \n" - ."$files\n" - ."$extrafilecontent\n" - ." \n" - ."\n"; - - open QRC, ">$qrcfile" or die "Could not open $qrcfile for writing!\n"; - print QRC $qrc; - close QRC; -} +my @file_list = (); sub push_icon_path { return unless /\.png$/ or /\.svg$/ or /^index.theme$/; - - push @file_list, " $File::Find::name"; + push @file_list, " ".$File::Find::name =~ s|^$destbasedir/||gr.""; } + +find(\&push_icon_path, $destthemedir); +@file_list = sort(@file_list); +my $files = join "\n", @file_list; + +my $qrc = "\n" + ." \n" + ."$files\n" + ." \n" + ."\n"; + +open QRC, ">$qrcfile" or die "Could not open $qrcfile for writing!\n"; +print QRC $qrc; +close QRC; + +print "Done.\n";