7 has pages => (is => 'lazy');
9 has filters => (is => 'lazy');
11 has _layout_zoom => (is => 'lazy');
15 pages_dir => 'share/content',
16 template_dir => 'share/skin',
22 SCSite::PageSet->new(base_dir => io->dir($self->config->{pages_dir}))
27 require SCSite::SubListFilter;
28 require SCSite::SidebarFilter;
30 map +($_ => "SCSite::${_}Filter"->new_from_site($self)),
35 sub dispatch_request {
38 $self->_http_response(500 => 'text/plain' => 'Not implemented');
41 $self->_page_http_response(200 => $self->_find_page('index'));
44 [ 302, [ 'Location' => "/$_[1]/" ], [] ]
47 my ($code, $page) = map {
48 $_ ? (200, $_) : (404, $self->_error_page(404))
49 } $self->_find_page($_[1]);
50 $self->_page_http_response($code => $page);
55 my ($self, $code) = @_;
56 $self->_find_page("error_${code}");
60 my ($self, $path) = @_;
61 $self->pages->get({ path => $path });
65 my ($self, $code, $type, $content) = @_;
66 [ $code, [ 'Content-type' => $type ], [ $content ] ];
69 sub _page_http_response {
70 my ($self, $code, $page) = @_;
71 [ $code, [ 'Content-type' => 'text/html' ], $self->_render_page($page) ];
75 my ($self, $page) = @_;
76 my $zoom = $self->_layout_zoom;
77 my %filters = %{$self->filters};
78 $zoom->select('.page.title')->replace_content($page->title)
79 ->select('meta[name=description]')->replace_content($page->description)
80 ->select('meta[name=keywords]')->replace_content($page->keywords)
81 ->select('.main')->replace_content(\$page->body)
83 foreach my $fname (sort keys %filters) {
84 my $cb = $filters{$fname}->callback_for($page);
85 $_ = $_->select(".${fname}")->collect({
86 filter => $cb, passthrough => 1
94 sub _build__layout_zoom {
96 HTML::Zoom->from_file(
97 io->dir($self->config->{template_dir})->catfile('layout.html')
102 return $_[0]->to_psgi_app if caller(1);
104 my @config_keys = keys %{{$class->default_config}};
105 require Getopt::Long;
107 Getopt::Long::GetOptions(
108 map +("$_=s" => \$config{$_}), @config_keys
110 delete $config{$_} for grep !defined($config{$_}), keys %config;
111 my $new = $class->new(config => \%config);
115 __PACKAGE__->run_if_script;