[Clipart] New version of keyword-adding script, includes the ability to print usage information.
Alberto Simões
hashashin at gmail.com
Sun Aug 8 08:17:43 PDT 2004
Waiting for it on CVS >:)
On Sat, 07 Aug 2004 18:00:22 -0400, Jonadab the Unsightly One
<jonadab at bright.net> wrote:
>
> I'll check this into CVS when that becomes available again, but for
> now, here is a new version of the keyword-adding script. The key
> improvement is that if you run it with no arguments, it prints up
> some information on how to use it, including examples.
>
> Here it is:
>
> #!/usr/bin/perl
> # -*- cperl -*-
>
> use SVG::Metadata;
> use File::Spec::Functions;
> use Data::Dumper; $|=1;
>
> if (not @ARGV) {
> printusage(); exit 0;
> }
>
> my @file = grep { not /^-/ } @ARGV;
> my %flag = map { s/^-//; (/^-([^=]+)=(.*)/) ? ($1, $2) : ($_, 1) } grep { /^-/ } @ARGV;
> $flag{dir} ||= ".";
>
> process(\%flag, @file); exit 0;
>
> sub process {
> my %flag = %{shift at _};
> warn "[Looking at @_]" if $flag{debug}>1;
> for $f (@_) {
> if (-f $f) {
> processfile(\%flag, $f);
> } elsif ($flag{r} and -d $f) {
> if (opendir DIR, $f) {
> warn "Descending into $f...\n" if $flag{debug};
> my @f = map { catfile($flag{dir}, $f, $_) } grep { not /^[.]+$/ } readdir DIR; closedir DIR;
> my ($k) = $f =~ /(\w+)\s*$/;
> my %f = %flag; $f{keywords} .= ",$k";
> $f{dir} = catfile($flag{dir}, $f);
> if ($f{rlimit}) {
> $f{rlimit}--; $f{r} = 0 unless $f{rlimit};
> }
> warn "Descending with flags: " . Dumper(\%f) if $flag{debug} > 1;
> process(\%f, @f);
> } else {
> warn "Cannot descend into $f: $!\n";
> }
> } elsif (-d $f) {
> warn "Ignoring directory $f (use -r to descend recursively into directories)\n";
> } else {
> warn "Ignoring $f (not a regular file, not a directory)\n";
> }
> }
> }
>
> sub processfile {
> # This version only supports SVG with embedded RDF:
> my %flag = %{shift at _};
> my ($file) = @_;
>
> warn "Processing $file\n" if $flag{debug}>1;
> my $meta = SVG::Metadata->new();
> $meta->parse($file) or warn "Failed to parse existing metadata for $file\n";
> warn "Starting metadata for $file: " . Dumper(\$meta) if $flag{debug}>3;
> for (split /[,]/, $flag{keywords}) { $meta->addKeyword($_) }
>
> open SVG, "<" . $file or die "Cannot read $file: $!\n";
> my $svg; { local $/ = undef; $svg = <SVG> } close SVG;
> my $rdf = $meta->to_rdf();
>
> $svg =~ s|\s*<$_.*?</$_>||gs for 'metadata', 'rdf:RDF', 'rdf'; # Remove old RDF
> $svg =~ s|(?=</svg>)|$rdf|s; # Insert new RDF
>
> open SVG, ">" . $file or die "Cannot write $file: $!\n";
> print SVG $svg; close SVG;
> }
>
> sub printusage {
> print <<"USAGE";
> USAGE:
> $0 [options] files
>
> EXAMPLES:
> $0 --keywords=party,festive,fun confetti-01.svg confetti-02.svg baloons-01.svg
> Adds the keywords 'party', 'festive', and 'fun' to those three SVG images.
> $0 -r *
> Descends recursively from the current directory, adding keywords to all the
> SVG images for each directory it descends through. For example, the image
> in foo/bar/baz.svg will have the keywords 'foo' and 'bar' added.
>
> OPTIONS:
> Any option preceded by a single hyphen is given a value of 1. Any option preceded
> by two hyphens must have an equal sign and a value, as with the keywords option
> in the example. This assigns the value after the equal sign to the option.
>
> SPECIFIC OPTIONS:
> debug Turn on extra debugging output. Higher value mean more info.
> keywords Comma-separated list of whitespace-free keywords to add.
> r Recurse through subdirectories, adding the subdirectory name to
> the list of keywords for everything under that subdirectory.
>
> CAVEATS:
> Early versions of SVG::Metadata do not parse existing keywords. If you use
> this program with one of those versions, existing keywords will be removed
> as a result of this, and only the keywords you add will remain. You need
> at least version 0.15 of SVG::Metadata installed to avoid this.
>
> Additionally, any other metadata not fully supported by SVG::Metadata will
> be lost. Please test on duplicate copies of your files before trusting this
> with your only copy of anything, to ensure that you do not lose any important
> metainformation.
>
> USAGE
> }
> __END__
>
> --
> $;=sub{$/};@;=map{my($a,$b)=($_,$;);$;=sub{$a.$b->()}}
> split//,"ten.thgirb\@badanoj$/ --";$\=$ ;-> ();print$/
>
> _______________________________________________
> clipart mailing list
> clipart at freedesktop.org
> http://freedesktop.org/mailman/listinfo/clipart
>
--
Alberto Simões
More information about the clipart
mailing list