package Pangloss::IO::YAML; use strict; use warnings; use YAML qw( LoadFile Dump ); use Error qw( :try ); use File::Spec; use Data::Random qw( rand_words rand_chars ); use Pangloss::Users; use Pangloss::Terms; use Pangloss::Concepts; use Pangloss::Languages; use Pangloss::Categories; use base qw( Pangloss::Object ); use accessors qw( languages categories users concepts terms ); our $VERSION = ((require Pangloss::Version), $Pangloss::VERSION)[1]; our $REVISION = (split(/ /, ' $Revision: 1.5 $ '))[2]; sub init { my $self = shift; $self->languages( Pangloss::Languages->new ) ->categories( Pangloss::Categories->new ) ->users( Pangloss::Users->new ) ->concepts( Pangloss::Concepts->new ) ->terms( Pangloss::Terms->new ); return $self; } #------------------------------------------------------------------------------ # Save/Load sub save { my $self = shift; die $self->class . "->save() not yet implemented!"; } sub load { my $self = shift; my $file = shift || return; $self->{yaml_db} = LoadFile( $file ); return $self->parse_db; } #------------------------------------------------------------------------------ # YAML DB parser sub parse_db { my $self = shift; my $db = shift || $self->{yaml_db}; $self->emit( "parsing yaml database..." ); my $src_lang = $self->get_or_create_source_lang; foreach my $concept (keys %$db) { $self->emit( "parsing concept '$concept'..." ); my $c = $self->get_or_create_concept( $concept ); my $ct = $self->create_term( $c->key, $concept, $src_lang->key ) unless exists $db->{$concept}->{$src_lang->key}; foreach my $lang (keys %{ $db->{$concept} }) { my $term = $db->{$concept}->{$lang}; my $l = $self->get_or_create_lang( $lang ); my $t = $self->create_term( $c->key, $term, $l->key ); } } return $self; } sub get_or_create_source_lang { my $self = shift; # we assume the db was written in english... # prolly a bad assumption, but it can be changed down the line. return $self->get_or_create_lang( 'en', 'English' ); } sub get_or_create_lang { my $self = shift; my $key = shift; my $name = shift; return $self->languages->get( $key ) if $self->languages->exists( $key ); my $l = Pangloss::Language->new ->iso_code( $key ) ->creator( 'admin' ) ->name( $name ) ->date( time ); $self->languages->add( $l ); # die on error return $l; } sub get_or_create_concept { my $self = shift; my $concept = shift; return $self->concepts->get( $concept ) if $self->concepts->exists( $concept ); my $c = Pangloss::Concept->new ->name( $concept ) ->creator( 'admin' ) ->date( time ); $self->concepts->add( $c ); # die on error return $c; } sub create_term { my $self = shift; my $concept = shift; my $name = shift; my $lang = shift; my $ct = Pangloss::Term->new ->language( $lang ) ->concept( $concept ) ->name( $name ) ->creator( 'admin' ) ->date( time ); try { $self->terms->add( $ct ); return $ct; } catch Error with { warn 'error creating "' . $ct->key . '" - ' . shift() . "\n"; }; return; } 1;