aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/WebCoso/Step/Base.pm1
-rw-r--r--lib/WebCoso/Step/ReST/SplitLang.pm80
2 files changed, 80 insertions, 1 deletions
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;