My self-imposed Twitter exile has already paid off with the creation of this little program: plerd-cgi. This is designed to be an interactive tool to “manage” your plerd instance. Currently, the tool can regenerate all your content or from your sources directory or just a single post. This is very helpful when you are on the host running plerd and you are changing stylesheets or other settings.
I will ping the plerd development team (hi, Jmac) and see if there is interest in adding this tool to the plerd/bin directory (which is where I have it).
Increasing, my version of plerd is drifting from the released version. When plerd gets tags (jmac’s re-implementation of a feature I contributed), then I will try to merge these codebases together again.
From previous post, you can see that I am experimenting with managing photos. Plerd’s killer feature is its integration with Dropbox. This really enables a powerful and flexible blogging platform for those used to composing in text editors, like me.
#!/usr/bin/env perl
use warnings;
use strict;
use FindBin;
use lib ("$FindBin::Bin/../lib");
use Cwd ('abs_path');
use File::Basename;
use Getopt::Long;
use Path::Class::File;
use YAML qw( LoadFile );
use Plerd;
our %gKnownCommands =
('regen_all' => \&cmd_regenerate_all, 'regen' => \&cmd_regenerate_file, 'help' => \&cmd_help);
main();
exit;
#-----
# Subs
#-----
sub main {
my $opts = usage();
my $plerd = init_plerd();
# Only do one command
while (my ($command, $action) = each %gKnownCommands) {
if (defined $opts->{$command}) {
return $action->($plerd, $opts);
}
}
return;
} # end sub main
sub usage {
my %opts;
GetOptions(
"help" => \$opts{help},
"R|regen-all" => \$opts{regen_all},
"r|regen:s" => \$opts{regen},
"v|verbose" => \$opts{verbose},
);
if ($opts{help}) {
dump_usage();
exit;
}
my $has_command = 0;
for my $command (keys %gKnownCommands) {
$has_command |= defined $opts{$command};
}
if (!$has_command) {
die("No command given. See --help for details.\n");
}
return \%opts;
} # end sub usage
sub dump_usage {
print <<"EOT";
$0 - command line interface to plerd
USAGE:
$0 [OPTIONS]
OPTIONS:
--help # this screen
--verbose # provide more verbose output
--regen-all # regenerate all HTML files from known sources
--regen FILE # regenerate just this source file
EOT
} # end sub dump_usage
sub init_plerd {
my ($opts) = @_;
my $conf_file = "$FindBin::Bin/../conf/plerd.conf";
if (!-e $conf_file) {
die("Cannot find '$conf_file'\n");
}
my $config_ref = LoadFile($conf_file);
my $plerd = Plerd->new($config_ref);
return $plerd;
} # end sub init_plerd
sub cmd_help {
my ($plerd, $opts) = @_;
dump_usage();
return;
} # end sub cmd_help
sub cmd_regenerate_all {
my ($plerd, $opts) = @_;
my $start = time();
if ($opts->{verbose}) {
print("Regenerating all content. This may take a while.\n");
}
$plerd->publish_all();
if ($opts->{verbose}) {
printf("Regeneratation completed in %0.2f minutes.\n", (time() - $start) / 60);
}
} # end sub cmd_regenerate_all
sub cmd_regenerate_file {
my ($plerd, $opts) = @_;
my $source_file = abs_path($opts->{regen});
if (!-e $source_file) {
die("Cannot find '$source_file'\n");
}
# is the source file within the source_directory?
my $dirname = dirname($source_file);
if ($dirname ne $plerd->source_directory) {
die(sprintf(
"File '%s' does not appear to be in the source directory '%s'\n",
$source_file, $plerd->source_directory
)
);
}
if ($opts->{verbose}) {
print("Publishing '$source_file'\n");
}
my $post = Plerd::Post->new(
source_file => Path::Class::File->new($source_file),
plerd => $plerd
);
eval {
$post->publish;
1;
} or do {
die(sprintf("Could not publish '%s': %s\n", $source_file, $@));
};
# Publishing this new post triggers updates on these other pages
for my $action (
'publish_tag_indexes', 'publish_archive_page',
'publish_recent_page', 'publish_rss',
'publish_jsonfeed'
) {
if ($opts->{verbose}) {
print("-> $action\n");
}
$plerd->$action;
}
if ($opts->{verbose}) {
printf("View your new post here: %s\n", $post->uri);
}
return;
} # end sub cmd_regenerate_file
UPDATE: I spoke to Jmac about this and he pointed out his intention for the exisiting plerdall program to fill this niche. Additionally, the publish all functionality is already there. So I will talk a crack at porting what I have here when I am up and running with the current tip of plerd.