CopyImages.pl

From Organic Design wiki
Legacy.svg Legacy: This article describes a concept that has been superseded in the course of ongoing development on the Organic Design wiki. Please do not develop this any further or base work on this concept, this is only useful for a historic record of work done. You may find a link to the currently used concept or function in this article, if not you can contact the author to find out what has taken the place of this legacy item.
#!/usr/bin/perl -w
use strict;
use Getopt::Long;
use File::Copy;

# If there is no XML file the script should grab all the images and put them into 
# /tmp/wikiimages

# 0) ------------------------------ Globals ----------------------------------- #

my $tmpPath = "/tmp/"; # Absolute path to tmp dir
my $debug = 0;         # debugging switch
my @xmlImages;           # List of images obtained from 'xmlFile'
my @wantedPaths;       # List of wanted image paths which exist from 'xmlFile'

my %options = (   # Set options using Getopt::Long
  wikiImagePath => "",
  xmlFile       => "",
  tmpDir        => "wikiImages", # Could use wiki/images path too
  rmTmpDir      => 0,
  debug         => 0,
);

# 1) ------------------------------ Get options  ------------------------------ #

GetOptions(
  \%options,
  'wikiImagePath=s',
  'xmlFile=s',
  'tmpDir=s',
  'rmTmpDir',
  'debug',
);

# Append /tmp if missing
($options{'tmpDir'} =~ m/$tmpPath/) or
    ($options{'tmpDir'} = $tmpPath . $options{'tmpDir'});

unless( $options{'wikiImagePath'} ) {
    die("--wikiImagePath relative or absolute path required\n");
}

my $cmd = "find $options{'wikiImagePath'} "  # find files in image path
  . q(| egrep '\..{3,4}$' )                  # 3-4 letter extensions only
  . q(| egrep -v '(thumb|archive)');         # Remove thumb archive directories

if( $options{'rmTmpDir'} ) { 
  print("[ Removing temporary directory $options{'tmpDir'} ]\n");
  system("rm -rf $options{'tmpDir'}\n") and 
      die("Could not delete $options{'tmpDir'}: $!"); 
}

# Create tmp subdirectory
opendir(DIR , $options{'tmpDir'});
my $rv = readdir(DIR);
closedir(DIR);
unless($rv) {
    mkdir $options{'tmpDir'} or die("Could not create directory"); 
}

if ($options{'debug'}) {
  print "== Input arguements ==\n";
  foreach my$values ( keys %options ) {
    print "$values => $options{$values}\n";
  }
}

if( $options{'xmlFile'} eq "") {
  print "[ Copying ALL images to: $options{'tmpDir'} ]\n";
 
  if ($options{'debug'} ) {
    print"== Executing command ==\n";
    print "$cmd\n";
  }
  # Copying images
  system($cmd . q(| while read i; do cp $i ) . $options{'tmpDir'} . q(; done));
  exit;
} else {
  # Saving list of all images
  system($cmd . " > /tmp/allImages"); #  print ($cmd . "> /tmp/allImages\n");
}


# 2) ---------------- Open input XML file and list of images ------------------ #

open(XMLFILE, $options{'xmlFile'}) or die("Could not open file ($options{'xmlFile'}): $!\n");
open(ALLPATHS, "/tmp/allImages") or die("Could not open file /tmp/allImages: $!\n");


# 3) ------------------------------ Grab images ------------------------------- #

{ 
  # Not scalable  
  local $/=undef;
  my $xmlImage = <XMLFILE>;

  # ($xmlImage =~ m/\&lt;nowiki(.+?)\&nowiki\\gt;/) && (print $1);
  if ( $options{'debug'} ) {
    print "== XML nowiki sections ==\n";
    while ($xmlImage =~ m/\&lt;nowiki\&gt;(.+?)&lt;\/nowiki\&gt;/g) {print "$1\n"};
  }
  # Remove content in between <nowiki>'s
  $xmlImage =~ s/\&lt;nowiki\&gt;(.+?)&lt;\/nowiki\&gt;//g;
  # Grab image matches (don't forget |'s and ]]'s in image tags)
  @xmlImages = $xmlImage =~ m/\[{2}Image:(.+?)(?=\||\]{2})/g; 
}

if($options{'debug'}) {
  local $" = "\n";
  print "== \@xmlImages ==\n @xmlImages\n";
}

# Not scalable
my @allImagePaths=<ALLPATHS>;

# 4) ----------------- Test $imageToMatch against $eachImagePath -------------- #

foreach  my $imageToMatch (@xmlImages) {
  chop $imageToMatch;
  # Convert space separated image names to '_'s
  $imageToMatch =~ s/ /_/g;
  # Matching xmlFile images against images in ALLPATHS 
  foreach my $eachImagePath (@allImagePaths) {
    ($eachImagePath =~ m/$imageToMatch/) and (push @wantedPaths, $eachImagePath);
  }
}

if ( $options{'debug'} ) {
  print "==Wanted image paths==\n@wantedPaths";
}

if ( scalar(@wantedPaths) == 0 ) {
  die("[ No images found in XML file $options{'xmlFile'} ]\n");
}

print "[ Copying images found in XML file $options{'xmlFile'} to: $options{'tmpDir'} ]\n";

# 5) --------------------- Copy subset of wanted images ----------------------- #

foreach my $wantedPath ( @wantedPaths ) {
  chomp($wantedPath);
  print "cp $wantedPath $options{'tmpDir'}\n";
    
#  my $fullPath = substr($wantedPath, 1, length $wantedPath); 
#  print "$fullPath\n";    
    
  # Copy files
  copy($wantedPath, $options{'tmpDir'}) or die("Could not copy files to $options{'tmpDir'}: $!\n")
}