Commit | Line | Data |
fc436d2e |
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 | |
0fb543cd |
39 | has _sidebar_structure => (is => 'lazy'); |
40 | |
41 | sub _build__sidebar_structure { |
fc436d2e |
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([ |
99cee940 |
61 | map { my ($s, @e) = @$_; sub { |
fc436d2e |
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; |