summaryrefslogtreecommitdiff
path: root/lib/gcstar/GCExport/GCExportBase.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gcstar/GCExport/GCExportBase.pm')
-rw-r--r--lib/gcstar/GCExport/GCExportBase.pm362
1 files changed, 362 insertions, 0 deletions
diff --git a/lib/gcstar/GCExport/GCExportBase.pm b/lib/gcstar/GCExport/GCExportBase.pm
new file mode 100644
index 0000000..fb23ec2
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportBase.pm
@@ -0,0 +1,362 @@
+package GCExport::GCExportBase;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCExportImport;
+
+{
+ package GCExport::GCExportBaseClass;
+
+ use base 'GCExportImportBase';
+
+ use File::Basename;
+ use File::Copy;
+ use GCUtils 'glob';
+
+ #Methods to be overriden in specific classes
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSuffix
+ {
+ return '';
+ }
+
+ sub getModels
+ {
+ return [];
+ }
+
+ sub needsUTF8
+ {
+ return 0;
+ }
+
+ sub getOptions
+ {
+ }
+
+ sub wantsDirectorySelection
+ {
+ return 0;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub getHeader
+ {
+ }
+
+ sub getItem
+ {
+ }
+
+ sub getFooter
+ {
+ }
+
+ sub postProcess
+ {
+ }
+
+ sub preProcess
+ {
+ }
+
+ sub getEndInfo
+ {
+ }
+
+ sub wantsOsSeparator
+ {
+ return 1;
+ }
+
+ sub wantsSort
+ {
+ return 0;
+ }
+
+ sub getNewPictureHeight
+ {
+ return 0;
+ }
+
+ #End of methods to be overriden
+
+ sub getUniqueImageFileName
+ {
+ my ($self, $suffix, $dir, $title) = @_;
+
+ return $self->{options}->{parent}->getUniqueImageFileName($suffix, $title, $dir);
+ }
+
+ sub duplicatePicture
+ {
+ my ($self, $orig, $field, $dir, $title, $newHeight) = @_;
+ $self->{saved}->{$field} = $orig;
+ my $newPic = $orig;
+ if ($orig && $self->{options}->{withPictures})
+ {
+ $newPic = GCUtils::getDisplayedImage($orig,
+ $self->{options}->{defaultImage},
+ $self->{original});
+ if ($newPic eq $self->{options}->{defaultImage})
+ {
+ $newPic = $self->{defaultImage};
+ }
+ else
+ {
+ $newPic =~ /.*?(\.[^.]*)$/;
+ my $suffix = $1;
+ my $dest = $self->getUniqueImageFileName($suffix,
+ $dir,
+ $title);
+ my $picHeight = $self->getNewPictureHeight;
+ if ($picHeight)
+ {
+ my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($newPic);
+ my ($width, $height) = ($pixbuf->get_width, $pixbuf->get_height);
+ my $picWidth = $width * ($picHeight / $height);
+ $pixbuf = GCUtils::scaleMaxPixbuf($pixbuf, $picWidth, $picHeight, 1);
+ my $format;
+ if ($suffix =~ /png/i)
+ {
+ $format = 'png';
+ }
+ else
+ {
+ $dest =~ s/\.[^.]*$/\.jpg/;
+ $format = 'jpeg';
+ }
+ $pixbuf->save($dest, $format);
+ }
+ else
+ {
+ copy($newPic, $dest);
+ }
+ $newPic = basename($dir).'/'.basename($dest);
+ }
+ }
+ else
+ {
+ $newPic = basename($dir).'/'.basename($self->{options}->{defaultImage});
+ }
+ $newPic =~ s/\//\\/g if ($^O =~ /win32/i) && $self->wantsOsSeparator;
+ return $newPic;
+ }
+
+ sub restorePicture
+ {
+ my $self = shift;
+ return $self->{saved}->{image};
+ }
+
+ sub restoreInfo
+ {
+ my ($self, $info) = @_;
+
+ foreach (keys %{$self->{saved}})
+ {
+ $info->{$_} = $self->{saved}->{$_};
+ }
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field) = @_;
+ if ($self->{options}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ if ($self->{copyPictures})
+ {
+ $value = $self->duplicatePicture($value, $field,
+ $self->{dirName},
+ $self->{currentItem}->{
+ $self->{model}->{commonFields}->{title}
+ });
+ }
+ return $value;
+ }
+ return $self->{options}->{originalList}->transformValue($value, $field);
+ }
+
+ sub getStockLabel
+ {
+ my ($self, $stock) = @_;
+ my $item = Gtk2::Stock->lookup($stock);
+ my $label = '';
+ ($label = $item->{label}) =~ s/_//
+ if $item;
+ return $label;
+ }
+
+ # If you need really specific processing, you can instead override the process method
+ sub process
+ {
+ my ($self, $options) = @_;
+
+ $self->{saved} = {};
+ $self->{currentItem} = undef;
+
+ $self->{options} = $options;
+
+ $options->{file} .= $self->getSuffix
+ if ($self->getSuffix)
+ && ($options->{file} !~ /\.\w*$/);
+ $self->{fileName} = $options->{file};
+ $self->{original} = $options->{collection};
+ $self->{origDir} = dirname($self->{original});
+ $options->{collectionDir} = $self->{origDir};
+
+ ($self->{dirName} = $self->{fileName}) =~ s/\.[^.]*?$//;
+ $self->{dirName} .= '_images';
+ if ( -e $self->{dirName})
+ {
+ my @images = glob $self->{dirName}.'/*';
+ unlink foreach (@images);
+ rmdir $self->{dirName};
+ unlink $self->{dirName} if ( -e $self->{dirName});
+ }
+ if ($self->{options}->{withPictures})
+ {
+ mkdir $self->{dirName};
+ #Get a copy of default picture
+ copy($self->{options}->{defaultImage},$self->{dirName});
+ $self->{defaultImage} = basename($self->{dirName}).'/'
+ .basename($self->{options}->{defaultImage});
+ }
+
+ if (! $self->preProcess)
+ {
+ return $self->getEndInfo;
+ }
+
+ my @tmpArray = @{$options->{items}};
+ if ($self->wantsSort)
+ {
+ my $sorter = $self->{options}->{sorter};
+ use locale;
+ if ($self->{model}->{fieldsInfo}->{$sorter}->{type} eq 'number')
+ {
+ @tmpArray = sort {
+ my $val1 = $a->{$sorter};
+ my $val2 = $b->{$sorter};
+ return $val1 <=> $val2;
+ } @tmpArray;
+ }
+ elsif ($self->{model}->{fieldsInfo}->{$sorter}->{type} eq 'date')
+ {
+ @tmpArray = sort {
+ my $val1 = GCPreProcess::reverseDate($a->{$sorter});
+ my $val2 = GCPreProcess::reverseDate($b->{$sorter});
+ return $val1 <=> $val2;
+ } @tmpArray;
+ }
+ else
+ {
+ @tmpArray = sort {
+ my $val1 = uc $self->{options}->{originalList}->transformValue($a->{$sorter}, $sorter);
+ my $val2 = uc $self->{options}->{originalList}->transformValue($b->{$sorter}, $sorter);
+ return $val1 cmp $val2;
+ } @tmpArray;
+ }
+ @tmpArray = reverse @tmpArray if $self->{options}->{order} eq 'desc';
+ }
+
+ $self->{sortedArray} = \@tmpArray;
+
+ my $header = $self->getHeader($#tmpArray + 1);
+ my $body = '';
+
+ my $item;
+ my $idx = 0;
+ my $copyPictures = 0;
+ my @copiedPicturesFields;
+ if ($self->{options}->{withPictures})
+ {
+ # If we don't specify fields, the pictures will be copied with transform value
+ # This one is used now
+ $copyPictures = 1
+ if $self->wantsFieldsSelection;
+ # This one will be used by transform value
+ $self->{copyPictures} = !$copyPictures;
+ foreach my $field(@{$self->{options}->{fields}})
+ {
+ push @copiedPicturesFields, $field
+ if $self->{options}->{fieldsInfo}->{$field}->{type} eq 'image';
+ }
+ }
+ foreach $item(@tmpArray)
+ {
+ $self->{currentItem} = $item;
+ if ($copyPictures)
+ {
+ foreach my $pic(@copiedPicturesFields)
+ {
+ $item->{$pic} = $self->duplicatePicture($item->{$pic}, $pic, $self->{dirName},
+ $item->{$self->{model}->{commonFields}->{title}});
+ }
+ }
+ $body .= $self->getItem($item, $idx);
+ $self->restoreInfo($item);
+ $idx++;
+ }
+ $self->{currentItem} = undef;
+ my $footer = $self->getFooter($#tmpArray + 1);
+
+ $self->postProcess(\$header, \$body);
+
+ open EXPORTFILE, ">".$options->{file};
+ binmode( EXPORTFILE, ':utf8') if $self->needsUTF8;
+ print EXPORTFILE "$header";
+ print EXPORTFILE "$body";
+ print EXPORTFILE "$footer";
+ close EXPORTFILE;
+
+ return $self->getEndInfo;
+ }
+}
+
+1;