Aard
view release on metacpan or search on metacpan
lib/Aard.pm view on Meta::CPAN
use constant HEADER_SPEC => [
[signature => 'Z4' , 4 ],
[sha1sum => 'Z40', 40],
[version => 'S>' , 2 ],
[uuid => 'Z16', 16],
[volume => 'S>' , 2 ],
[total_volumes => 'S>' , 2 ],
[meta_length => 'L>' , 4 ],
[index_count => 'L>' , 4 ],
[article_offset => 'L>' , 4 ],
[index1_item_format => 'Z4' , 4 ],
[key_length_format => 'Z2' , 2 ],
[article_length_format => 'Z2' , 2 ],
];
my $header_length = sum map { $_->[2] } @{HEADER_SPEC()};
sub decompress {
my ($input) = @_;
my $output = $input;
inflate \$input => \$output;
bunzip2 \$input => \$output if $input =~ /^BZ/;
$output
}
sub read_at {
my ($self, $offset, $length) = @_;
my $fh = $self->{fh};
my $part;
seek $fh, $offset, 0;
read $fh, $part, $length;
$part
}
sub index1 {
my ($self, $index) = @_;
unless (exists $self->{index1}{$index}) {
my $part = $self->read_at($self->{index1_offset} + $index * $self->{index_length}, $self->{index_length});
$self->{index1}{$index} = [unpack $self->{index_format}, $part]
}
$self->{index1}{$index}
}
sub fh { shift->{fh} }
sub sha1sum { shift->{sha1sum} }
sub uuid { shift->{uuid} }
sub uuid_string { uuid_to_string shift->uuid }
sub volume { shift->{volume} }
lib/Aard.pm view on Meta::CPAN
sub title { shift->meta->{title} }
sub version { shift->meta->{version} }
sub description { shift->meta->{description} }
sub copyright { shift->meta->{copyright} }
sub license { shift->meta->{license} }
sub source { shift->meta->{source} }
sub key {
my ($self, $index) = @_;
unless (exists $self->{key}{$index}) {
my $part = $self->read_at($self->{index2_offset} + $self->index1($index)->[0], 2);
my $len = unpack 'S>', $part;
read $self->{fh}, $self->{key}{$index}, $len;
}
$self->{key}{$index}
}
sub article {
my ($self, $index) = @_;
unless (exists $self->{article}{$index}) {
my $part = $self->read_at($self->{article_offset} + $self->index1($index)->[1], 4);
my $len = unpack 'L>', $part;
read $self->{fh}, $part, $len;
$self->{article}{$index} = decompress $part
}
$self->{article}{$index}
}
sub new {
my ($self, $file) = @_;
open my $fh, '<', $file or die $!;
lib/Aard.pm view on Meta::CPAN
read $fh, my $meta, $header{meta_length};
$meta = decode_json decompress $meta;
my %obj = (
%header,
fh => $fh,
meta => $meta,
index_format => ($header{index1_item_format} eq '>LL' ? 'L>L>' : 'L>Q>'),
index_length => ($header{index1_item_format} eq '>LL' ? 8 : 12),
);
$obj{index1_offset} = $header_length + $obj{meta_length};
$obj{index2_offset} = $obj{index1_offset} + $obj{index_count} * $obj{index_length};
bless \%obj, $self
}
1;
__END__
=head1 NAME
Aard - Read aarddict dictionaries
( run in 0.481 second using v1.01-cache-2.11-cpan-49f99fa48dc )