Yojimbo Script for Setlist
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.
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/</</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>
</htm l>
EOT
}
Leave a comment