diff options
-rw-r--r-- | lib/LXRng/Index/DBI.pm | 21 | ||||
-rw-r--r-- | lib/LXRng/Web.pm | 9 |
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/LXRng/Index/DBI.pm b/lib/LXRng/Index/DBI.pm index 55e215d..8fcb391 100644 --- a/lib/LXRng/Index/DBI.pm +++ b/lib/LXRng/Index/DBI.pm @@ -535,6 +535,27 @@ sub set_rfile_charset { return $sth->execute($charset, $rfile_id); } +sub get_file_charset { + my ($self, $tree, $path, $rel) = @_; + + my $dbh = $self->dbh; + my $pre = $self->prefix; + my $rel_id = $self->release_id($tree, $rel); + return undef unless $rel_id; + my $rfile_id = $self->_get_rfile_by_release($rel_id, $path); + return undef unless $rfile_id; + + my $sth = $$self{'sth'}{'get_file_charset'} ||= + $dbh->prepare(qq{select c.name + from ${pre}revisions r, ${pre}charsets c + where r.id = ? and r.body_charset = c.id}); + my $charset; + if ($sth->execute($rfile_id) > 0) { + ($charset) = $sth->fetchrow_array(); + } + $sth->finish(); + return $charset; +} sub get_rfile_timestamp { my ($self, $rfile_id) = @_; diff --git a/lib/LXRng/Web.pm b/lib/LXRng/Web.pm index 9e9e24a..5b11a2d 100644 --- a/lib/LXRng/Web.pm +++ b/lib/LXRng/Web.pm @@ -132,6 +132,15 @@ sub print_markedup_file { my $handle = $node->handle(); LXRng::Lang->init($context); + my $index = $context->config->{'index'}; + my $charset = $index->get_file_charset($context->tree, $node->name, + $context->release); + $charset ||= 'ascii'; + + binmode($handle, ":encoding($charset)"); + binmode(STDOUT, ":encoding(utf-8)"); + binmode($cache, ":encoding(utf-8)") if $cache; + my $lang = LXRng::Lang->new($node); my $parse = LXRng::Parse::Simple->new($handle, 8, @{$lang->parsespec}); |