App-WIoZ
view release on metacpan or search on metacpan
lib/App/WIoZ.pm view on Meta::CPAN
use strict;
use warnings;
package App::WIoZ;
{
$App::WIoZ::VERSION = '0.004';
}
#use feature 'say';
use Moose;
use Color::Mix;
use Cairo;
use Math::PlanePath::HilbertCurve;
use Graphics::ColorNames;
use App::WIoZ::Point;
use App::WIoZ::Word;
# ABSTRACT: App::WIoZ create a SVG or PNG image of a word cloud from a simple text file
=head1 NAME - App::WIoZ
App::WIoZ - a perl word cloud generator
=head1 VERSION
version 0.004
=head1 DESCRIPTION
App::WIoZ can create a SVG or PNG image of a word cloud from a simple text file with C<word;weight>.
App::WIoZ is an acronym for "Words for Io by Zeus", look for the Correggio painting to watch the cloud.
App::WIoZ is based on C<Wordle> strategy and C<yawc> perl clone.
Usage:
my $File = 'words.txt';
my $wioz = App::WIoZ->new(
font_min => 18, font_max => 64,
set_font => "DejaVuSans,normal,bold",
filename => "testoutput",
basecolor => '226666'); # violet
if (-f $File) {
my @words = $wioz->read_words($File);
$wioz->do_layout(@words);
}
else {
$wioz->chg_font("LiberationSans,normal,bold");
$wioz->update_colors('testoutput.sl.txt');
}
watch C<doc/freq.pl> to create a C<words.txt> file.
=head1 STATUS
App::WIoZ is actually a POC to play with Moose, Cairo or Math::PlanePath.
The use of an Hilbert curve to manage free space is for playing with Math::PlanePath modules.
Performance can be improved in free space matching, or in spiral strategy to find free space.
Max and min font sizes can certainly be computed.
Feel free to clone this project on GitHub.
=head1 SETTINGS
=head2 height
image height, default to 600
=cut
has 'height' => (
is => 'ro', isa => 'Int', default => 600
);
=head2 width
image width, default to 800
=cut
has 'width' => (
is => 'ro', isa => 'Int', default => 800
);
has 'center' => (
is => 'ro', isa => 'App::WIoZ::Point',
lazy => 1,
default => sub {
my $self = shift;
return App::WIoZ::Point->new(
x => int($self->width/2),
y => int($self->height/2));
}
);
=head2 font_min, font_max
required min and max font size
=cut
has ['font_min','font_max'] => (
is => 'ro', required => 1, isa => 'Int'
);
=head2 set_font, chg_font, font
accessors for font name, type and weight
C<set_font> : set font in new WIoZ object, default is C<'LiberationSans,normal,bold'>
C<chg_font> : change font
C<font> : read font object
Usage :
$wioz = App::WIoZ->new( font_min => 18, font_max => 64,
set_font => 'DejaVuSans,normal,bold');
$fontname = $wioz->font->{font};
$wioz->chg_font('LiberationSans,normal,bold');
=cut
has 'font' => (
isa => 'HashRef',
is => 'ro', lazy => 1,
writer => 'chg_font',
builder => '_set_font'
);
# for font builder
has 'set_font' => ( is => 'rw',isa => 'Str' );
sub _set_font {
my ($self,$font) = @_;
my ($fname,$ftype,$fweight) = split ',', ($self->set_font || ',,');
return ( { font => $fname || 'LiberationSans',
type => $ftype || 'normal',
weight => $fweight || 'bold' });
};
# for font change
around 'chg_font' => sub {
my ($next,$self,$font) = @_;
my ($fname,$ftype,$fweight) = split ',', $font;
$self->$next( {font => $fname, type => $ftype, weight => $fweight});
};
has 'backcolor' => (
is => 'ro', isa => 'Str',
default => 'white'
);
has 'cr' => (
is => 'rw', isa => 'Cairo::Context',
lazy => 1, builder => '_create_cr'
);
has 'surface' => (
is => 'rw', isa => 'Cairo::ImageSurface',
);
has 'svgsurface' => (
is => 'rw', isa => 'Cairo::SvgSurface',
);
=head2 filename
file name output, extension C<.png> or C<.svg> will be added
=cut
has 'filename' => (
is => 'rw', isa => 'Str',
);
=head2 svg
produce a svg output, default value
set to 0 to write a png
=cut
has 'svg' => (
is => 'ro', isa => 'Int', default => 1
);
has 'fcurve' => (
is => 'rw', isa => 'Math::PlanePath',
);
=head2 scale
Scale for the Hilbert Curve granularity default to 10
Higer value produces better speed but more words recovery.
=cut
( run in 1.802 second using v1.01-cache-2.11-cpan-39bf76dae61 )