aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@luxion>2006-02-05 12:06:03 +0000
committerdakkar <dakkar@luxion>2006-02-05 12:06:03 +0000
commitdb452b9c13b515ebbac72e30019bba6e46131544 (patch)
treeba5d140124823a118ed3f0a18650e40d5419fc09
parentspostate le collection fuori da config:: (diff)
downloadWebCoso-db452b9c13b515ebbac72e30019bba6e46131544.tar.gz
WebCoso-db452b9c13b515ebbac72e30019bba6e46131544.tar.bz2
WebCoso-db452b9c13b515ebbac72e30019bba6e46131544.zip
step di split lingue per ReST
git-svn-id: svn://luxion/repos/WebCoso/trunk@153 fcb26f47-9200-0410-b104-b98ab5b095f3
-rw-r--r--Build.PL1
-rw-r--r--lib/WebCoso/Step/Base.pm1
-rw-r--r--lib/WebCoso/Step/ReST/SplitLang.pm80
-rw-r--r--t/steps/rest-splitlang.t94
4 files changed, 175 insertions, 1 deletions
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');