summaryrefslogtreecommitdiff
path: root/support/autolatex/pm/AutoLaTeX/Interpreter
diff options
context:
space:
mode:
Diffstat (limited to 'support/autolatex/pm/AutoLaTeX/Interpreter')
-rw-r--r--support/autolatex/pm/AutoLaTeX/Interpreter/AbstractInterpreter.pm130
-rw-r--r--support/autolatex/pm/AutoLaTeX/Interpreter/batch.pm145
-rw-r--r--support/autolatex/pm/AutoLaTeX/Interpreter/js.pm145
-rw-r--r--support/autolatex/pm/AutoLaTeX/Interpreter/python.pm153
-rw-r--r--support/autolatex/pm/AutoLaTeX/Interpreter/ruby.pm153
-rw-r--r--support/autolatex/pm/AutoLaTeX/Interpreter/sh.pm145
-rw-r--r--support/autolatex/pm/AutoLaTeX/Interpreter/wincmd.pm145
7 files changed, 1016 insertions, 0 deletions
diff --git a/support/autolatex/pm/AutoLaTeX/Interpreter/AbstractInterpreter.pm b/support/autolatex/pm/AutoLaTeX/Interpreter/AbstractInterpreter.pm
new file mode 100644
index 0000000000..fa1cabbb56
--- /dev/null
+++ b/support/autolatex/pm/AutoLaTeX/Interpreter/AbstractInterpreter.pm
@@ -0,0 +1,130 @@
+# Copyright (C) 2013 Stephane Galland <galland@arakhne.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 the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+=pod
+
+=head1 NAME
+
+AutoLaTeX::Interpreter::AbstractInterpreter - An abstract script interpreter
+
+=head1 DESCRIPTION
+
+AutoLaTeX::Interpreter::AbstractInterpreter is a Perl module, which permits to
+create script interpreters
+
+=head1 METHOD DESCRIPTIONS
+
+This section contains only the methods in AbstractInterpreter.pm itself.
+
+=over
+
+=cut
+
+package AutoLaTeX::Interpreter::AbstractInterpreter;
+
+@ISA = qw( Exporter );
+@EXPORT = qw();
+@EXPORT_OK = qw();
+
+require 5.014;
+use strict;
+use utf8;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+use Exporter;
+use Carp;
+
+#------------------------------------------------------
+#
+# Global vars
+#
+#------------------------------------------------------
+
+# Version number
+my $VERSION = "1.0" ;
+
+
+=pod
+
+=item * new()
+
+Constructor
+
+=cut
+sub new() : method {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $parent = ref($proto) && $proto ;
+
+ my $self ;
+ if ( $parent ) {
+ %{$self} = %{$parent} ;
+ }
+ else {
+ $self = { 'global' => {} };
+ }
+ bless( $self, $class );
+ return $self;
+}
+
+=pod
+
+=item * define_global_variable($$)
+
+Define the value of a global variable.
+
+=cut
+sub define_global_variable($$) : method {
+ my $self = shift;
+ my $name = shift || confess("no variable name");
+ my $value = shift;
+ $self->{'global'}{"$name"} = $value;
+}
+
+=pod
+
+=item * run($)
+
+Run the given code.
+
+=cut
+sub run($) : method {
+ confess("You must implement the method run().");
+}
+
+
+1;
+__END__
+
+=back
+
+=head1 COPYRIGHT
+
+(c) Copyright 2013 Stephane Galland E<lt>galland@arakhne.orgE<gt>, under GPL.
+
+=head1 AUTHORS
+
+=over
+
+=item *
+
+Conceived and initially developed by Stéphane Galland E<lt>galland@arakhne.orgE<gt>.
+
+=back
+
+=head1 SEE ALSO
+
+L<autolatex>
diff --git a/support/autolatex/pm/AutoLaTeX/Interpreter/batch.pm b/support/autolatex/pm/AutoLaTeX/Interpreter/batch.pm
new file mode 100644
index 0000000000..d88448f32d
--- /dev/null
+++ b/support/autolatex/pm/AutoLaTeX/Interpreter/batch.pm
@@ -0,0 +1,145 @@
+# Copyright (C) 2013 Stephane Galland <galland@arakhne.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 the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+=pod
+
+=head1 NAME
+
+AutoLaTeX::Interpreter::batch - A DOS-Batch interpreter
+
+=head1 DESCRIPTION
+
+AutoLaTeX::Interpreter::batch is a Perl module, which permits to
+run DOS-Batch scripts.
+
+=head1 METHOD DESCRIPTIONS
+
+This section contains only the methods in batch.pm itself.
+
+=over
+
+=cut
+
+package AutoLaTeX::Interpreter::batch;
+
+@ISA = qw( AutoLaTeX::Interpreter::AbstractInterpreter );
+@EXPORT = qw();
+@EXPORT_OK = qw();
+
+require 5.014;
+use strict;
+use utf8;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+use Exporter;
+use Carp;
+use Scalar::Util qw(looks_like_number);
+
+use AutoLaTeX::Interpreter::AbstractInterpreter;
+use AutoLaTeX::Core::Util;
+
+#------------------------------------------------------
+#
+# Global vars
+#
+#------------------------------------------------------
+
+# Version number
+my $VERSION = "1.0" ;
+
+
+=pod
+
+=item * new()
+
+Constructor
+
+=cut
+sub new() : method {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = bless( $class->SUPER::new(), $class);
+ return $self;
+}
+
+
+sub _to_batch($$) {
+ my $name = shift;
+ my $value = shift;
+ if (defined($value)) {
+ if (isArray($value)) {
+ my $array = '';
+ my $i=0;
+ foreach my $v (@{$value}) {
+ $array .= "set $name"."[$i]=\"".str2language("$v").'"';
+ $i++;
+ }
+ return $array;
+ }
+ elsif (isHash($value)) {
+ die("Associative arrays are not yet supported by the Shell wrapper\n");
+ }
+ elsif (looks_like_number($value)) {
+ return "set $name=$value";
+ }
+ else {
+ return "set $name=\"".str2language("$value").'"';
+ }
+ }
+ return "unset $name";
+}
+
+=pod
+
+=item * run($)
+
+Run the given code.
+
+=cut
+sub run($) : method {
+ my $self = shift;
+ my $code = shift || confess("no code");
+ my $fullcode = "";
+ while (my ($name,$value) = each(%{$self->{'global'}})) {
+ $fullcode .= _to_batch($name,$value)."\n";
+ }
+ $fullcode .= "\n\n\n$code";
+ runCommandOrFailFromInput($fullcode, 'bash');
+}
+
+
+1;
+__END__
+
+=back
+
+=head1 COPYRIGHT
+
+(c) Copyright 2013 Stephane Galland E<lt>galland@arakhne.orgE<gt>, under GPL.
+
+=head1 AUTHORS
+
+=over
+
+=item *
+
+Conceived and initially developed by Stéphane Galland E<lt>galland@arakhne.orgE<gt>.
+
+=back
+
+=head1 SEE ALSO
+
+L<autolatex>
diff --git a/support/autolatex/pm/AutoLaTeX/Interpreter/js.pm b/support/autolatex/pm/AutoLaTeX/Interpreter/js.pm
new file mode 100644
index 0000000000..8bb30eb657
--- /dev/null
+++ b/support/autolatex/pm/AutoLaTeX/Interpreter/js.pm
@@ -0,0 +1,145 @@
+# Copyright (C) 2013 Stephane Galland <galland@arakhne.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 the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+=pod
+
+=head1 NAME
+
+AutoLaTeX::Interpreter::js - A Javascript interpreter
+
+=head1 DESCRIPTION
+
+AutoLaTeX::Interpreter::js is a Perl module, which permits to
+run Javascript scripts.
+
+=head1 METHOD DESCRIPTIONS
+
+This section contains only the methods in js.pm itself.
+
+=over
+
+=cut
+
+package AutoLaTeX::Interpreter::js;
+
+@ISA = qw( AutoLaTeX::Interpreter::AbstractInterpreter );
+@EXPORT = qw();
+@EXPORT_OK = qw();
+
+require 5.014;
+use strict;
+use utf8;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+use Exporter;
+use Carp;
+use Scalar::Util qw(looks_like_number);
+
+use AutoLaTeX::Interpreter::AbstractInterpreter;
+use AutoLaTeX::Core::Util;
+
+#------------------------------------------------------
+#
+# Global vars
+#
+#------------------------------------------------------
+
+# Version number
+my $VERSION = "1.0" ;
+
+
+=pod
+
+=item * new()
+
+Constructor
+
+=cut
+sub new() : method {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = bless( $class->SUPER::new(), $class);
+ return $self;
+}
+
+
+sub _to_javascript($) {
+ my $value = shift;
+ if (defined($value)) {
+ if (isArray($value)) {
+ my $array = '';
+ foreach my $v (@{$value}) {
+ if ($array) {
+ $array .= ', ';
+ }
+ $array .= &_to_javascript($v);
+ }
+ return "[ $array ]";
+ }
+ elsif (isHash($value)) {
+ die("Associative arrays are not yet supported by the Javascript wrapper\n");
+ }
+ elsif (looks_like_number($value)) {
+ return "$value";
+ }
+ else {
+ return '"'.str2language("$value").'"';
+ }
+ }
+ return 'null';
+}
+
+=pod
+
+=item * run($)
+
+Run the given code.
+
+=cut
+sub run($) : method {
+ my $self = shift;
+ my $code = shift || confess("no code");
+ my $fullcode = "";
+ while (my ($name,$value) = each(%{$self->{'global'}})) {
+ $fullcode .= "var $name = "._to_javascript($value)."\n";
+ }
+ $fullcode .= "\n\n\n$code";
+ runCommandOrFailFromInput($fullcode, 'js');
+}
+
+
+1;
+__END__
+
+=back
+
+=head1 COPYRIGHT
+
+(c) Copyright 2013 Stephane Galland E<lt>galland@arakhne.orgE<gt>, under GPL.
+
+=head1 AUTHORS
+
+=over
+
+=item *
+
+Conceived and initially developed by Stéphane Galland E<lt>galland@arakhne.orgE<gt>.
+
+=back
+
+=head1 SEE ALSO
+
+L<autolatex>
diff --git a/support/autolatex/pm/AutoLaTeX/Interpreter/python.pm b/support/autolatex/pm/AutoLaTeX/Interpreter/python.pm
new file mode 100644
index 0000000000..ebfec1fc34
--- /dev/null
+++ b/support/autolatex/pm/AutoLaTeX/Interpreter/python.pm
@@ -0,0 +1,153 @@
+# Copyright (C) 2013 Stephane Galland <galland@arakhne.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 the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+=pod
+
+=head1 NAME
+
+AutoLaTeX::Interpreter::python - A Python interpreter
+
+=head1 DESCRIPTION
+
+AutoLaTeX::Interpreter::python is a Perl module, which permits to
+run Python scripts.
+
+=head1 METHOD DESCRIPTIONS
+
+This section contains only the methods in python.pm itself.
+
+=over
+
+=cut
+
+package AutoLaTeX::Interpreter::python;
+
+@ISA = qw( AutoLaTeX::Interpreter::AbstractInterpreter );
+@EXPORT = qw();
+@EXPORT_OK = qw();
+
+require 5.014;
+use strict;
+use utf8;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+use Exporter;
+use Carp;
+use Scalar::Util qw(looks_like_number);
+
+use AutoLaTeX::Interpreter::AbstractInterpreter;
+use AutoLaTeX::Core::Util;
+
+#------------------------------------------------------
+#
+# Global vars
+#
+#------------------------------------------------------
+
+# Version number
+my $VERSION = "1.0" ;
+
+
+=pod
+
+=item * new()
+
+Constructor
+
+=cut
+sub new() : method {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = bless( $class->SUPER::new(), $class);
+ return $self;
+}
+
+
+sub _to_python($) {
+ my $value = shift;
+ if (defined($value)) {
+ if (isArray($value)) {
+ my $array = '';
+ foreach my $v (@{$value}) {
+ if ($array) {
+ $array .= ', ';
+ }
+ $array .= &_to_python($v);
+ }
+ return "[ $array ]";
+ }
+ elsif (isHash($value)) {
+ my $array = '';
+ while (my ($k,$v) = each(%{$value})) {
+ if ($array) {
+ $array .= ', ';
+ }
+ $array .= '"'.str2language("$k").'": ';
+ $array .= &_to_python($v);
+ }
+ return "{ $array }";
+ }
+ elsif (looks_like_number($value)) {
+ return "$value";
+ }
+ else {
+ return '"'.str2language("$value").'"';
+ }
+ }
+ return 'None';
+}
+
+=pod
+
+=item * run($)
+
+Run the given code.
+
+=cut
+sub run($) : method {
+ my $self = shift;
+ my $code = shift || confess("no code");
+ my $fullcode = "# coding=utf8\n";
+ while (my ($name,$value) = each(%{$self->{'global'}})) {
+ $fullcode .= "$name = "._to_python($value)."\n";
+ }
+ $fullcode .= "\n\n\n$code";
+ runCommandOrFailFromInput($fullcode, 'python');
+}
+
+
+1;
+__END__
+
+=back
+
+=head1 COPYRIGHT
+
+(c) Copyright 2013 Stephane Galland E<lt>galland@arakhne.orgE<gt>, under GPL.
+
+=head1 AUTHORS
+
+=over
+
+=item *
+
+Conceived and initially developed by Stéphane Galland E<lt>galland@arakhne.orgE<gt>.
+
+=back
+
+=head1 SEE ALSO
+
+L<autolatex>
diff --git a/support/autolatex/pm/AutoLaTeX/Interpreter/ruby.pm b/support/autolatex/pm/AutoLaTeX/Interpreter/ruby.pm
new file mode 100644
index 0000000000..e19c4e12f5
--- /dev/null
+++ b/support/autolatex/pm/AutoLaTeX/Interpreter/ruby.pm
@@ -0,0 +1,153 @@
+# Copyright (C) 2013 Stephane Galland <galland@arakhne.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 the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+=pod
+
+=head1 NAME
+
+AutoLaTeX::Interpreter::ruby - A Ruby interpreter
+
+=head1 DESCRIPTION
+
+AutoLaTeX::Interpreter::ruby is a Perl module, which permits to
+run Ruby scripts.
+
+=head1 METHOD DESCRIPTIONS
+
+This section contains only the methods in ruby.pm itself.
+
+=over
+
+=cut
+
+package AutoLaTeX::Interpreter::ruby;
+
+@ISA = qw( AutoLaTeX::Interpreter::AbstractInterpreter );
+@EXPORT = qw();
+@EXPORT_OK = qw();
+
+require 5.014;
+use strict;
+use utf8;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+use Exporter;
+use Carp;
+use Scalar::Util qw(looks_like_number);
+
+use AutoLaTeX::Interpreter::AbstractInterpreter;
+use AutoLaTeX::Core::Util;
+
+#------------------------------------------------------
+#
+# Global vars
+#
+#------------------------------------------------------
+
+# Version number
+my $VERSION = "1.0" ;
+
+
+=pod
+
+=item * new()
+
+Constructor
+
+=cut
+sub new() : method {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = bless( $class->SUPER::new(), $class);
+ return $self;
+}
+
+
+sub _to_ruby($) {
+ my $value = shift;
+ if (defined($value)) {
+ if (isArray($value)) {
+ my $array = '';
+ foreach my $v (@{$value}) {
+ if ($array) {
+ $array .= ', ';
+ }
+ $array .= &_to_ruby($v);
+ }
+ return "[ $array ]";
+ }
+ elsif (isHash($value)) {
+ my $array = '';
+ while (my ($k,$v) = each(%{$value})) {
+ if ($array) {
+ $array .= ', ';
+ }
+ $array .= '"'.str2language("$k").'"=>';
+ $array .= &_to_ruby($v);
+ }
+ return "{ $array }";
+ }
+ elsif (looks_like_number($value)) {
+ return "$value";
+ }
+ else {
+ return '"'.str2language("$value").'"';
+ }
+ }
+ return 'nil';
+}
+
+=pod
+
+=item * run($)
+
+Run the given code.
+
+=cut
+sub run($) : method {
+ my $self = shift;
+ my $code = shift || confess("no code");
+ my $fullcode = "";
+ while (my ($name,$value) = each(%{$self->{'global'}})) {
+ $fullcode .= "$name = "._to_ruby($value)."\n";
+ }
+ $fullcode .= "\n\n\n$code";
+ runCommandOrFailFromInput($fullcode, 'ruby');
+}
+
+
+1;
+__END__
+
+=back
+
+=head1 COPYRIGHT
+
+(c) Copyright 2013 Stephane Galland E<lt>galland@arakhne.orgE<gt>, under GPL.
+
+=head1 AUTHORS
+
+=over
+
+=item *
+
+Conceived and initially developed by Stéphane Galland E<lt>galland@arakhne.orgE<gt>.
+
+=back
+
+=head1 SEE ALSO
+
+L<autolatex>
diff --git a/support/autolatex/pm/AutoLaTeX/Interpreter/sh.pm b/support/autolatex/pm/AutoLaTeX/Interpreter/sh.pm
new file mode 100644
index 0000000000..4ab8bb3c38
--- /dev/null
+++ b/support/autolatex/pm/AutoLaTeX/Interpreter/sh.pm
@@ -0,0 +1,145 @@
+# Copyright (C) 2013 Stephane Galland <galland@arakhne.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 the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+=pod
+
+=head1 NAME
+
+AutoLaTeX::Interpreter::sh - A Shell interpreter
+
+=head1 DESCRIPTION
+
+AutoLaTeX::Interpreter::sh is a Perl module, which permits to
+run Shell scripts.
+
+=head1 METHOD DESCRIPTIONS
+
+This section contains only the methods in sh.pm itself.
+
+=over
+
+=cut
+
+package AutoLaTeX::Interpreter::sh;
+
+@ISA = qw( AutoLaTeX::Interpreter::AbstractInterpreter );
+@EXPORT = qw();
+@EXPORT_OK = qw();
+
+require 5.014;
+use strict;
+use utf8;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+use Exporter;
+use Carp;
+use Scalar::Util qw(looks_like_number);
+
+use AutoLaTeX::Interpreter::AbstractInterpreter;
+use AutoLaTeX::Core::Util;
+
+#------------------------------------------------------
+#
+# Global vars
+#
+#------------------------------------------------------
+
+# Version number
+my $VERSION = "1.0" ;
+
+
+=pod
+
+=item * new()
+
+Constructor
+
+=cut
+sub new() : method {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = bless( $class->SUPER::new(), $class);
+ return $self;
+}
+
+
+sub _to_shell($$) {
+ my $name = shift;
+ my $value = shift;
+ if (defined($value)) {
+ if (isArray($value)) {
+ my $array = '';
+ my $i=0;
+ foreach my $v (@{$value}) {
+ $array .= "$name"."[$i]=\"".str2language("$v").'"';
+ $i++;
+ }
+ return $array;
+ }
+ elsif (isHash($value)) {
+ die("Associative arrays are not yet supported by the Shell wrapper\n");
+ }
+ elsif (looks_like_number($value)) {
+ return "$name=$value";
+ }
+ else {
+ return "$name=\"".str2language("$value").'"';
+ }
+ }
+ return "unset $name";
+}
+
+=pod
+
+=item * run($)
+
+Run the given code.
+
+=cut
+sub run($) : method {
+ my $self = shift;
+ my $code = shift || confess("no code");
+ my $fullcode = "";
+ while (my ($name,$value) = each(%{$self->{'global'}})) {
+ $fullcode .= _to_shell($name,$value)."\n";
+ }
+ $fullcode .= "\n\n\n$code";
+ runCommandOrFailFromInput($fullcode, 'bash');
+}
+
+
+1;
+__END__
+
+=back
+
+=head1 COPYRIGHT
+
+(c) Copyright 2013 Stephane Galland E<lt>galland@arakhne.orgE<gt>, under GPL.
+
+=head1 AUTHORS
+
+=over
+
+=item *
+
+Conceived and initially developed by Stéphane Galland E<lt>galland@arakhne.orgE<gt>.
+
+=back
+
+=head1 SEE ALSO
+
+L<autolatex>
diff --git a/support/autolatex/pm/AutoLaTeX/Interpreter/wincmd.pm b/support/autolatex/pm/AutoLaTeX/Interpreter/wincmd.pm
new file mode 100644
index 0000000000..b3d01607cd
--- /dev/null
+++ b/support/autolatex/pm/AutoLaTeX/Interpreter/wincmd.pm
@@ -0,0 +1,145 @@
+# Copyright (C) 2013 Stephane Galland <galland@arakhne.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 the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+=pod
+
+=head1 NAME
+
+AutoLaTeX::Interpreter::batch - A DOS-Batch interpreter
+
+=head1 DESCRIPTION
+
+AutoLaTeX::Interpreter::batch is a Perl module, which permits to
+run DOS-Batch scripts.
+
+=head1 METHOD DESCRIPTIONS
+
+This section contains only the methods in batch.pm itself.
+
+=over
+
+=cut
+
+package AutoLaTeX::Interpreter::batch;
+
+@ISA = qw( AutoLaTeX::Interpreter::AbstractInterpreter );
+@EXPORT = qw();
+@EXPORT_OK = qw();
+
+require 5.014;
+use strict;
+use utf8;
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+use Exporter;
+use Carp;
+use Scalar::Util qw(looks_like_number);
+
+use AutoLaTeX::Interpreter::AbstractInterpreter;
+use AutoLaTeX::Core::Util;
+
+#------------------------------------------------------
+#
+# Global vars
+#
+#------------------------------------------------------
+
+# Version number
+my $VERSION = "1.0" ;
+
+
+=pod
+
+=item * new()
+
+Constructor
+
+=cut
+sub new() : method {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = bless( $class->SUPER::new(), $class);
+ return $self;
+}
+
+
+sub _to_batch($$) {
+ my $name = shift;
+ my $value = shift;
+ if (defined($value)) {
+ if (isArray($value)) {
+ my $array = '';
+ my $i=0;
+ foreach my $v (@{$value}) {
+ $array .= "set $name"."[$i]=\"".str2language("$v").'"';
+ $i++;
+ }
+ return $array;
+ }
+ elsif (isHash($value)) {
+ die("Associative arrays are not yet supported by the Shell wrapper\n");
+ }
+ elsif (looks_like_number($value)) {
+ return "set $name=$value";
+ }
+ else {
+ return "set $name=\"".str2language("$value").'"';
+ }
+ }
+ return "unset $name";
+}
+
+=pod
+
+=item * run($)
+
+Run the given code.
+
+=cut
+sub run($) : method {
+ my $self = shift;
+ my $code = shift || confess("no code");
+ my $fullcode = "";
+ while (my ($name,$value) = each(%{$self->{'global'}})) {
+ $fullcode .= _to_batch($name,$value)."\n";
+ }
+ $fullcode .= "\n\n\n$code";
+ runCommandOrFailFromInput($fullcode, 'cmd');
+}
+
+
+1;
+__END__
+
+=back
+
+=head1 COPYRIGHT
+
+(c) Copyright 2013 Stephane Galland E<lt>galland@arakhne.orgE<gt>, under GPL.
+
+=head1 AUTHORS
+
+=over
+
+=item *
+
+Conceived and initially developed by Stéphane Galland E<lt>galland@arakhne.orgE<gt>.
+
+=back
+
+=head1 SEE ALSO
+
+L<autolatex>