Bryar
view release on metacpan or search on metacpan
lib/Bryar/DataSource/FlatFile.pm view on Meta::CPAN
=head2 file_to_id
Vice versa.
=cut
sub id_to_file { return $_[1].".txt" }
sub file_to_id { my $file = $_[1]; $file =~ s/.txt$//; $file; }
=head2 search
$self->search($bryar, $config, %params)
A more advanced search for specific documents
=cut
sub search {
my ($self, $config, %params) = @_;
croak "Must pass in a Bryar::Config object" unless UNIVERSAL::isa($config, "Bryar::Config");
my $was = getcwd;
my $where = $config->datadir."/";
if ($params{subblog}) { $where .= $params{subblog}; }
chdir($where); # Damn you, F::F::R.
my $find = File::Find::Rule->file();
if ($params{id}) { $find->name($self->id_to_file($params{id})) }
else { $find->name($self->entry_glob) }
$find->maxdepth($config->depth);
if ($params{since}) { $find->mtime(">".$params{since}) }
if ($params{before}) { $find->mtime("<".$params{before}) }
my @docs;
local $/;
if ($params{content}) { $find->grep(qr/\b\Q$params{content}\E\b/i) }
@docs = sort { $b->epoch() <=> $a->epoch() } grep { $_->epoch() <= time () } map { $self->make_document($_) } $find->in(".");
$params{limit} ||= @docs;
chdir($was);
return grep { defined } @docs[0..$params{limit}-1];
}
=head2 make_document
Turns a filename into a C<Bryar::Document>, by parsing the file
blosxom-style.
=cut
sub make_document {
my ($self, $file) = @_;
return unless $file;
open(my($in), '<:utf8', $file) or return;
my $when = (stat $in)[9];
local $/ = "\n";
my $fileuid = (stat _)[4];
my $who;
if (exists $UID_Cache{$fileuid}) {
$who = $UID_Cache{$fileuid};
} else {
$who = $UID_Cache{$fileuid} = getpwuid($fileuid);
}
my $title = <$in>;
chomp $title;
local $/;
my $content = <$in>;
close $in;
my $id = $self->file_to_id($file);
my $comments = [];
$comments = [_read_comments($id, $id.".comments") ]
if -e $id.".comments";
my $dir = dirname($file);
$dir =~ s{^\./?}{};
my $category = $dir || "main";
return Bryar::Document->new(
title => $title,
content => $content,
epoch => $when,
author => $who,
id => $id,
category => $category,
comments => $comments
);
}
sub _read_comments {
my ($id, $file) = @_;
open(COMMENTS, '<:utf8', $file) or die $!;
local $/;
# Watch carefully
my $stuff = <COMMENTS>;
my @rv;
for (split /-----\n/, $stuff) {
push @rv,
Bryar::Comment->new(
id => $id,
map {/^(\w+): (.*)/; $1 => $2 } split /\n/, $_
)
}
return @rv;
}
=head2 add_comment
Class->add_comment($bryar,
document => $doc,
author => $author,
url => $url,
content => $content );
Records the given comment details.
=cut
sub add_comment {
my ($self, $config) = (shift, shift);
my %params = @_;
s/\n/\r/g for values %params;
( run in 0.575 second using v1.01-cache-2.11-cpan-39bf76dae61 )