|
|
@@ -7,6 +7,8 @@ no warnings 'experimental';
|
|
|
use feature qw{signatures};
|
|
|
|
|
|
use File::Basename qw{basename};
|
|
|
+use Text::Xslate;
|
|
|
+use URI::Escape qw{uri_escape_utf8};
|
|
|
|
|
|
use lib 'lib';
|
|
|
use Trog::Routes::HTML;
|
|
|
@@ -24,7 +26,7 @@ our $fb_app_id = 'bogus';
|
|
|
our %routes = (
|
|
|
'/about.html' => {
|
|
|
method => 'GET',
|
|
|
- callback => sub {Trog::Routes::HTML::redirect_permanent('/about') },
|
|
|
+ callback => sub ($query) { $query->{tpsgi}->redirect_permanent('/about') },
|
|
|
},
|
|
|
'/meetings.html' => {
|
|
|
method => 'GET',
|
|
|
@@ -61,15 +63,15 @@ our %routes = (
|
|
|
},
|
|
|
'/styles/houston.css' => {
|
|
|
method => 'GET',
|
|
|
- callback => sub {Trog::Routes::HTML::redirect_permanent('/themes/houston.pm/styles/houston.css') },
|
|
|
+ callback => sub ($query) { $query->{tpsgi}->redirect_permanent('/themes/houston.pm/styles/houston.css') },
|
|
|
},
|
|
|
- '/talks/(\d.*)' => {
|
|
|
+ '/talks/{fragment+}' => {
|
|
|
method => 'GET',
|
|
|
- callback => sub {
|
|
|
- my ($query) = @_;
|
|
|
- Trog::Routes::HTML::redirect_permanent("/assets/talks/$query->{fragment}")
|
|
|
+ callback => sub ($query) {
|
|
|
+ my $fragment = $query->{input}{fragment};
|
|
|
+ return $query->{tpsgi}->notfound($query) unless $fragment =~ m/\A\d/;
|
|
|
+ return $query->{tpsgi}->redirect_permanent( '/assets/talks/' . uri_escape_utf8( $fragment, q{^A-Za-z0-9\-._~/} ) );
|
|
|
},
|
|
|
- captures => ['fragment'],
|
|
|
},
|
|
|
);
|
|
|
|
|
|
@@ -78,11 +80,13 @@ my $processor = Text::Xslate->new(
|
|
|
);
|
|
|
|
|
|
sub sponsors ($args) {
|
|
|
+ $args->{title} = 'Sponsors';
|
|
|
my $out = $processor->render('sponsors.tx');
|
|
|
return Trog::Routes::HTML::index($args, $out);
|
|
|
}
|
|
|
|
|
|
sub faq ($args) {
|
|
|
+ $args->{title} = 'FAQ';
|
|
|
my $out = $processor->render('faq.tx');
|
|
|
return Trog::Routes::HTML::index($args, $out);
|
|
|
}
|