#! @PERL@ -w # vim:syntax=perl use strict; use lib '@LR_PERL5LIBDIR@'; use Locale::TextDomain qw/lire/; use Lire::Logger; use Lire::Config; use Lire::Config::SpecParser; use Lire::Error qw/ an_error_occured /; use Lire::DlfSchema; use Lire::ReportSpec; use Lire::FilterSpec; use Lire::ReportConfig; use Lire::XMLSpecI18N; use Lire::PluginManager; use Getopt::Long; use Lire::Utils qw/file_content/; sub usage { lr_err( @_, __( "Usage: lr_spec2pot [--cfgspecdir ]* [--reportsdir ]* [--filtersdir ]* [--pluginsdir ]* [--schemasdir ]* +\n" ) ); } sub setup_cfg_paths { my $specdirs = $_[0]; # Clear the spec path foreach my $dir ( Lire::Config->config_spec_path() ) { Lire::Config->del_config_spec_path_dir( $dir ); } foreach my $dir ( @$specdirs ) { Lire::Config->add_config_spec_path_dir( $dir ); } Lire::Config->init(); return; } sub setup_cfg_var { my ( $listname, $varname, $dirs ) = @_; return unless defined $dirs; my $path = Lire::Config->get_var( $listname ); my $dir_spec = $path->spec()->get( $varname ); # Clear the path $path->clear(); # Adds the new dirs foreach my $dir ( @$dirs ) { $path->append( $dir_spec->instance( 'value' => $dir ) ); } return; } sub setup_plugins { my ( $pluginsdirs ) = @_; return unless $pluginsdirs; foreach my $dir ( @$pluginsdirs ) { opendir my $dh, $dir or die( "opendir '$dir' failed: $!\n" ); foreach my $basename ( readdir $dh ) { next unless $basename =~ /_init$/; eval file_content( "$dir/$basename" ); die( "error loading '$dir/$basename': $@\n" ) if $@; } closedir $dh; my $parser = new Lire::Config::SpecParser(); $parser->{'_spec'} = Lire::Config->config_spec(); $parser->merge_specifications_dir( "$dir" ); } } sub load_templates { my $file = $_[0]; my $parser = new Lire::Config::SpecParser(); my $spec = $parser->parsefile( $file ); my @templates = (); foreach my $comp ( $spec->components() ) { my $cfg = $comp->instance()->as_value(); $cfg->filename( $file ); push @templates, $cfg; } return @templates; } sub load_spec { my $spec = $_[0]; if ( $spec =~ /^filter:(.*?):(.*)/ ) { return Lire::FilterSpec->load( $1, $2 ); } elsif ( $spec =~ /^report:(.*?):(.*)/ ) { return Lire::ReportSpec->load( $1, $2 ); } elsif ( $spec =~ /^report_cfg:(.+)/ ) { return load_templates( $1 ); } elsif ( $spec =~ /^schema:(.*)/ ) { return Lire::DlfSchema::load_schema( $1 ); } elsif ( $spec =~ /^config_spec:(.*)/ ) { my $file = $1; my $parser = new Lire::Config::SpecParser(); $parser->merge_specification( $file ); my $obj = $parser->configspec(); $obj->xml_file( $file ); return $obj; } else { die __( "specs are strings of the form schema:, filter::, report::, config_spec: or report_cfg:\n" ); } } my %opts = (); my $success = GetOptions( \%opts, 'cfgspecdir=s@', 'reportsdir=s@', 'filtersdir=s@', 'schemasdir=s@', 'pluginsdir=s@' ); setup_cfg_paths( $opts{'cfgspecdir'} ) if ( defined $opts{'cfgspecdir'} ); usage() unless $success; usage( "missing one or more spec arguments\n" ) unless @ARGV; # Since this script is used from the source tree before any Lire installation # exists, we cannot 'use' Lire::Program. Otherwise it will try to parse the # not-yet installed configuration files. require Lire::Program; eval { setup_cfg_var( 'lr_schemas_path', 'schemas', $opts{'schemasdir'} ); setup_cfg_var( 'lr_reports_path', 'reports', $opts{'reportsdir'} ); setup_cfg_var( 'lr_filters_path', 'filters', $opts{'filtersdir'} ); setup_plugins( $opts{'pluginsdir'} ); }; lr_err( an_error_occured( $@ ) ) if $@; my @specs = (); foreach my $spec ( @ARGV ) { eval { push @specs, load_spec( $spec ); }; lr_warn( __x( "Error loading spec '{spec}': {error}", 'spec' => $spec, 'error' => $@ ) ) if $@; } eval { my $extractor = new Lire::XMLSpecI18N( @specs ); $extractor->generate_catalog(); }; lr_err( an_error_occured( $@ ) ) if $@; # Local Variables: # mode: cperl # End: __END__ =pod =head1 NAME lr_spec2pot - extracts strings for L10N from Lire XML specifications =head1 SYNOPSIS FIXME =head1 DESCRIPTION FIXME =head1 VERSION $Id: lr_spec2pot.in,v 1.7 2006/07/23 13:16:33 vanbaal Exp $ =head1 AUTHORS Francis J. Lacoste Wolfgang Sourdeau =head1 COPYRIGHT Copyright (C) 2004 Stichting LogReport Foundation LogReport@LogReport.org This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program (see COPYING); if not, check with http://www.gnu.org/copyleft/gpl.html. =cut