imgtools/imaker/buildrom_plugins/localise_all_resources.pm
changeset 2 39c28ec933dd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/localise_all_resources.pm	Mon May 10 19:54:49 2010 +0100
@@ -0,0 +1,477 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Adds a LOCALISE macro that enables configuration of localised files.
+# The localised language selection is done with a ADD_LANGUAGE macro.
+#
+
+
+
+###############################################################################
+#
+# Syntax: LOCALISE
+#   type=LOCALISE(source, target[, languages])
+#   source => the source file. The section that needs to be localised should be marked with ??.
+#   target => the target file. The section that needs to be localised should be marked with ??.
+#   languages => a space delimited list of language codes
+#
+# Syntax: ADD_LANGUAGE
+#   ADD_LANGUAGE lang
+#
+# Example:
+# Add languages
+# ADD_LANGUAGE 01
+# ADD_LANGUAGE 02
+# ADD_LANGUAGE 03
+#
+# Use Case 1:
+# Localises a App resoure file.
+#   data=LOCALISE(APP_RESOURCE_DIR\App.r??, RESOURCE_DIR\app.r??)
+# Output:
+#   data=APP_RESOURCE_DIR\App.r01 RESOURCE_DIR\app.r01
+#   data=APP_RESOURCE_DIR\App.r02 RESOURCE_DIR\app.r02
+#   data=APP_RESOURCE_DIR\App.r03 RESOURCE_DIR\app.r03
+#
+# Use Case 2:
+# Localise all resource files under a section
+# ADD_LANGUAGE 01
+# ADD_LANGUAGE 02
+# ADD_LANGUAGE 03
+#
+# LOCALISE_ALL_RESOURCES_BEGIN
+# // All resource files will be localised
+# data=APP_RESOURCE_DIR\App.rsc RESOURCE_DIR\app.rsc
+# data=APP_RESOURCE_DIR\App2.rsc RESOURCE_DIR\app2.rsc
+# LOCALISE_ALL_RESOURCES_END
+# Output:
+#   data=APP_RESOURCE_DIR\App.r01 RESOURCE_DIR\app.r01
+#   data=APP_RESOURCE_DIR\App.r02 RESOURCE_DIR\app.r02
+#   data=APP_RESOURCE_DIR\App.r03 RESOURCE_DIR\app.r03
+#   data=APP_RESOURCE_DIR\App.r01 RESOURCE_DIR\app.r01
+#   data=APP_RESOURCE_DIR\App.r02 RESOURCE_DIR\app.r02
+#   data=APP_RESOURCE_DIR\App.r03 RESOURCE_DIR\app.r03
+#
+###############################################################################
+
+#
+# Version 4
+# Path corrections to widget support.
+#
+# Version 3
+# Support for Idle widgets.
+#
+# Version 2
+# Localises also *.hlp to *.h%s.
+#
+# Version 1
+# Initial version.
+
+
+package localise_all_resources;
+use strict;
+
+BEGIN
+  {
+  use Exporter ();
+  our ( $VERSION, @ISA, @EXPORT );
+  # set the version for version checking
+  $VERSION     = 1.00;
+
+  @ISA         = qw( Exporter );
+  @EXPORT      = qw( &localise_all_resources_info
+                     &do_localise_all_resources_extension
+                     &is_localise_all_resources_begin
+                     &is_localise_all_resources_end
+                     &is_resource_entry
+                     &is_help_entry_xhtml
+                     &is_help_entry_hlp
+                     &is_dtd_entry
+                     &is_active_idle_entry
+                     &is_elocl_entry
+                     &get_type_from_entry
+                     &get_source_from_entry
+                     &get_target_from_entry
+                     &create_localise_entry_from_resource
+                     &create_localise_entry_from_help
+                     &create_localise_entry_from_dtd
+                     &create_localise_entry_from_active_idle
+                     &create_localise_entry_from_elocl
+                      );
+  }
+
+my %localise_all_resources_infostruct =
+  (
+  name => "localise_all_resources",
+  invocation => "InvocationPoint1",
+  single => "localise_all_resources::do_localise_all_resources_extension"
+  );
+
+my $line;
+my @newobydata;
+my %languages;
+my $verbose=0;
+my $errors=0;
+my $localise_all_resource=0;
+
+sub localise_all_resources_info
+  {
+  return \%localise_all_resources_infostruct;
+  }
+
+# Entry point for the plugi
+sub do_localise_all_resources_extension
+{
+  print "========================== Begin localise_all_resources =======================\n" if $verbose;
+  my $obydata = shift;
+
+  undef @newobydata;
+  foreach $line (@{$obydata})
+  {
+    # Ignore REM statements, to avoid processing "REM __SCALABLE_IMAGE( ... )"
+    if ($line =~ /^\s*REM/i)
+    {
+      push @newobydata, $line;
+      next;
+    }
+    # LOCALISE_ALL_RESOURCES_BEGIN
+    if (is_localise_all_resources_begin($line))
+    {
+      $localise_all_resource = 1;
+      push @newobydata, "REM handled $line";
+      next;
+    }
+    # LOCALISE_ALL_RESOURCES_END
+    if (is_localise_all_resources_end($line))
+    {
+      $localise_all_resource = 0;
+      push @newobydata, "REM handled $line";
+      next;
+    }
+    if ( $localise_all_resource )
+    {
+      # localise all rsc files inside the localise_all_resources section
+      # resource files .rsc
+      if ( is_resource_entry($line) )
+      {
+        # match data/file=foobar.rsc resource/foobar.rsc
+        $line = create_localise_entry_from_resource($line);
+        push @newobydata, "$line\n";
+        next;
+      }
+      # help files .hlp
+      if ( is_help_entry_hlp($line) )
+      {
+        # match data/file=foobar.rsc resource/foobar.rsc
+        $line = create_localise_entry_from_help_hlp($line);
+        push @newobydata, "$line\n";
+        next;
+      }
+      # localise the .dtd files that have \\01\\ in their source target path
+      if ( is_dtd_entry($line) )
+      {
+        # match data/file=foobar.rsc resource/foobar.rsc
+        $line = create_localisable_path($line);
+        $line = create_localise_entry_from_dtd($line);
+        push @newobydata, "$line\n";
+        next;
+      }
+      # localise the active idle .o0001 files
+      if ( is_active_idle_entry($line) )
+      {
+        # match data/file=foobar.rsc resource/foobar.rsc
+        $line = create_localisable_path($line);
+        $line = create_localise_entry_from_active_idle($line);
+        push @newobydata, "$line\n";
+        next;
+      }
+      # localise the elocl file
+      if ( is_elocl_entry($line) )
+      {
+        # match data/file=foobar.rsc resource/foobar.rsc
+        $line = create_localise_entry_from_elocl($line);
+        push @newobydata, "$line\n";
+        next;
+      }
+
+    }
+    # Default case
+    push @newobydata, $line;
+  }
+  @{$obydata} = @newobydata;
+  print "========================== End localise_all_resources =======================\n" if $verbose;
+  #Stop image creation in error case
+  #exit(1) if ($errors);
+}
+
+# trim(string)
+# Removes spaces from both ends of the string.
+# Returns a trimmed string.
+sub trim($)
+{
+  my $string = shift;
+  $string =~ s/^\s+//;
+  $string =~ s/\s+$//;
+  return $string;
+}
+
+# match LOCALISE_ALL_RESOURCE_BEGIN
+sub is_localise_all_resources_begin($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*LOCALISE_ALL_RESOURCES_BEGIN\s*$/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+
+# match LOCALISE_ALL_RESOURCE_END
+sub is_localise_all_resources_end($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*LOCALISE_ALL_RESOURCES_END\s*$/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+#
+# match data=foobar.rsc resource/foobar.rsc
+sub is_resource_entry($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if ($source =~ m/\.rsc[\"|\']?$/i &&
+      $target =~ m/\.rsc[\"|\']?$/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+
+#
+# match
+sub is_help_entry_xhtml($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if ($source =~ m/\\01\\/i &&
+      $target =~ m/\\01\\/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+
+# match data=foobar.hlp resource/foobar.hlp
+sub is_help_entry_hlp($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if ($source =~ m/\.hlp[\"|\']?$/i &&
+      $target =~ m/\.hlp[\"|\']?$/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+
+#
+# match data=DATAZ_\\resource\\xhtml\\01\\0x01000000\\contents.zip  RESOURCE_FILES_DIR\\xhtml\\01\\0x01000000\\contents.zip
+sub is_dtd_entry($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if (($source =~ m/\\01\\.*\.dtd/i &&
+      $target =~ m/\\01\\.*\.dtd/i ) ||
+    ($source =~ m/\\00\\.*\.dtd/i &&
+      $target =~ m/\\00\\.*\.dtd/i ))
+  {
+    return 1;
+  }
+  return 0;
+}
+
+#
+# match data=DATAZ_\\resource\\xhtml\\01\\0x01000000\\contents.zip  RESOURCE_FILES_DIR\\xhtml\\01\\0x01000000\\contents.zip
+sub is_active_idle_entry($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if (($source =~ m/\.o0001/i &&
+        $target =~ m/\.o0001/i ) ||
+     ($source =~ m/\.o0000/i &&
+        $target =~ m/\.o0000/i ))
+  {
+    return 1;
+  }
+  return 0;
+}
+
+#
+#
+sub is_elocl_entry($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if ($source =~ m/elocl\.dll/i &&
+      $target =~ m/elocl\.loc/i )
+  {
+    return 1;
+  }
+  return 0;
+}
+
+# get the type from an iby entry
+sub get_type_from_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*(\S+)\s*=\s*(\S+)\s+(\S+)\s*/i )
+  {
+    return $1;
+  }
+  return "";
+}
+# get the source file from an iby entry
+sub get_source_from_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*(\S+)\s*=\s*(\S+)\s+(\S+)\s*/i )
+  {
+    return $2;
+  }
+  return "";
+}
+# get the target file from an iby entry
+sub get_target_from_entry($)
+{
+  my $entry = shift;
+  if ( $entry =~ m/^\s*(\S+)\s*=\s*(\S+)\s+(\S+)\s*/i )
+  {
+    return $3;
+  }
+  return "";
+}
+
+# create localise entry from resource entry
+sub create_localise_entry_from_resource($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the .rsc to .r%02d
+  $source =~ s/\.rsc/\.r%s/i;
+  $target =~ s/\.rsc/\.r%s/i;
+  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+# create localise entry from resource entry
+sub create_localise_entry_from_help($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the \\01\\ to \\%02d\\
+  $source =~ s/\\01\\/\\%02d\\/i;
+  $target =~ s/\\01\\/\\%02d\\/i;
+  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+# create localise entry from help entry hlp
+sub create_localise_entry_from_help_hlp($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the .hlp to .h%02d
+  $source =~ s/\.hlp/\.h%s/i;
+  $target =~ s/\.hlp/\.h%s/i;
+  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+# create localise entry from resource entry
+sub create_localise_entry_from_dtd($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the \\01\\ to \\%02d\\
+#  $source =~ s/\\01\\/\\%02d\\/i;
+#  $target =~ s/\\01\\/\\%02d\\/i;
+#  $source =~ s/\\00\\/\\%02d\\/i;
+#  $target =~ s/\\00\\/\\%02d\\/i;
+#  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+# create localise entry from resource entry
+sub create_localise_entry_from_active_idle($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the \\0001\\ to \\%04d\\
+  $source =~ s/o0001/o%04d/i;
+  $target =~ s/o0001/o%04d/i;
+  $source =~ s/o0000/o%04d/i;
+  $target =~ s/o0000/o%04d/i;
+  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+sub create_localise_entry_from_elocl($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the \\0001\\ to \\%04d\\
+  $source =~ s/\.dll/\.%02d/i;
+  $target =~ s/\.loc/\.%02d/i;
+  #print "create_localise_entry_from_resource: $source $target\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
+# create localisable path from /00/ or /01/ paths
+sub create_localisable_path($)
+{
+  my $entry = shift;
+
+  $entry =~ s/\\01\\/\\%02d\\/ig;
+  $entry =~ s/\\00\\/\\%02d\\/ig;
+
+  #print "create_localise_entry_from_resource: $source\n";
+  return $entry;
+}
+1;  # Return a true value from the file
\ No newline at end of file