Forráskód Böngészése

Pagination working better

George S. Baugh 5 éve
szülő
commit
b86552d058

+ 1 - 5
lib/Trog/Data/DUMMY.pm

@@ -9,10 +9,6 @@ use feature qw{signatures};
 use Carp qw{confess};
 use JSON::MaybeXS;
 use File::Slurper;
-use File::Copy;
-use Mojo::File;
-use List::Util;
-
 use parent qw{Trog::DataModule};
 
 =head1 WARNING
@@ -27,7 +23,7 @@ sub help { 'https://perldoc.perl.org/functions/quotemeta.html' }
 
 our $posts;
 
-sub read ($self, $query=undef) {
+sub read ($self, $query={}) {
     confess "Can't find datastore!" unless -f $datastore;
     my $slurped = File::Slurper::read_text($datastore);
     $posts = JSON::MaybeXS::decode_json($slurped);

+ 23 - 17
lib/Trog/Data/FlatFile.pm

@@ -11,55 +11,61 @@ use JSON::MaybeXS;
 use File::Slurper;
 use File::Copy;
 use Mojo::File;
-use List::Util;
 
 use parent qw{Trog::DataModule};
 
-our $datastore = 'data/files/';
+our $datastore = 'data/files';
 sub lang { 'Perl Regex in Quotemeta' }
 sub help { 'https://perldoc.perl.org/functions/quotemeta.html' }
 our @index;
 
-sub read ($self, $query=undef) {
-    @index //= $self->_index();
+=head1 Trog::Data::FlatFile
+
+This data model has multiple drawbacks, but is "good enough" for most low-content and few editor applications.
+You can only post once per second due to it storing each post as a file named after the timestamp.
+
+=cut
+
+our $parser = JSON::MaybeXS->new();
+
+sub read ($self, $query={}) {
+    @index = $self->_index() unless @index;
     my @items;
     foreach my $item (@index) {
         my $slurped = File::Slurper::read_text($item);
-        my $parsed  = JSON::MaybeXS::decode_json($slurped);
-        push(@items,$parsed) unless $self->filter($parsed);
+        my $parsed  = $parser->decode($slurped);
+        push(@items,$parsed) if $self->filter($query,$parsed);
         last if scalar(@items) == $query->{limit};
     }
-    return @items;
+    return \@items;
 }
 
 sub _index ($self) {
     return @index if @index;
     confess "Can't find datastore!" unless -d $datastore;
-    opendir(my $dh, $datastore) or die;
-    @index = grep { -f $_ } readdir $dh;
+    opendir(my $dh, $datastore) or confess;
+    @index = grep { -f } map { "$datastore/$_" } readdir $dh;
     closedir $dh;
-    return @index;
+    return sort { $b cmp $a } @index;
 }
 
 sub write($self,$data) {
-    open(my $fh, '>', $datastore) or confess;
-    print $fh JSON::MaybeXS::encode_json($data);
+    my $file = "$datastore/$data->{created}";
+    open(my $fh, '>', $file) or confess;
+    print $fh $parser->encode($data);
     close $fh;
 }
 
 sub count ($self) {
-    @index //= $self->_index();
+    @index = $self->_index() unless @index;
     return scalar(@index);
 }
 
 sub delete($self, @posts) {
-    my $example_posts = $self->read();
     foreach my $update (@posts) {
-        @$example_posts = grep { $_->{id} ne $update->{id} } @$example_posts;
+        unlink "$datastore/$update->{created}" or confess;
     }
-    $self->write($example_posts);
     return 0;
 }
 
-
 1;

+ 15 - 7
lib/Trog/DataModule.pm

@@ -3,6 +3,10 @@ package Trog::DataModule;
 use strict;
 use warnings;
 
+use List::Util;
+use File::Copy;
+use Mojo::File;
+
 no warnings 'experimental';
 use feature qw{signatures};
 
@@ -41,7 +45,7 @@ sub new ($class, $config) {
 #It is required that subclasses implement this
 sub lang  ($self) { ... }
 sub help  ($self) { ... }
-sub read  ($self,$query=undef) { ... }
+sub read  ($self,$query={}) { ... }
 sub write ($self) { ... }
 sub count ($self) { ... }
 
@@ -74,7 +78,7 @@ As implemented, this takes the data as a given and filters in post.
 
 sub get ($self, %request) {
 
-    my $posts = $self->read();
+    my $posts = $self->read(\%request);
     my @filtered = $self->filter(\%request, @$posts);
     @filtered = $self->_fixup(@filtered);
     @filtered = $self->paginate(\%request,@filtered);
@@ -97,13 +101,17 @@ sub filter ($self, $query, @filtered) {
 
     # If an ID is passed, just get that (and all it's prior versions)
     if ($request{id}) {
+
         @filtered = grep { $_->{id} eq $request{id} } @filtered if $request{id};
         @filtered = _dedup_versions($request{version}, @filtered);
-        return (1, \@filtered);
+        return @filtered;
     }
 
     @filtered = _dedup_versions(undef, @filtered);
 
+    #Filter out posts which are too old
+    @filtered = grep { $_->{created} < $request{older} } @filtered if $request{older};
+
     #XXX Heal bad data -- probably not needed
     @filtered = map { my $t = $_->{tags}; @$t = grep { defined $_ } @$t; $_ } @filtered;
 
@@ -152,10 +160,10 @@ sub _add_post_type (@posts) {
     return map {
         my $post = $_;
         my $type = 'file';
-        $type = 'blog'      if grep { $_ eq 'blog' }    @{$post->{tags}};
-        $type = 'microblog' if grep { $_ eq 'news' }    @{$post->{tags}};
-        $type = 'profile'   if grep { $_ eq 'about' } @{$post->{tags}};
-        $type = 'series'    if grep { $_ eq 'series'  } @{$post->{tags}};
+        $type = 'blog'      if grep { $_ eq 'blog'   } @{$post->{tags}};
+        $type = 'microblog' if grep { $_ eq 'news'   } @{$post->{tags}};
+        $type = 'profile'   if grep { $_ eq 'about'  } @{$post->{tags}};
+        $type = 'series'    if grep { $_ eq 'series' } @{$post->{tags}};
         $post->{type} = $type;
         $post
     } @posts;

+ 6 - 6
lib/Trog/Routes/HTML.pm

@@ -519,6 +519,7 @@ sub post ($query, $render_cb) {
     }
 
     my $limit = int($query->{limit} || 25);
+
     return $render_cb->('post.tx', {
         title       => 'New Post',
         to          => $query->{to},
@@ -531,9 +532,8 @@ sub post ($query, $render_cb) {
         route       => $query->{route},
         category    => '/posts',
         limit       => $limit,
-        pages       => scalar(@posts) > $limit,
-        older       => $query->{older},
-        last        => $posts[-1]->{created},
+        pages       => scalar(@posts) == $limit,
+        older       => $posts[-1]->{created},
         sizes       => [25,50,100],
         id          => $query->{id},
         acls        => \@acls,
@@ -703,15 +703,15 @@ sub posts ($query, $render_cb) {
 
     $query->{title} = @$tags ? "$query->{domain} : @$tags" : undef;
     my $limit = int($query->{limit} || 25);
+
     my $content = $processor->render('posts.tx', {
         title     => $query->{title},
         posts     => \@posts,
         in_series => !!($query->{route} =~ m/\/series\/\d*$/),
         route     => $query->{route},
         limit     => $limit,
-        pages     => scalar(@posts) > $limit,
-        older     => $query->{older},
-        last      => $posts[-1]->{created},
+        pages     => scalar(@posts) == $limit,
+        older     => $posts[-1]->{created},
         sizes     => [25,50,100],
         rss       => !$query->{id},
         tiled     => scalar(grep { $_ eq $query->{route} } qw{/files /audio /video /image /series /about}),

+ 1 - 4
www/templates/paginator.tx

@@ -4,12 +4,9 @@
 <div class="disabled">
 : }
     : if ( $older ) {
-    <div style="float:left; margin-top:.5rem;"> Posts older than <: $older :></div>
+    <div style="float:left; margin-top:.5rem;"> <: $limit :> most recent posts older than <span id="paginatorTime"><: $older :></span></div>
     : }
     <div style="float:right;">
-        : if ( $older ) {
-        <a href="?older=<: $last :>&limit=<: $limit :>">Next</a>
-        : }
         <a href="?older=<: $older :>&limit=<: $limit :>">Prev</a>
         Size:
         <form style="display:inline;">

+ 21 - 9
www/templates/posts.tx

@@ -10,10 +10,10 @@
 <hr class="divider" />
 : for $posts -> $post {
     : if ( $post.aclname && $in_series ) {
-    : next;
+    :     next;
     : }
     : if ( $post.is_profile && $post.user == 'Nobody' ) {
-    : next;
+    :     next;
     : }
     :if ( $tiled ) {
         : if ($post.is_profile) {
@@ -35,8 +35,8 @@
         <div class="post">
             : if (!$post.is_profile) {
             <h3 class='blogtitles'>
-                <a href='/posts/<: $post.id :>'><: $post.title :></a>
-                <a class="undecorated" href='<: $post.href :>'>🔗</a>
+                <a ><a href='<: $post.href :>' ><: $post.title :></a>
+                <a class="undecorated" href='/posts/<: $post.id :>'>🔗</a>
                 : if ( $post.version_max ) {
                 <form method="GET" action="/posts/<: $post.id :>" style="float:right;">
                     <select id="<: $post.id :>-<: $post.version :>-version" name="version" class="coolbutton">
@@ -113,14 +113,17 @@
 
                     // Fix post dates to be localized
                     var e = document.getElementById("<: $post.id :>-<: $post.version :>-time");
-                    var d = new Date(Date(e.innerText));
+                    var d = new Date(0);
+                    d.setUTCSeconds(e.innerText);
                     e.innerHTML = "&nbsp;" + d.toDateString();
 
                     //Make the version switcher do things
                     var swit = document.getElementById("<: $post.id :>-<: $post.version :>-version"); // I am an elder scrolls fan
-                    swit.onchange = function (evt) {
-                        this.form.submit();
-                    };
+                    if (swit) {
+                        swit.onchange = function (evt) {
+                            this.form.submit();
+                        };
+                    }
                 });
             </script>
             : }
@@ -134,4 +137,13 @@
 : if ( $about_footer ) {
     <: $about_footer | mark_raw :>
 : }
-
+<script>
+document.addEventListener("DOMContentLoaded", function(event) {
+    var pagin = document.getElementById("paginatorTime");
+    if (pagin) {
+        var dracula = new Date(0);
+        dracula.setUTCSeconds(pagin.innerText);
+        pagin.innerHTML = "&nbsp;" + dracula.toDateString();
+    }
+});
+</script>