Fixed tutorial view and reimplemented API for new frontend
diff --git a/lib/Kalamar.pm b/lib/Kalamar.pm
index abd4d5e..f465802 100644
--- a/lib/Kalamar.pm
+++ b/lib/Kalamar.pm
@@ -13,37 +13,42 @@
my $pkg = b($self->home . '/package.json')->slurp;
$Kalamar::VERSION = decode_json($pkg)->{version};
- # Load documentation navigation
- my $navi = b($self->home . '/templates/doc/_nav.json')->slurp;
-
# Add additional plugin path
push(@{$self->plugins->namespaces}, __PACKAGE__ . '::Plugin');
+ # Set secrets for signed cookies
+ $self->secrets([
+ b($self->home . '/kalamar.secret')->slurp->split("\n")
+ ]);
+
# Load plugins
- foreach (qw/Config
- Localize
- Notifications
- DocNavi
- KalamarTagHelpers/) {
+ foreach (
+ 'Config', # Configuration framework
+ 'Localize', # Localization framework
+ 'Notifications', # Client notifications
+ 'Search', # Abstract Search framework
+ 'CHI', # Global caching mechanism
+ 'TagHelpers::Pagination', # Pagination widget
+ 'DocNavi', # Navigation for documentation
+ 'KalamarHelpers', # Specific Helpers for Kalamar
+ 'KalamarTagHelpers' # Specific Taghelpers for Kalamar
+ ) {
$self->plugin($_);
};
- $self->config(navi => decode_json($navi));
-
+ # Configure mail exception
$self->plugin('MailException' => $self->config('MailException'));
+ # Configure documentation navigation
+ my $navi = b($self->home . '/templates/doc/_nav.json')->slurp;
+ $self->config(navi => decode_json($navi));
+
# Establish routes
my $r = $self->routes;
- $r->get('/')->to(
- cb => sub {
- return shift->render(template => 'intro');
- });
-
# Base query page
$r->get('/')->to('search#query')->name('index');
-
# Documentation
$r->get('/doc')->to('documentation#page', page => 'korap');
$r->get('/doc/:page')->to('documentation#page', scope => undef);
@@ -63,10 +68,6 @@
# title => 'KorAP - Corpus Analysis Platform'
# );
- # Set secret for signed cookies
- $self->secrets([
- b($self->home . '/kalamar.secret')->slurp->split("\n")
- ]);
$self->hook(
before_dispatch => sub {
@@ -77,22 +78,11 @@
};
}) if $self->mode eq 'production';
- $self->hook(before_dispatch => sub {
- my $c = shift;
- my $h = $c->res->headers;
- $h->header( 'Access-Control-Allow-Origin' => '*' );
- $h->header( 'Access-Control-Allow-Methods' => 'GET, PUT, POST, DELETE, OPTIONS' );
- $h->header( 'Access-Control-Max-Age' => 3600 );
- $h->header( 'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With' );
- });
# Load plugins
- foreach (qw/CHI
- TagHelpers::Pagination
+ foreach (qw/
Number::Commify
- Search
- KalamarHelpers
/) {
$self->plugin($_);
};
diff --git a/lib/Kalamar/Controller/Search.pm b/lib/Kalamar/Controller/Search.pm
index 25954d4..4e18e28 100644
--- a/lib/Kalamar/Controller/Search.pm
+++ b/lib/Kalamar/Controller/Search.pm
@@ -1,8 +1,8 @@
package Kalamar::Controller::Search;
use Mojo::Base 'Mojolicious::Controller';
-# Add X-Forwarded-For to user agent call everywhere
+# Query the KorAP backends and render a template
sub query {
my $c = shift;
@@ -10,18 +10,8 @@
# No query
unless ($query) {
- return $c->render(template => 'index');
- }
-};
-
-
-1;
-
-
-__END__
-
-# Query the KorAP backends and render a template
-sub query {
+ return $c->render(template => 'intro');
+ };
# Base parameters for remote access
my %param = (
@@ -29,6 +19,7 @@
query => $query,
);
+ # May be not relevant
my $inspect = (scalar $c->param('action') // '') eq 'inspect' ? 1 : 0;
# Just check the serialization non-blocking
@@ -41,32 +32,52 @@
return;
};
+ # Choose the snippet based on the parameter
my $template = scalar $c->param('snippet') ? 'snippet' : 'search';
# Search non-blocking
$c->delay(
sub {
my $delay = shift;
+
+ # Search with a callback (async)
$c->search(
- cutoff => scalar $c->param('cutoff'),
- count => scalar $c->param('count'),
+ cutoff => scalar $c->param('cutoff'),
+ count => scalar $c->param('count'),
start_page => scalar $c->param('p'),
- cb => $delay->begin,
+ cb => $delay->begin,
%param
) if $query;
+ # Search resource (async)
$c->search->resource(
type => 'collection',
$delay->begin
);
},
+
+ # Collected search
sub {
+
+
+
+ # Render to the template
return $c->render(template => $template);
}
);
};
+1;
+
+
+__END__
+
+
+
+
+
+
# Get informations about a match
sub match_info {
my $c = shift;
@@ -121,3 +132,14 @@
__END__
+
+
+# Todo: Add X-Forwarded-For to user agent call everywhere
+ $self->hook(before_dispatch => sub {
+ my $c = shift;
+ my $h = $c->res->headers;
+ $h->header( 'Access-Control-Allow-Origin' => '*' );
+ $h->header( 'Access-Control-Allow-Methods' => 'GET, PUT, POST, DELETE, OPTIONS' );
+ $h->header( 'Access-Control-Max-Age' => 3600 );
+ $h->header( 'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With' );
+ });
diff --git a/lib/Kalamar/Plugin/KalamarHelpers.pm b/lib/Kalamar/Plugin/KalamarHelpers.pm
index 08ff41f..d514ceb 100644
--- a/lib/Kalamar/Plugin/KalamarHelpers.pm
+++ b/lib/Kalamar/Plugin/KalamarHelpers.pm
@@ -1,22 +1,29 @@
package Kalamar::Plugin::KalamarHelpers;
use Mojo::Base 'Mojolicious::Plugin';
+
+# Helpers for Kalamar
sub register {
my ($plugin, $mojo) = @_;
+ # Check for test port
$mojo->helper(
kalamar_test_port => sub {
my $c = shift;
+
+ # Test port is defined in the stash
if (defined $c->stash('kalamar.test_port')) {
return $c->stash('kalamar.test_port');
};
+ # Check the port
if ($c->req->url->to_abs->port == 6666 ||
$c->app->mode =~ m/^development|test$/) {
$c->stash('kalamar.test_port' => 1);
return 1;
};
+ # No test port
$c->stash('kalamar.test_port' => 0);
return 0;
});
diff --git a/lib/Kalamar/Plugin/KalamarTagHelpers.pm b/lib/Kalamar/Plugin/KalamarTagHelpers.pm
index 7a51d7b..d039604 100644
--- a/lib/Kalamar/Plugin/KalamarTagHelpers.pm
+++ b/lib/Kalamar/Plugin/KalamarTagHelpers.pm
@@ -8,15 +8,21 @@
sub register {
my ($plugin, $mojo) = @_;
-
+ # Embed the korap architecture image
$mojo->helper(
korap_overview => sub {
my $c = shift;
my $scope = shift;
- my $base = $c->stash('doc_base') ? '?' . $c->stash('doc_base') : '';
+
+ my $url = $c->url_with('/img/korap-overview.svg');
+
+ # If there is a different base - append this as a base
+ $url->query([base => $c->stash('doc_base') // '/']);
+
+ $url->fragment($scope);
return $c->tag('object',
- data => $c->url_for('/img/korap-overview.svg' . $base . '#' . $scope),
+ data => $url,
type => 'image/svg+xml',
alt => $c->loc('korap_overview'),
id => 'overview'
@@ -26,6 +32,78 @@
+ $mojo->helper(
+ doc_link_to => sub {
+ my $c = shift;
+ my $title = shift;
+ my $page = pop;
+ my $scope = shift;
+ return $c->link_to($title, $c->url_with('doc', scope => $scope, page => $page));
+ }
+ );
+
+ $mojo->helper(
+ doc_uc => sub {
+ return shift->tag('p', 'Under Construction!')
+ }
+ );
+
+
+ # Create helper for queries in the tutorial
+ $mojo->helper(
+ kalamar_tut_query => sub {
+ my ($c, $ql, $q, %param) = @_;
+
+ # Escape query for html embedding
+ $q = xml_escape $q;
+
+ # Return tag
+ b('<pre class="query tutorial" ' .
+ qq!data-query="$q" data-query-cutoff="! .
+ ($param{cutoff} ? 1 : 0) .
+ '"' .
+ qq! data-query-language="$ql">! .
+ '<code>' . $q . '</code>' .
+ '</pre>'
+ );
+ }
+ );
+
+
+ # Create links in the tutorial that make sure the current position is preserved,
+ # in case the tutorial was opened embedded
+ $mojo->helper(
+ kalamar_tut_link_to => sub {
+ my $c = shift;
+ my $title = shift;
+ my $link = shift;
+ my $host = $c->req->headers->header('X-Forwarded-Host');
+ my $url = $c->url_for($link);
+
+ # Link is part of the embedded tutorial
+ if ($c->param('embedded')) {
+ $url->query({ embedded => 1 });
+ return $c->link_to(
+ $title,
+ $url,
+ onclick => qq!setTutorialPage("$url")!
+ );
+ };
+
+ # Build link
+ return $c->link_to($title, $url);
+ }
+ );
+};
+
+1;
+
+
+__END__
+
+
+
+
# Create helper for queries in the tutorial
$mojo->helper(
kalamar_tut_query => sub {
@@ -155,48 +233,3 @@
'</code></pre>' . $msg);
}
);
-
- $mojo->helper(
- doc_link_to => sub {
- my $c = shift;
- my $title = shift;
- my $page = pop;
- my $scope = shift;
- return $c->link_to($title, $c->url_with('doc', scope => $scope, page => $page));
- }
- );
-
- $mojo->helper(
- doc_uc => sub {
- return shift->tag('p', 'Under Construction!')
- }
- );
-
-
- # Create links in the tutorial that make sure the current position is preserved,
- # in case the tutorial was opened embedded
- $mojo->helper(
- kalamar_tut_link_to => sub {
- my $c = shift;
- my $title = shift;
- my $link = shift;
- my $host = $c->req->headers->header('X-Forwarded-Host');
- my $url = $c->url_for($link);
-
- # Link is part of the embedded tutorial
- if ($c->param('embedded')) {
- $url->query({ embedded => 1 });
- return $c->link_to(
- $title,
- $url,
- onclick => qq!setTutorialPage("$url")!
- );
- };
-
- # Build link
- return $c->link_to($title, $url);
- }
- );
-};
-
-1;