package Miril::Publisher;
use warnings;
use strict;
use autodie;
use Try::Tiny;
use Exception::Class;
use Carp;
use Module::Load;
use Miril::Warning;
use Miril::Exception;
use Miril::Config;
use Miril::List;
use Ref::List qw(list);
use File::Spec::Functions qw(catfile splitpath);
use Text::Sprintf::Named;
use Miril::URL;
use File::Path qw(make_path);
our $VERSION = '0.007';
sub publish {
my ($class, $miril, $rebuild) = @_;
my $cfg = $miril->cfg;
my (@to_create, @to_update);
my @posts = $miril->store->get_posts;
foreach my $post (@posts)
{
if (-x $post->out_path) {
# TODO - check if this is correct!
if ( $rebuild or ($post->modified->epoch > -M $post->out_path) ) {
push @to_update, $post->id;
}
} else {
push @to_create, $post->id;
}
}
for (@to_create, @to_update) {
my $post = $miril->store->get_post($_);
my $output = $miril->tmpl->load(
name => $post->type->template,
params => {
post => $post,
cfg => $cfg,
title => $post->title,
id => $post->id,
});
_file_write($post->out_path, $output);
}
foreach my $list ($cfg->lists->list)
{
my @posts;
# accept ids
if ( $list->match->id )
{
push @posts, $miril->store->get_post($_) for $list->match->id->list;
}
else
{
my @params = qw(
author
type
status
topic
created_before
created_on
created_after
updated_before
updated_on
updated_after
published_before
published_on
published_after
last
);
my %params;
foreach my $param (@params) {
if ( exists $list->match->{$param} ) {
$params{$param} = $list->match->{$param};
}
}
@posts = $miril->store->get_posts(%params);
}
if ($list->group) {
my $list_main = Miril::List->new(
posts => \@posts,
title => $list->name,
sort => $cfg->sort,
id => $list->id,
);
my $group_key = $list->group;
foreach my $list_group ($list_main->group($group_key))
{
my ($f_args, $tag_url_id);
if ($group_key eq 'topic')
{
$f_args = { topic => $list_group->key->id };
$tag_url_id = $list->id . '/' . $list_group->key->id;
}
elsif ($group_key eq 'type')
{
$f_args = { type => $list_group->key->id };
$tag_url_id = $list->id . '/' . $list_group->key->id;
}
elsif ($group_key eq 'author')
{
$f_args = { author => $list_group->key};
$tag_url_id = $list->id . '/' . $list_group->key;
}
else
{
$f_args = {
year => $list_group->key->strftime('%Y'),
month => $list_group->key->strftime('%m'),
date => $list_group->key->strftime('%d'),
};
}
my $formatter = Text::Sprintf::Named->new({fmt => $list->location});
my $location = $formatter->format({args => $f_args});
$list_group->{url} = $miril->util->inflate_list_url($tag_url_id, $list->location);
my $output = $miril->tmpl->load(
name => $list->template,
params => {
list => $list_group,
cfg => $cfg,
title => $list_group->title,
id => $list->id,
});
my $new_filename = catfile($cfg->output_path, $location);
_file_write($new_filename, $output);
}
}
elsif ($list->page)
{
my $pager = Data::Page->new;
my $posts_no = scalar @posts;
$pager->total_entries($posts_no);
$pager->entries_per_page($list->page);
foreach my $page_no ($pager->first_page .. $pager->last_page)
{
my $current_pager = Data::Page->new;
$current_pager->total_entries($posts_no);
$current_pager->entries_per_page($list->page);
$current_pager->current_page($page_no);
my @current_posts = $pager->splice(\@posts);
my $formatter = Text::Sprintf::Named->new({fmt => $list->location});
my $location = $formatter->format({args => { page => $page_no }});
my $list_page = Miril::List->new(
posts => \@current_posts,
pager => $current_pager,
title => $list->name,
url => $miril->util->inflate_list_url(undef, $location),
sort => $cfg->sort,
id => $list->id,
);
my $output = $miril->tmpl->load(
name => $list->template,
params => {
list => $list_page,
cfg => $cfg,
title => $list_page->title,
id => $list->id,
});
my $new_filename = catfile($cfg->output_path, $location);
_file_write($new_filename, $output);
}
}
else
{
my $output = $miril->tmpl->load(
name => $list->template,
params => {
list => Miril::List->new(
posts => \@posts,
title => $list->name,
url => $miril->util->inflate_list_url($list->id, $list->location),
id => $list->id,
sort => $cfg->sort,
),
cfg => $cfg,
title => $list->name,
id => $list->id,
}
);
my $new_filename = catfile($cfg->output_path, $list->location);
_file_write($new_filename, $output);
}
}
}
sub _file_write {
my ($filename, $data) = @_;
my ($volume, $directories, $file) = splitpath($filename);
my $path = $volume . $directories;
try {
make_path($path);
my $fh = IO::File->new($filename, ">") or die $!;
$fh->print($data);
$fh->close;
} catch {
Miril::Exception->throw(
errorvar => $_,
message => 'Could not save information',
);
}
#my $post_fh = IO::File->new($filename, "<") or die $!;
#while (<$post_fh>)
#{
# warn "BOM before write!" if /\x{FEFF}/;
#}
}
1;