moderate refactor, switched out in-app YAML handling for dancer2's own config because really why was i doing it myself. also made it a "proper" app
This commit is contained in:
parent
9b88fc2cbf
commit
f3d9040c5e
|
@ -0,0 +1,9 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use FindBin;
|
||||||
|
use lib "$FindBin::Bin/../lib";
|
||||||
|
|
||||||
|
use App::BlogAlba;
|
||||||
|
|
||||||
|
App::BlogAlba->start;
|
18
config
18
config
|
@ -1,18 +0,0 @@
|
||||||
# vim: set syntax=yaml :
|
|
||||||
url: https://maff.scot/
|
|
||||||
name: colourful words and phrases
|
|
||||||
tagline: techy tangents and general life chatter from a tired sysadmin.
|
|
||||||
author: Maff
|
|
||||||
about: A dorky dude who spends too much time with perl.
|
|
||||||
keywords: sysadmin,unix,bsd,freebsd,linux,software,web,developer,perl,bash,shell,gentoo,maff,matthew,connelly,dundee,scotland,furry,blog
|
|
||||||
posturlprepend: wrote/
|
|
||||||
config:
|
|
||||||
indexable: 1
|
|
||||||
per_page: 6
|
|
||||||
recent_posts: 8
|
|
||||||
rss_publish: 1
|
|
||||||
rss_excerpt: 1
|
|
||||||
date_format: "%H:%M on %A, %d/%m/%y"
|
|
||||||
links:
|
|
||||||
Twitter: https://twitter.com/maffsie
|
|
||||||
Github: https://github.com/Maffsie
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
appname: "BlogAlba"
|
||||||
|
charset: "UTF-8"
|
||||||
|
tz: "Europe/London"
|
||||||
|
locale: "en_GB"
|
||||||
|
|
||||||
|
logger: "console"
|
||||||
|
log: "debug"
|
||||||
|
|
||||||
|
# Uncomment for debugging
|
||||||
|
#show_errors: 1
|
||||||
|
|
||||||
|
#Blog configuration
|
||||||
|
url: https://maff.scot/
|
||||||
|
name: colourful words and phrases
|
||||||
|
tagline: techy tangents and general life chatter from a tired sysadmin.
|
||||||
|
author: Maff
|
||||||
|
about: A dorky dude who spends too much time with perl.
|
||||||
|
keywords: "sysadmin,unix,bsd,freebsd,linux,software,web,developer,perl,bash,shell,gentoo,maff,matthew,connelly,dundee,scotland,furry,blog"
|
||||||
|
posturlprepend: wrote/
|
||||||
|
conf:
|
||||||
|
indexable: 1
|
||||||
|
per_page: 6
|
||||||
|
recent_posts: 8
|
||||||
|
rss_publish: 1
|
||||||
|
rss_excerpt: 1
|
||||||
|
date_format: "%H:%M on %A, %d/%m/%y"
|
||||||
|
links:
|
||||||
|
Twitter: https://twitter.com/maffsie
|
||||||
|
Github: https://github.com/Maffsie
|
|
@ -0,0 +1,10 @@
|
||||||
|
requires 'HTML::Template';
|
||||||
|
requires 'Text::Markdown::Hoedown';
|
||||||
|
requires 'XML::RSS';
|
||||||
|
|
||||||
|
requires 'Unicode::Normalise';
|
||||||
|
|
||||||
|
requires 'Date::Parse';
|
||||||
|
requires 'Time::HiRes';
|
||||||
|
|
||||||
|
requires 'Dancer2';
|
|
@ -1,6 +1,3 @@
|
||||||
#!/usr/bin/env perl
|
|
||||||
# BlogAlba - no-frills markdown blogging system
|
|
||||||
|
|
||||||
package App::BlogAlba;
|
package App::BlogAlba;
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
@ -9,7 +6,6 @@ use warnings;
|
||||||
use Cwd;
|
use Cwd;
|
||||||
use HTML::Template;
|
use HTML::Template;
|
||||||
use Text::Markdown::Hoedown;
|
use Text::Markdown::Hoedown;
|
||||||
use YAML;
|
|
||||||
|
|
||||||
use POSIX qw/strftime/;
|
use POSIX qw/strftime/;
|
||||||
use Date::Parse qw/str2time/; #Required for converting the date field in posts to something strftime can work with
|
use Date::Parse qw/str2time/; #Required for converting the date field in posts to something strftime can work with
|
||||||
|
@ -22,9 +18,7 @@ use Dancer2;
|
||||||
my $HOST = `hostname -s`; chomp $HOST;
|
my $HOST = `hostname -s`; chomp $HOST;
|
||||||
|
|
||||||
my $basedir=$ENV{BLOGALBA_DIR} || cwd();
|
my $basedir=$ENV{BLOGALBA_DIR} || cwd();
|
||||||
my $cfg="$basedir/config";
|
config->{url} .= '/' unless config->{url} =~ /\/$/;
|
||||||
my $blog=YAML::LoadFile($cfg) or die "Couldn't load $cfg!";
|
|
||||||
$blog->{url} .= '/' unless $blog->{url} =~ /\/$/;
|
|
||||||
|
|
||||||
my ($page,@posts,@pages,%defparams);
|
my ($page,@posts,@pages,%defparams);
|
||||||
my $nposts=0;my $npages=1;my $lastcache=0;
|
my $nposts=0;my $npages=1;my $lastcache=0;
|
||||||
|
@ -62,7 +56,7 @@ sub readpost {
|
||||||
$postm{time} = str2time($postm{date});
|
$postm{time} = str2time($postm{date});
|
||||||
$postm{fancy} = timefmt($postm{time},'fancydate');
|
$postm{fancy} = timefmt($postm{time},'fancydate');
|
||||||
$postm{datetime} = timefmt($postm{date},'datetime');
|
$postm{datetime} = timefmt($postm{date},'datetime');
|
||||||
$postm{permaurl} = $blog->{url}.$blog->{posturlprepend}.timefmt($postm{time},'permalink').$postm{slug};
|
$postm{permaurl} = config->{url}.config->{posturlprepend}.timefmt($postm{time},'permalink').$postm{slug};
|
||||||
}
|
}
|
||||||
push @posts,{%postm} if $psh==1; push @pages,{%postm} if $psh==2;return %postm;
|
push @posts,{%postm} if $psh==1; push @pages,{%postm} if $psh==2;return %postm;
|
||||||
}
|
}
|
||||||
|
@ -84,23 +78,23 @@ sub timefmt {
|
||||||
return strftime "%Y-%m",localtime $epoch if $context eq 'writepost';
|
return strftime "%Y-%m",localtime $epoch if $context eq 'writepost';
|
||||||
return strftime "%Y/%m/",localtime $epoch if $context eq 'permalink';
|
return strftime "%Y/%m/",localtime $epoch if $context eq 'permalink';
|
||||||
return strftime $context, localtime $epoch if $context;
|
return strftime $context, localtime $epoch if $context;
|
||||||
return strftime $blog->{config}->{date_format},localtime $epoch;
|
return strftime config->{conf}->{date_format},localtime $epoch;
|
||||||
}
|
}
|
||||||
sub pagination_calc {
|
sub pagination_calc {
|
||||||
my $rem=$nposts % $blog->{config}->{per_page};
|
my $rem=$nposts % config->{conf}->{per_page};
|
||||||
$npages=($nposts-$rem)/$blog->{config}->{per_page};
|
$npages=($nposts-$rem)/config->{conf}->{per_page};
|
||||||
$npages++ if $rem>0 or $npages<1;
|
$npages++ if $rem>0 or $npages<1;
|
||||||
}
|
}
|
||||||
sub get_index {
|
sub get_index {
|
||||||
my @iposts = @_;
|
my @iposts = @_;
|
||||||
$page->param(pagetitle => $blog->{name}, INDEX => 1, POSTS => [@iposts]);
|
$page->param(pagetitle => config->{name}, INDEX => 1, POSTS => [@iposts]);
|
||||||
return $page->output;
|
return $page->output;
|
||||||
}
|
}
|
||||||
sub paginate {
|
sub paginate {
|
||||||
my $pagenum = shift; my $offset = ($pagenum-1)*$blog->{config}->{per_page};
|
my $pagenum = shift; my $offset = ($pagenum-1)*config->{conf}->{per_page};
|
||||||
my $offset_to = $offset+($blog->{config}->{per_page}-1); $offset_to = $#posts if $offset_to > $#posts;
|
my $offset_to = $offset+(config->{conf}->{per_page}-1); $offset_to = $#posts if $offset_to > $#posts;
|
||||||
$page->param(PAGINATED => 1, prevlink => ($pagenum>1? 1 : 0), prevpage => $pagenum-1, nextlink => ($pagenum<$npages? 1 : 0), nextpage => $pagenum+1);
|
$page->param(PAGINATED => 1, prevlink => ($pagenum>1? 1 : 0), prevpage => $pagenum-1, nextlink => ($pagenum<$npages? 1 : 0), nextpage => $pagenum+1);
|
||||||
return get_index @posts[$offset..(($offset+$blog->{config}->{per_page})>$#posts? $#posts : ($offset+($blog->{config}->{per_page}-1)))];
|
return get_index @posts[$offset..(($offset+config->{conf}->{per_page})>$#posts? $#posts : ($offset+(config->{conf}->{per_page}-1)))];
|
||||||
}
|
}
|
||||||
sub page_init {
|
sub page_init {
|
||||||
$page = HTML::Template->new(filename => "$basedir/layout/base.html",die_on_bad_params => 0,utf8 => 1,global_vars => 1);
|
$page = HTML::Template->new(filename => "$basedir/layout/base.html",die_on_bad_params => 0,utf8 => 1,global_vars => 1);
|
||||||
|
@ -111,7 +105,7 @@ sub get_post {
|
||||||
for my $r (@posts) {
|
for my $r (@posts) {
|
||||||
my %post = %$r;
|
my %post = %$r;
|
||||||
next unless $post{slug} eq $slug and timefmt($post{time},'writepost') eq "$y-$m";
|
next unless $post{slug} eq $slug and timefmt($post{time},'writepost') eq "$y-$m";
|
||||||
$page->param(pagetitle => "$post{title} - $blog->{name}",%post);
|
$page->param(pagetitle => $post{title}." - ".config->{name},%post);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return undef;
|
return undef;
|
||||||
|
@ -121,21 +115,21 @@ sub get_page {
|
||||||
for my $r (@pages) {
|
for my $r (@pages) {
|
||||||
my %cpage = %$r;
|
my %cpage = %$r;
|
||||||
next unless $cpage{filename} eq $pname;
|
next unless $cpage{filename} eq $pname;
|
||||||
$page->param(pagetitle => "$cpage{title} - $blog->{name}",%cpage);
|
$page->param(pagetitle => $cpage{title}" - ".config->{name},%cpage);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
sub generate_feed {
|
sub generate_feed {
|
||||||
return unless $blog->{config}->{rss_publish};
|
return unless config->{conf}->{rss_publish};
|
||||||
my $feed = new XML::RSS(version => '2.0');
|
my $feed = new XML::RSS(version => '2.0');
|
||||||
$feed->channel (
|
$feed->channel (
|
||||||
title => $blog->{name},
|
title => config->{name},
|
||||||
link => $blog->{url},
|
link => config->{url},
|
||||||
description => $blog->{tagline},
|
description => config->{tagline},
|
||||||
dc => {
|
dc => {
|
||||||
creator => $blog->{author},
|
creator => config->{author},
|
||||||
language => "en-gb",
|
language => config->{locale},
|
||||||
},
|
},
|
||||||
syn => {
|
syn => {
|
||||||
updatePeriod => "daily",
|
updatePeriod => "daily",
|
||||||
|
@ -146,9 +140,9 @@ sub generate_feed {
|
||||||
$feed->add_item (
|
$feed->add_item (
|
||||||
title => $_->{title},
|
title => $_->{title},
|
||||||
link => $_->{permaurl},
|
link => $_->{permaurl},
|
||||||
description => ($blog->{config}->{rss_excerpt}? $_->{excerpt} : $_->{body}),
|
description => (config->{conf}->{rss_excerpt}? $_->{excerpt} : $_->{body}),
|
||||||
dc => { creator => $blog->{author}, },
|
dc => { creator => config->{author}, },
|
||||||
) for @posts[0 .. ($#posts > ($blog->{config}->{recent_posts}-1)? ($blog->{config}->{recent_posts}-1) : $#posts)];
|
) for @posts[0 .. ($#posts > (config->{conf}->{recent_posts}-1)? (config->{conf}->{recent_posts}-1) : $#posts)];
|
||||||
$feed->save("$basedir/public/feed-rss2.xml");
|
$feed->save("$basedir/public/feed-rss2.xml");
|
||||||
}
|
}
|
||||||
sub do_cache {
|
sub do_cache {
|
||||||
|
@ -172,21 +166,18 @@ sub do_cache {
|
||||||
closedir PAGES;
|
closedir PAGES;
|
||||||
|
|
||||||
my @nav;
|
my @nav;
|
||||||
push @nav, {navname => $_->{title}, navurl => "$blog->{url}$_->{filename}",} for @pages;
|
push @nav, {navname => $_->{title}, navurl => config->{url}.$_->{filename},} for @pages;
|
||||||
push @nav, {navname => $_, navurl => $blog->{links}->{$_},} for sort { $b cmp $a } keys $blog->{links};
|
push @nav, {navname => $_, navurl => config->{links}->{$_},} for sort { $b cmp $a } keys config->{links};
|
||||||
generate_feed;
|
generate_feed;
|
||||||
%defparams = (
|
%defparams = (
|
||||||
INDEX => 0, NAV => [@nav], url => $blog->{url}, recent => [@posts[0 .. ($#posts > ($blog->{config}->{recent_posts}-1)? ($blog->{config}->{recent_posts}-1) : $#posts)]],
|
INDEX => 0, NAV => [@nav], url => config->{url}, recent => [@posts[0 .. ($#posts > (config->{conf}->{recent_posts}-1)? (config->{conf}->{recent_posts}-1) : $#posts)]],
|
||||||
gentime => timefmt($lastcache, '%H:%M %e/%-m/%y %Z'), genworktime => sprintf("%.2f ms", tv_interval($st)*100), host => $HOST, rss_enabled => $blog->{rss_publish},
|
gentime => timefmt($lastcache, '%H:%M %e/%-m/%y %Z'), genworktime => sprintf("%.2f ms", tv_interval($st)*100), host => $HOST, rss_enabled => config->{rss_publish},
|
||||||
about => $blog->{about}, author => $blog->{author}, name => $blog->{name}, tagline => $blog->{tagline}, keywords => $blog->{keywords},
|
about => config->{about}, author => config->{author}, name => config->{name}, tagline => config->{tagline}, keywords => config->{keywords},
|
||||||
robots => $blog->{config}->{indexable}? '<meta name="ROBOTS" content="INDEX, FOLLOW" />' : '<meta name="ROBOTS" content="NOINDEX, NOFOLLOW" />',
|
robots => config->{conf}->{indexable}? '<meta name="ROBOTS" content="INDEX, FOLLOW" />' : '<meta name="ROBOTS" content="NOINDEX, NOFOLLOW" />',
|
||||||
);
|
);
|
||||||
pagination_calc;
|
pagination_calc;
|
||||||
}
|
}
|
||||||
|
|
||||||
set server => '127.0.0.1';
|
|
||||||
set port => 42069;
|
|
||||||
|
|
||||||
hook 'before' => sub {
|
hook 'before' => sub {
|
||||||
do_cache;
|
do_cache;
|
||||||
page_init;
|
page_init;
|
||||||
|
@ -216,10 +207,10 @@ get '/:extpage' => sub {
|
||||||
return $page->output;
|
return $page->output;
|
||||||
};
|
};
|
||||||
# 404
|
# 404
|
||||||
any qr{.*} => sub {
|
any qr/.*/ => sub {
|
||||||
return redirect '/' if request->path =~ /index(?:\.(?:html?|pl)?)?$/;
|
return redirect '/' if request->path =~ /index(?:\.(?:html?|pl)?)?$/;
|
||||||
status 'not_found';
|
return send_error('The page you seek cannot be found.', 404);
|
||||||
#return redirect '/404.html'; # this doesn't actually work, need to find a better way of 404ing using nginx's 404 page
|
|
||||||
};
|
};
|
||||||
|
|
||||||
start;
|
1;
|
||||||
|
__END__
|
Loading…
Reference in New Issue