package WebCoso::Step::ReST::SplitLang;
use strict;
use warnings;
use base 'WebCoso::Step';
use Class::Std;
{
my %srckey_of :ATTR(:init_arg<from> :get<srckey> :default<datastream>);
my %dstkey_of :ATTR(:init_arg<to> :get<dstkey> :default<rstdoc>);
my $lang_re=qr{^\s*\.\.\s+lang::(?:\s+(\w+))?\s*$};
sub process {
my ($self,$resource,$stage)=@_;
return unless $stage eq 'meta';
my $srckey=$self->get_srckey();
my $dstkey=$self->get_dstkey();
my $fh=$resource->get_property_fh($srckey);
if (!defined $fh) {
my ($filename)=$resource->get_axis_values('filename');
$fh=$resource->get_property_fh({filename=>$filename},$srckey);
}
binmode $fh,':utf8';
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) {
my $curlang='';my %docs=();
while (my $line=<$fh>) {
if ($line =~ m{$lang_re}) {
$curlang=$1||'';
next;
}
if ($curlang) {
$docs{$curlang}.=$line;
}
else {
$docs{$_}.=$line for keys %langs;
}
}
$resource->set_property({language=>$_},$dstkey=>$docs{$_})
for keys %langs;
}
else {
$resource->set_property($dstkey=>$fh);
}
seek $fh,0,0;
return;
}
}
1;