Skip to content

Instantly share code, notes, and snippets.

@nkwhr
Created May 1, 2012 12:20
Show Gist options
  • Save nkwhr/2567651 to your computer and use it in GitHub Desktop.
Save nkwhr/2567651 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use Mojolicious::Lite;
use File::Basename;
use Plack::Builder;
use HTML::TreeBuilder::XPath;
use DBI;
get '/' => sub {
my $self = shift;
my $s_tag_id = $self->param('tag') || '1';
my $s_memo_id = $self->param('memo') || undef;
my $db = '/path/to/Kobito.db';
my $dbh = DBI->connect("dbi:SQLite:dbname=$db",
undef,
undef,
+{
RaiseError => 1,
PrintError => 0,
AutoCommit => 1,
sqlite_unicode => 1,
}
);
my @tags = @{$dbh->selectall_arrayref(
q|select Z_PK,ZNAME from ZTAG|, {Slice => +{}},
)};
my $menu;
for my $tag (@tags) {
my $tag_id = $tag->{Z_PK};
$menu->{$tag_id}->{tag} = $tag->{ZNAME};
my $entries = $dbh->selectall_arrayref(
q|select Z_PK, ZTITLE from ZITEM, Z_1TAGS where Z_1TAGS.Z_2TAGS = ?
and ZITEM.Z_PK = Z_1TAGS.Z_1ITEMS|,
{Slice => +{}}, $tag_id,
);
for my $entry (@$entries) {
push @{$menu->{$tag_id}->{entries}}, $entry;
}
}
my $content = "";
if ($s_memo_id) {
my $html = $dbh->selectrow_arrayref(
q|select ZBODY from ZITEM where Z_PK = ?|,
{}, $s_memo_id,
);
my $tree = HTML::TreeBuilder::XPath->new;
$content = $tree->parse($html->[0])->findnodes_as_string('/html/body');
$content =~ s/<\/?body>//g;
$tree->delete;
}
$dbh->disconnect;
$self->render(menu => $menu, content => $content, s_tag_id => $s_tag_id);
} => 'index';
builder {
enable 'Plack::Middleware::ReverseProxy';
enable 'Plack::Middleware::Static',
path => qr!^/(?:(?:css|js|img)/|favicon\.ico$)!,
root => File::Basename::dirname(__FILE__) . '/public';
app->start;
};
__DATA__
@@ index.html.ep
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>KobitoViewer</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/css/bootstrap.css" rel="stylesheet">
<style>
body {
padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */
}
</style>
<link href="/css/bootstrap-responsive.css" rel="stylesheet">
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="/">KobitoViewer</a>
<div class="nav-collapse">
<ul class="nav">
<li class="active"><a href="/">Home</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="span3">
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header">Tags</li>
% for my $tag_id (sort {$menu->{$a}->{tag} cmp $menu->{$b}->{tag}} keys %$menu) {
% if ($tag_id == $s_tag_id) {
<li class="active"><a href="?tag=<%= $tag_id %>"><i class="icon-tag"></i> <%= $menu->{$tag_id}->{tag} %></a></li>
% }else {
<li><a href="?tag=<%= $tag_id %>"><i class="icon-tag"></i> <%= $menu->{$tag_id}->{tag} %></a></li>
% }
% }
</ul>
</div><!--/.well -->
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header">Memos</li>
% for my $entry (@{ $menu->{$s_tag_id}->{entries} }) {
<li><a href="/?tag=<%= $s_tag_id %>&memo=<%= $entry->{Z_PK} %>"><i class="icon-file"></i> <%= $entry->{ZTITLE} %></a></li>
% }
</ul>
</div><!--/.well -->
</div><!--/span-->
<div class="span9">
<div class="row-fluid">
<div class="span9">
<%= Mojo::ByteStream->new($content) %>
</div><!--/span-->
</div><!--/row-->
</div><!--/span-->
</div><!--/row-->
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment