1 contributor
package Biblesearch;
our $VERSION = '0.01';
use Mojo::Base 'Mojolicious';
use DBIx::Custom;
use File::Path 'mkpath';
use Mojo::JSON;
use Mojo::Util 'spurt';
has 'dbi';
sub startup {
my $self = shift;
# DBI
my $db_file = $self->home->rel_file('db/bible.db');
my $dbi = DBIx::Custom->connect(
dsn => "dbi:SQLite:dbname=$db_file",
option => {sqlite_unicode => 1},
connector => 1
);
$self->dbi($dbi);
# Models
my $models = [
{
table => 'book',
primary_key => 'id'
},
{
table => 'section',
primary_key => [qw/book_id chapter section/]
}
];
$dbi->create_model($_) for @$models;
# Route
my $r = $self->routes;
$r->get('/')->to(template => 'index');
$r->get('/api/book/:id/content.json')->to(cb => sub {
my $self = shift;
my $id = $self->param('id');
my $dbi = $self->app->dbi;
my $content = $dbi->model('book')->select('content', id => $id)->value;
if ($content) {
my $dir = $self->app->home->rel_file("public/api/book/$id");
mkpath $dir;
my $data = {
content => $content
};
my $json = Mojo::JSON->new;
my $data_json = $json->encode($data);
spurt $data_json, $self->app->home->rel_file("public/api/book/$id/content.json");
$self->render_static("/api/book/$id/content.json");
}
else {
$self->render_not_found;
}
});
$r->get('/api/word-count/:word')->to(cb => sub {
my $self = shift;
my $word = $self->param('word');
my $dbi = $self->app->dbi;
my $word_count_h = {};
for (my $i = 0; $i < 66; $i++) {
my $num = sprintf "%02d", $i + 1;
my $content = $dbi->select(
'content_no_tag',
table => 'book',
where => {id => $num}
)->value;
my $content_length = length $content;
my $word_q = quotemeta($word);
$content =~ s/$word_q//g;
my $content_length_no_word = length $content;
# 文字の個数
my $word_count = ($content_length - $content_length_no_word) / length $word;
$word_count_h->{$num} = $word_count;
}
$self->render(json => {word_count => $word_count_h});
});
}
1;