64f804ed3844b69307aa1d948e1dea60fcf61be5
[scpubgit/SCS.git] / lib / SCSite / SidebarFilter.pm
1 package SCSite::SidebarFilter;
2
3 use Moo;
4
5 with 'SCSite::Filter';
6
7 has _page_set => (is => 'ro', required => 1);
8
9 sub new_from_site {
10   my ($class, $site) = @_;
11   $class->new(_page_set => $site->pages);
12 }
13
14 sub _latest_news {
15   shift->_page_set
16        ->get({ path => '/news/archive' })
17        ->children(at_depth => 3)
18        ->latest(2)
19        ->flatten;
20 }
21
22 sub _latest_news_archives {
23   shift->_page_set
24        ->get({ path => '/news/archive' })
25        ->${\sub { # archive page plus three latest per-month
26            my $o = shift;
27            ($o, $o->children(at_depth => 2)->latest(3)->flatten)
28          }};
29 }
30
31 sub _latest_blog_posts {
32   shift->_page_set
33        ->get({ path => '/blog' })
34        ->children(min_depth => 2, max_depth => 0)
35        ->latest(4)
36        ->flatten;
37 }
38
39 has _sidebar_structure => (is => 'lazy');
40
41 sub _build__sidebar_structure {
42   my ($self) = @_;
43   [
44     [ 'NEWS',
45       [ 'Latest News Items', $self->_latest_news ],
46       [ 'Archives', $self->_latest_news_archives ],
47     ],
48     [ 'BLOGS',
49       [ 'Latest Blog Posts', $self->_latest_blog_posts ],
50     ],
51   ];
52 }
53
54 sub _filter_stream {
55   my ($self, $stream) = @_;
56   my @blocks = @{$self->_sidebar_structure};
57   $stream->select('.sidebar.block')->repeat([
58              map { my ($t, @seg) = @$_; sub {
59                $_->select('.sidebar.title')->replace_content($t)
60                  ->select('.sidebar.segment')->repeat([
61                      map { my ($s, @e) = @$_; sub {
62                        $_->select('.sidebar.subtitle')->replace_content($s)
63                          ->select('.sidebar.entries')->repeat_content([
64                              map { my $e = $_; sub {
65                                $_->select('.entry.title')
66                                  ->replace_content($e->title)
67                                  ->select('.entry.link')
68                                  ->set_attribute(href => $e->path)
69                              } } @e
70                            ])
71                      } } @seg
72                    ])
73              } } @blocks
74            ])
75 }
76
77 1;