cache sidebar structure to avoid directory scans every request
[scpubgit/SCS.git] / lib / SCSite / SidebarFilter.pm
CommitLineData
fc436d2e 1package SCSite::SidebarFilter;
2
3use Moo;
4
5with 'SCSite::Filter';
6
7has _page_set => (is => 'ro', required => 1);
8
9sub new_from_site {
10 my ($class, $site) = @_;
11 $class->new(_page_set => $site->pages);
12}
13
14sub _latest_news {
15 shift->_page_set
16 ->get({ path => '/news/archive' })
17 ->children(at_depth => 3)
18 ->latest(2)
19 ->flatten;
20}
21
22sub _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
31sub _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 39has _sidebar_structure => (is => 'lazy');
40
41sub _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
54sub _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
771;