Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

pudge (1)

pudge
  (email not shown publicly)
http://pudge.net/
AOL IM: Crimethnk (Add Buddy, Send Message)

I run this joint, see?

Journal of pudge (1)

Tuesday May 29, 2007
06:16 PM

Yojimbo Script for Setlist

[ #33368 ]

So I saw some Yojimbo scripts over at DF and I remembered I have a Yojimbo script I use quite a bit, to create a setlist in which I keep song lyrics and chords and so on.

The setup required is to change the $htmlfile variable for your location of the created setlist; create a "Music: Setlist" group in Yojimbo (which contains note items with titles for song names, tags for artist names, and the contents in the note [with an optional __BR__ text to force a column break, such as you can see in several of the songs).

And of course, you need Mac::Glue installed, and glues for Safari and Yojimbo created.

And you need a stylesheet, which you can get from the source in the finished file.

#!/usr/bin/perl
use warnings;
use strict;
 
use File::Spec::Functions;
use Mac::Glue;
use URI::file;
 
our($header, $mid, $footer);
init();
 
my(%setlist);
my $artists = $setlist{ARTIST} = {};
my $songs   = $setlist{SONG}   = {};
 
my $yojimbo = new Mac::Glue 'Yojimbo';
my $browser = new Mac::Glue 'Safari';
 
my $set = $yojimbo->obj(collection => 'Music: Setlist');
my $count = my @items = $set->obj('items')->get;
for my $item (@items) {
    my $song    = $item->prop('name')->get;
    my $text    = $item->prop('contents')->get;
    my($artist) = $item->prop(name => of => 'tag')->get;
 
    $text =~ s/(\015\012|\015|\012)/\n/g;
    my $key;
    $key = $1 if $text =~ s/^(\[.+\])\s+//s;
    (my $songlink   = $song)   =~ s/\W/_/g;
    (my $artistlink = $artist) =~ s/\W/_/g;
 
    push @{$artists->{$artist}}, $song;
    $songs->{$song}{artist} = $artist;
    $songs->{$song}{alink}  = $artistlink;
    $songs->{$song}{text}   = $text;
    $songs->{$song}{key}    = $key if $key;
    $songs->{$song}{link}   = $songlink;
}
 
$count += scalar(keys %$artists) * 2;
 
##########################
 
my $htmlfile = catfile(
    '/Users/pudge/MacOS/pudge/work/songs/music',
    'setlist.html'
);
my $uri = URI::file->new($htmlfile);
open my $fh, '>', $htmlfile;
 
##########################
 
print $fh $header;
 
my $c = 0;
my $d = 1;
for my $artist (sort keys %$artists) {
    my $artistr = $artists->{$artist};
    print $fh qq[\t<li><a name="$songs->{$artistr->[0]}{alink}">$artist</a>];
    print $fh qq[<ul class="setlist_inner">\n];
 
    for my $song (sort @$artistr) {
        my $songr = $songs->{$song};
        print $fh qq[\t\t<li class="setlist_inner"><a href="#$songr->{link}">$song</a>];
        print $fh " <i><small>$songr->{key}</small></i>" if $songr->{key};
        print $fh "</li>\n";
        $c++;
    }
    print $fh "\t</ul></li>\n";
    $c += 2;
 
    if ($c > $d*int($count/3)) {
        print $fh qq[</ul></div>\n<div class="wrapper"><ul class="col">\n];
        $d++;
        $c--;
    }
}
 
print $fh $mid;
 
for my $artist (sort keys %$artists) {
    my $artistr = $artists->{$artist};
    #print $fh "\t<h2>$artist</h2>\n";
 
    for my $song (sort @$artistr) {
        my $songr = $songs->{$song};
        my $text = $songr->{text};
        $text =~ s/</&lt;/g;
        $text =~ s|__BR__\s+|</pre><pre>|gs;
 
        print $fh qq[\t\t<h3><a name="$songr->{link}">$song</a>];
        print $fh qq[ <i>$songr->{key}</i>] if $songr->{key};
        print $fh qq[</h3>\n\t\t<a href="#top">Top</a>];
        print $fh qq[ | <a href="#$songr->{alink}">$artist</a>];
        print $fh qq[\n\n<pre>$text</pre>\n\n\n<hr>\n\n];
    }
}
 
print $fh $footer;
 
##########################
 
close $fh;
$browser->activate;
$browser->open_location($uri->as_string);
 
######## ##################
 
sub init {
    $header = <<EOT;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
    <title>Pudge Setlist</title>
    <link href="../style.css" rel="stylesheet">
</head>
<body style="font-size: 11px">
 
<h1><a name="top">Pudge Setlist</a></h1>
 
<div class="wrapper"><ul class="col">
EOT
 
    $mid = <<EOT;
</ul></div>
 
<div class="body">
 
EOT
 
    $footer = <<EOT;
<pre>__END__</pre>
</div>
</body>
</html>
EOT
 
}

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.