#!/usr/bin/env perl
# javaprop2texiflag.pl --- -*- coding: utf-8 -*-
# Copyright 2012 Vincent Belaïche
#
# Author: Vincent Belaïche <vincentb1@users.sourceforge.net>
# Version: $Id: javaprop2texiflag.pl,v 1.2 2012/09/02 11:17:29 vincentb1 Exp $
# Keywords:
# X-URL: http://www.jpicedt.org/
#
# Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de
# diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les
# conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site
# "http://www.cecill.info".
#
# En contrepartie de l'accessibilité au code source et des droits de copie, de modification et de
# redistribution accordés par cette licence, il n'est offert aux utilisateurs qu'une garantie limitée. Pour
# les mêmes raisons, seule une responsabilité restreinte pèse sur l'auteur du programme, le titulaire des
# droits patrimoniaux et les concédants successifs.
#
# A cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à
# l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par l'utilisateur
# étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à manipuler et qui le réserve donc
# à des développeurs et des professionnels avertis possédant des connaissances informatiques approfondies.
# Les utilisateurs sont donc invités à charger et tester l'adéquation du logiciel à leurs besoins dans des
# conditions permettant d'assurer la sécurité de leurs systèmes et ou de leurs données et, plus généralement,
# à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
#
# Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence
# CeCILL, et que vous en avez accepté les termes.
#
## Commentary:
#
## Installation:
## Code:
use strict;
use warnings;
use feature qw(say unicode_strings);
use PerlIO;
my $version='$Id: javaprop2texiflag.pl,v 1.2 2012/09/02 11:17:29 vincentb1 Exp $';
my $linenb = 0;
my $inputfile;
my $verbose;
sub usage
{
my $retval = shift;
print "Usage:
javaprop2texiflag.pl ARGUMENTS LIST
-h, --header ARG : Add a header ARG to the produced output
-p, --prefix ARG : Set prefix to ARG, prefix is empty by default
-i, --input ARG : Set input to ARG, otherwise it is STDIN
-i, --output ARG : Set output to ARG, otherwise it is STDIN
-c, --showcomments : Translate comments into the output
-e, --showemptylines: Translate empty lines into the output
-v, --verbose : Output some message when done
--version : show version and exit
--help : show this message and exit
";
exit $retval;
}
#
#
sub jp2texif_unescape
{
$_ = shift();
s!\\(n(?{"\n"})|r(?{"\r"})|f(?{"\f"})|t(?{"\t"})|u([0-9A-F]{4})(?{chr hex $2})|(.)(?{$3}))!$^R!g;
return $_;
}
sub jp2texif_encode
{
$_ = shift;
s!(([\@\{\}])(?{'@'."$2"})|\n(?{'@*'}))!$^R!g;
# Texinfo-fier les espaces de tête pour les rendre significatifs
if(/\A([ \t]+)(.*)\Z/)
{
my $spaceprefix = $1;
my $remainder = $2;
$spaceprefix =~ s!(.)!\@$1!g;
$_ = $spaceprefix . $remainder;
}
# Texinfo-fier les espaces de queue pour les rendre significatifs
if(/(.+?)([ \t]+)\Z/)
{
my $spacepostfix = $2;
my $remainder = $1;
$spacepostfix =~ s!(.)!\@$1!g;
$_ = $remainder . $spacepostfix;
}
return $_
}
my @header = ();
my $prefix = "";
my $outputfile;
my $showcomments;
my $showemptylines;
my $i = 0;
while($i < @ARGV){
if($i + 1 < @ARGV)
{
if($ARGV[$i] =~ /\A-(i|-input)\Z/)
{
$inputfile = $ARGV[$i+1];
$i = $i +2;
}
elsif($ARGV[$i] =~ /\A-(o|-output)\Z/)
{
$outputfile = $ARGV[$i+1];
$i = $i +2;
}
elsif($ARGV[$i] =~ /\A-(p|-prefix)\Z/)
{
$prefix = $ARGV[$i+1];
$i = $i +2;
}
elsif($ARGV[$i] =~ /\A-(h|-header)\Z/)
{
$header[++$#header] = \$ARGV[$i+1];
$i = $i +2;
}
else
{
goto ONE_ARG;
}
}
else
{
ONE_ARG:
{
if($ARGV[$i] =~ /\A-(c|-showcomments)\Z/)
{
$showcomments = 1;
$i ++;
}
elsif($ARGV[$i] =~ /\A-(e|-showemptylines)\Z/)
{
$showemptylines = 1;
$i ++;
}
elsif($ARGV[$i] =~ /\A-(v|-verbose)\Z/)
{
$verbose = 1;
$i ++;
}
elsif($ARGV[$i] eq "--version")
{
print "Version of javaprop2texiflag.pl = $version\n";
exit 0;
}
elsif($ARGV[$i] eq "--help")
{
usage(0);
exit;
}
else
{
print "Invalid remaining arguments: @ARGV[$i .. $#ARGV]\n";
usage(-1);
}
}
}
}
my $in;
if($inputfile)
{
open($in, "< :encoding(ISO-8859-1)", $inputfile) or die "Can't open $inputfile $!";
}
else
{
$in = \*STDIN;
}
my $out;
if($outputfile)
{
open($out, "> :encoding(UTF-8)", $outputfile) or die "Can't open $outputfile $!";
}
else
{
$out = \*STDOUT;
}
select $out;
my $line;
if(@header)
{
foreach(@header){
say '@c ', $$_;
}
}
my $folded_line = 0;
my $flagnb = 0;
my $propname;
my $propval;
my $nextpropval;
LINE: while(<$in>){
$line = $_ ;
$linenb++ ;
if($line =~ /\A(\s*)[#!](.*)\Z/)
{
if($showcomments)
{
say "$1" , '@c ' , "$2";
}
next LINE;
}
elsif($line =~ /\A\s*\Z/)
{
if($showemptylines)
{
say "\n";
}
next LINE;
}
elsif($line =~ /\A(\s*(.*))\Z/)
{
if($folded_line == 0)
{
if($line =~ /\A\s*((?:[a-zA-Z0-9_\.-]|\\[nr=:])+)\s*[=:](.*)\Z/)
{
$propname = $1;
$propval = $2;
if($propval =~ m!(\\+)$! && (length($1) & 1) == 1)
{
# nombre impair de contre-obliques en fin de ligne, c'est un repliement
$folded_line = 1;
$propval =~ s!.$!!;
$propval = jp2texif_unescape($propval);
}
else
{
say "\@set $prefix$propname " , jp2texif_encode( jp2texif_unescape($propval));
$flagnb ++;
}
}
else
{
die "$inputfile:$linenb: Invalid line = $line";
}
}
elsif($folded_line == 1)
{
$nextpropval = $2;
if($nextpropval =~ m!(\\+)$! && (length($1) & 1) == 1)
{
# nombre impair de contre-obliques en fin de ligne, on reste en repliement
$nextpropval =~ s!.$!!;
$propval = $propval . jp2texif_unescape($nextpropval);
}
else
{
# le repliement est fini
$folded_line = 0;
$propval = $propval . jp2texif_unescape($nextpropval);
say "\@set $prefix$propname " , jp2texif_encode($propval);
$flagnb ++;
}
}
else
{
die "$inputfile:$linenb: javaprop2texiflag INTERNAL BUG";
}
next LINE;
}
else
{
die "$inputfile:$linenb: Invalid line = $line";
}
}
if($verbose)
{
if($inputfile)
{
$inputfile = "file \`$inputfile\'";
}
else
{
$inputfile = "standard input";
}
print STDOUT "\nDone: javaprop2texiflag is finished,\n\tinput was $inputfile,\n\t$linenb lines were processed,\n\t$flagnb flags were produced.\n";
}