From db452b9c13b515ebbac72e30019bba6e46131544 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sun, 5 Feb 2006 12:06:03 +0000 Subject: step di split lingue per ReST git-svn-id: svn://luxion/repos/WebCoso/trunk@153 fcb26f47-9200-0410-b104-b98ab5b095f3 --- Build.PL | 1 + lib/WebCoso/Step/Base.pm | 1 - lib/WebCoso/Step/ReST/SplitLang.pm | 80 ++++++++++++++++++++++++++++++++ t/steps/rest-splitlang.t | 94 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 lib/WebCoso/Step/ReST/SplitLang.pm create mode 100644 t/steps/rest-splitlang.t diff --git a/Build.PL b/Build.PL index f14742c..aaaf0dc 100644 --- a/Build.PL +++ b/Build.PL @@ -12,5 +12,6 @@ my $build=Module::Build->new( build_requires => { Test::More => 0, }, + recusive_test_files => 1, ); $build->create_build_script(); diff --git a/lib/WebCoso/Step/Base.pm b/lib/WebCoso/Step/Base.pm index 6a21932..8e73705 100644 --- a/lib/WebCoso/Step/Base.pm +++ b/lib/WebCoso/Step/Base.pm @@ -3,6 +3,5 @@ use strict; use warnings; use Class::Std; use WebCoso::X; -use WebCoso::Step; 1; diff --git a/lib/WebCoso/Step/ReST/SplitLang.pm b/lib/WebCoso/Step/ReST/SplitLang.pm new file mode 100644 index 0000000..a24e55e --- /dev/null +++ b/lib/WebCoso/Step/ReST/SplitLang.pm @@ -0,0 +1,80 @@ +package WebCoso::Step::ReST::SplitLang; +use strict; +use warnings; +use base 'WebCoso::Step'; +use Class::Std; + +{ + +=head2 Che fa + +Prende il sorgente da {filename=>'sperosiaunosolo'}->datastream, cerca +righe della forma + + ^\s*.. lang:: (\w*) + +raccoglie tutti i C<$1>, e quelle sono le lingue (C<''> sta per 'tutte +le lingue') + +Splitta poi in {language=>'$1'}->rstdoc (stringhe) + +Fa tutto alla prima passata + +=cut + +my $lang_re=qr{^\s*\.\.\s+lang::(?:\s+(\w+))?\s*$}; + +sub process { + my ($self,$resource,$stage)=@_; + + return unless $stage eq 'meta'; + + my $fh=$resource->get_property('datastream'); + if (!defined $fh) { + my ($filename)=$resource->get_axis_values('filename'); + $fh=$resource->get_property({filename=>$filename},'datastream'); + } + + # raccolgo le lingue usate + my %langs=(''=>undef); + seek $fh,0,0; + while (my $line=<$fh>) { + if ($line =~ m{$lang_re}) { + $langs{$1||''}=undef; + } + } + delete $langs{''}; + seek $fh,0,0; + + if (%langs) { # multilingua: split! + my $curlang='';my %docs=(); + while (my $line=<$fh>) { + if ($line =~ m{$lang_re}) { + $curlang=$1||''; + next; + } + if ($curlang) { + $docs{$curlang}.=$line; + } + else { # 'any', per cui scrivo su tutti + $docs{$_}.=$line for keys %langs; + } + } + # salvo + $resource->set_property({language=>$_},rstdoc=>$docs{$_}) + for keys %langs; + } + else { # monolingua: cat + local $/; + $resource->set_property(rstdoc=> scalar <$fh>); + } + + # rimetto a posto il filehandle + seek $fh,0,0; + + return; +} + +} + +1; diff --git a/t/steps/rest-splitlang.t b/t/steps/rest-splitlang.t new file mode 100644 index 0000000..c964b1c --- /dev/null +++ b/t/steps/rest-splitlang.t @@ -0,0 +1,94 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Path::Class; +use Test::More 'no_plan'; +use Test::Differences; +use WebCoso::Resource; + +BEGIN {use_ok('WebCoso::Step::ReST::SplitLang')} +my $step=WebCoso::Step::ReST::SplitLang->new(); + +sub make_res { + my ($rst_doc)=@_; + + my $resource=WebCoso::Resource->new(); + open my $rst_fh,'<',\$rst_doc; + $resource->set_property({filename=>'mydoc.rest.txt'},datastream=>$rst_fh); + + return $resource; +} + +my $resource=make_res(<<'END_REST'); +riga comune +.. lang:: +ancora comune +.. lang:: it +italiano +.. lang:: en +inglese + .. lang:: + any nested +.. lang:: it +italiano ancora +.. lang:: +comune (con spazi) +END_REST + + +$step->process($resource,'gen'); +is_deeply([$resource->get_axes()], + ['filename'], + 'no action on second pass'); + +$step->process($resource,'meta'); + +is_deeply([sort $resource->get_axes()], + ['filename','language'], + 'action on first pass'); +is_deeply([sort $resource->get_axis_values('language')], + ['en','it'], + 'lingue giuste'); +eq_or_diff($resource->get_property({language=>'it'},'rstdoc'),<<'END_REST_IT','italiano'); +riga comune +ancora comune +italiano + any nested +italiano ancora +comune (con spazi) +END_REST_IT + +eq_or_diff($resource->get_property({language=>'en'},'rstdoc'),<<'END_REST_EN','inglese'); +riga comune +ancora comune +inglese + any nested +comune (con spazi) +END_REST_EN + +my $rst_doc=<<'END_REST'; +tutto a comune +monolingua +END_REST + +$resource=make_res($rst_doc); + +$step->process($resource,'meta'); +is_deeply([$resource->get_axes()], + ['filename'], + 'monolingua'); +eq_or_diff($resource->get_property('rstdoc'),$rst_doc,'monolingua cat'); + +$rst_doc=<<'END_REST'; +.. lang:: +tutto a comune +monolingua +END_REST + +$resource=make_res($rst_doc); + +$step->process($resource,'meta'); +is_deeply([$resource->get_axes()], + ['filename'], + 'monolingua 2'); +eq_or_diff($resource->get_property('rstdoc'),$rst_doc,'monolingua 2 cat'); -- cgit v1.2.3