File Coverage

lib/Kwiki/Pages.pm
Criterion Covered Total %
statement 1 3 33.3
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 2 4 50.0


line stmt bran cond sub pod time code
1             package Kwiki::Pages;
2 1     1   2596 use Kwiki::Base -Base;
  0            
  0            
3             use mixin 'Kwiki::Installer';
4              
5             const inline_classes => [qw(Kwiki::Page Kwiki::PageMeta)];
6             const class_id => 'pages';
7             const class_title => 'Kwiki Pages';
8             const page_class => 'Kwiki::Page';
9             const meta_class => 'Kwiki::PageMeta';
10              
11             field current =>
12             -init => '$self->new_page($self->current_id)';
13              
14             sub all {
15             grep {
16             $_->is_readable
17             } map {
18             $self->new_page($_->filename)
19             } io($self->current->database_directory)->all_files;
20             }
21              
22             sub all_ids_newest_first {
23             my $path = $self->current->database_directory;
24             # XXX Unix speed hack should be worked around for win32
25             map {chomp; $_} `ls -1t $path`;
26             }
27              
28             sub recent_by_count {
29             my ($count) = @_;
30             my @page_ids = $self->all_ids_newest_first;
31             splice(@page_ids, $count)
32             if @page_ids > $count;
33             map { $self->new_page($_) } @page_ids;
34             }
35              
36             sub all_since {
37             my ($minutes) = @_;
38             my @pages_since;
39             for my $page_id ($self->all_ids_newest_first) {
40             my $page = $self->new_page($page_id);
41             last if $page->age_in_minutes > $minutes;
42             next unless $page->is_readable;
43             push @pages_since, $page;
44             }
45             return @pages_since;
46             }
47              
48             sub current_id {
49             my $page_name =
50             $self->hub->cgi->page_name ||
51             $self->hub->config->main_page;
52             $self->name_to_id($page_name);
53             }
54              
55             sub name_to_id {
56             my $id = $self->uri_escape(shift);
57             }
58              
59             sub name_to_title {
60             (shift);
61             }
62              
63             sub id_to_uri {
64             (shift);
65             }
66              
67             sub id_to_title {
68             $self->uri_unescape(shift);
69             }
70              
71             sub new_page {
72             my $page_id = shift;
73             return if length $page_id > 255;
74             my $page = $self->page_class->new(id => $page_id);
75             $page->metadata($self->new_metadata($page_id));
76             return $page;
77             }
78              
79             sub new_from_name {
80             my $page_name = shift;
81             my $id = $self->name_to_id($page_name);
82             my $page = $self->new_page($id);
83             return unless $page;
84             $page->title($self->name_to_title($page_name));
85             return $page;
86             }
87              
88             sub new_metadata {
89             my $page_id = shift or die;
90             $self->meta_class->new(id => $page_id);
91             }
92              
93             package Kwiki::Page;
94             use Kwiki::ContentObject qw(-base !io);
95             use Kwiki ':char_classes';
96              
97             field class_id => 'page';
98             field title =>
99             -init => '$self->hub->pages->id_to_title($self->id)';
100             field uri =>
101             -init => '$self->hub->pages->id_to_uri($self->id)';
102              
103             sub all {
104             return (
105             page_uri => $self->uri,
106             page_title => $self->title,
107             );
108             }
109              
110             sub database_directory {
111             $self->hub->config->database_directory;
112             }
113              
114             sub content {
115             return $self->{content} = shift if @_;
116             return $self->{content} if defined $self->{content};
117             $self->load_content;
118             return $self->{content};
119             }
120              
121             sub metadata {
122             return $self->{metadata} = shift if @_;
123             $self->{metadata} ||=
124             $self->meta_class->new(id => $self->id);
125             return $self->{metadata} if $self->{metadata}->loaded;
126             $self->load_metadata;
127             return $self->{metadata};
128             }
129              
130             sub update {
131             $self->metadata->update($self);
132             return $self;
133             }
134              
135             sub kwiki_link {
136             my ($label) = @_;
137             my $page_uri = $self->uri;
138             $label = $self->title
139             unless defined $label;
140             return $label unless $self->is_readable;
141             my $script = $self->hub->config->script_name;
142             my $class = $self->active
143             ? '' : ' class="empty"';
144             qq($label);
145             }
146              
147             sub edit_by_link {
148             my $user_name = $self->metadata->edit_by || 'UnknownUser';
149             $user_name = $self->hub->config->user_default_name
150             if $user_name =~ /[^$ALPHANUM]/;
151             my $page = $self->hub->pages->new_page($user_name);
152             $page->kwiki_link;
153             }
154              
155             sub edit_time {
156             my $edit_time = $self->metadata->edit_unixtime ||
157             $self->modified_time;
158             return $self->hub->have_plugin('time_zone')
159             ? $self->hub->time_zone->format($edit_time)
160             : $self->format_time($edit_time);
161             }
162              
163             sub format_time {
164             my $unix_time = shift;
165             my $formatted = scalar gmtime $unix_time;
166             $formatted .= ' GMT'
167             unless $formatted =~ /GMT$/;
168             return $formatted;
169             }
170              
171             #XXX This is a bad idea. io is the IO::All constructor. Making it into a
172             # method is problematic
173             sub io {
174             Kwiki::io($self->file_path)->file;
175             }
176              
177             sub modified_time {
178             $self->io->mtime || 0;
179             }
180              
181             sub age {
182             $self->age_in_minutes;
183             }
184              
185             sub age_in_minutes {
186             $self->age_in_seconds / 60;
187             }
188              
189             sub age_in_seconds {
190             return $self->{age_in_seconds} = shift if @_;
191             return $self->{age_in_seconds} if defined $self->{age_in_seconds};
192             my $path = $self->database_directory;
193             my $page_id = $self->id;
194             return $self->{age_in_seconds} = (time - $self->modified_time);
195             }
196              
197             sub to_html {
198             my $content = @_ ? shift : $self->content;
199             $self->hub->formatter->text_to_html($content);
200             }
201              
202             sub history {
203             $self->hub->archive->history($self);
204             }
205              
206             sub revision_number {
207             $self->hub->archive->revision_number($self);
208             }
209              
210             sub revision_numbers {
211             $self->hub->archive->revision_numbers($self, @_);
212             }
213              
214             package Kwiki::PageMeta;
215             use Spoon::MetadataObject -base;
216             use Kwiki::Plugin -base;
217              
218             const class_id => 'page_metadata';
219             field loaded => 0;
220              
221             field edit_by => '';
222             field edit_time => '';
223             field edit_unixtime => '';
224             field edit_address => '';
225              
226             sub sort_order {
227             qw(edit_by edit_time edit_unixtime edit_address)
228             }
229              
230             sub file_path {
231             join '/', $self->plugin_directory, $self->id;
232             }
233              
234             sub load {
235             $self->loaded(1);
236             my $file_path = $self->file_path;
237             return unless -f $file_path;
238             my $hash = $self->parse_yaml_file($file_path);
239             $self->from_hash($hash);
240             }
241              
242             sub update {
243             my $page = shift;
244             $self->edit_by($self->hub->users->current->name);
245             my $unixtime = time;
246             $self->edit_time(scalar gmtime($unixtime));
247             $self->edit_unixtime($unixtime);
248             $self->edit_address($self->get_edit_address);
249             return $self;
250             }
251              
252             sub get_edit_address {
253             $ENV{HTTP_X_FORWARDED_FOR} ||
254             $ENV{REMOTE_ADDR} ||
255             '';
256             }
257              
258             sub store {
259             my $file_path = $self->file_path;
260             my $hash = $self->to_hash;
261             $self->print_yaml_file($file_path, $hash);
262             }
263              
264             package Kwiki::Pages;
265              
266             __DATA__