summaryrefslogtreecommitdiffstats
path: root/lib/Locale/Po4a/Yaml.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Locale/Po4a/Yaml.pm')
-rw-r--r--lib/Locale/Po4a/Yaml.pm160
1 files changed, 160 insertions, 0 deletions
diff --git a/lib/Locale/Po4a/Yaml.pm b/lib/Locale/Po4a/Yaml.pm
new file mode 100644
index 0000000..919c40c
--- /dev/null
+++ b/lib/Locale/Po4a/Yaml.pm
@@ -0,0 +1,160 @@
+# Locale::Po4a::Yaml -- Convert yaml files to PO file, for translation.
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the terms of GPL v2.0 or later (see COPYING).
+#
+
+=encoding UTF-8
+
+=head1 NAME
+
+Locale::Po4a::Yaml - convert YAML files from/to PO files
+
+=head1 DESCRIPTION
+
+Locale::Po4a::Yaml is a module to help the translation of Yaml files into other
+[human] languages.
+
+The module extracts the value of YAML hashes and arrays. Hash keys are
+not extracted.
+
+NOTE: This module parses the YAML file with YAML::Tiny.
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+These are this module's particular options:
+
+=over
+
+=item B<keys>
+
+Space-separated list of hash keys to process for extraction, all
+other keys are skipped. Keys are matched with a case-sensitive match.
+If B<paths> and B<keys> are used together, values are included if they are
+matched by at least one of the options.
+Arrays values are always returned unless the B<skip_array> option is
+provided.
+
+=item B<paths>
+
+Comma-separated list of hash paths to process for extraction, all
+other paths are skipped. Paths are matched with a case-sensitive match.
+If B<paths> and B<keys> are used together, values are included if they are
+matched by at least one of the options.
+Arrays values are always returned unless the B<skip_array> option is
+provided.
+
+=item B<skip_array>
+
+Do not translate array values.
+
+=back
+
+=head1 SEE ALSO
+
+L<Locale::Po4a::TransTractor(3pm)>, L<po4a(7)|po4a.7>
+
+=head1 AUTHORS
+
+ Brian Exelbierd <bex@pobox.com>
+
+=head1 COPYRIGHT AND LICENSE
+
+ Copyright © 2017 Brian Exelbierd.
+ Copyright © 2022 Martin Quinson <mquinson#debian.org>.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL v2.0 or later (see the COPYING file).
+
+=cut
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+package Locale::Po4a::Yaml;
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+use YAML::Tiny;
+use Scalar::Util;
+use Encode;
+
+use 5.16.0;
+use strict;
+use warnings;
+
+require Exporter;
+
+use vars qw(@ISA @EXPORT $AUTOLOAD);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw();
+
+my %yfm_keys = ();
+my %yfm_paths = ();
+
+sub initialize {
+ my $self = shift;
+ my %options = @_;
+
+ $self->{options}{'keys'} = '';
+ $self->{options}{'paths'} = '';
+ $self->{options}{'debug'} = 0;
+ $self->{options}{'verbose'} = 1;
+ $self->{options}{'skip_array'} = 0;
+
+ foreach my $opt ( keys %options ) {
+ die wrap_mod( "po4a::yaml", dgettext( "po4a", "Unknown option: %s" ), $opt )
+ unless exists $self->{options}{$opt};
+ $self->{options}{$opt} = $options{$opt};
+ }
+
+ map {
+ $_ =~ s/^\s+|\s+$//g; # Trim the keys before using them
+ $yfm_keys{$_} = 1
+ } ( split( /[, ]/, $self->{options}{keys} ) );
+
+ # map { print STDERR "key: '$_'\n"; } (keys %yfm_keys);
+
+ map {
+ $_ =~ s/^\s+|\s+$//g; # Trim the keys before using them
+ $yfm_paths{$_} = 1
+ } ( split( /,/, $self->{options}{paths} ) );
+}
+
+sub parse {
+ my $self = shift;
+ my $yfm;
+
+ # Get the ref of the first line. We'll use it as the ref for the whole doc
+ my ( $line, $ref ) = $self->shiftline();
+ $self->unshiftline( $line, $ref );
+
+ while (1) {
+ my ( $nextline, $nextref ) = $self->shiftline();
+
+ if ( not defined($nextline) ) {
+ last;
+ } elsif ( $nextline =~ /: [\[\{]/ ) {
+ die wrap_mod(
+ "po4a::text",
+ dgettext(
+ "po4a",
+ "Inline lists and dictionaries on a single line are not correctly handled the parser we use (YAML::Tiny): they are interpreted as regular strings. "
+ . "Please use multi-lines definitions instead. Offending line:\n %s"
+ ),
+ $nextline
+ );
+ }
+
+ $yfm .= $nextline;
+ }
+
+ my $yamlarray = YAML::Tiny->read_string($yfm)
+ || die "YAML::Tiny failed to parse the content of $ref: $!";
+
+ $self->handle_yaml( 0, $ref, $yamlarray, \%yfm_keys, $self->{options}{skip_array}, \%yfm_paths );
+}
+
+1;
+__END__