javaprop2texiflag.pl 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. #!/usr/bin/env perl
  2. # javaprop2texiflag.pl --- -*- coding: utf-8 -*-
  3. # Copyright 2012 Vincent Belaïche
  4. #
  5. # Author: Vincent Belaïche <vincentb1@users.sourceforge.net>
  6. # Version: $Id: javaprop2texiflag.pl,v 1.2 2012/09/02 11:17:29 vincentb1 Exp $
  7. # Keywords:
  8. # X-URL: http://www.jpicedt.org/
  9. #
  10. # Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de
  11. # diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les
  12. # conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site
  13. # "http://www.cecill.info".
  14. #
  15. # En contrepartie de l'accessibilité au code source et des droits de copie, de modification et de
  16. # redistribution accordés par cette licence, il n'est offert aux utilisateurs qu'une garantie limitée. Pour
  17. # les mêmes raisons, seule une responsabilité restreinte pèse sur l'auteur du programme, le titulaire des
  18. # droits patrimoniaux et les concédants successifs.
  19. #
  20. # A cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à
  21. # l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par l'utilisateur
  22. # étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à manipuler et qui le réserve donc
  23. # à des développeurs et des professionnels avertis possédant des connaissances informatiques approfondies.
  24. # Les utilisateurs sont donc invités à charger et tester l'adéquation du logiciel à leurs besoins dans des
  25. # conditions permettant d'assurer la sécurité de leurs systèmes et ou de leurs données et, plus généralement,
  26. # à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
  27. #
  28. # Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence
  29. # CeCILL, et que vous en avez accepté les termes.
  30. #
  31. ## Commentary:
  32. #
  33. ## Installation:
  34. ## Code:
  35. use strict;
  36. use warnings;
  37. use feature qw(say unicode_strings);
  38. use PerlIO;
  39. my $version='$Id: javaprop2texiflag.pl,v 1.2 2012/09/02 11:17:29 vincentb1 Exp $';
  40. my $linenb = 0;
  41. my $inputfile;
  42. my $verbose;
  43. sub usage
  44. {
  45. my $retval = shift;
  46. print "Usage:
  47. javaprop2texiflag.pl ARGUMENTS LIST
  48. -h, --header ARG : Add a header ARG to the produced output
  49. -p, --prefix ARG : Set prefix to ARG, prefix is empty by default
  50. -i, --input ARG : Set input to ARG, otherwise it is STDIN
  51. -i, --output ARG : Set output to ARG, otherwise it is STDIN
  52. -c, --showcomments : Translate comments into the output
  53. -e, --showemptylines: Translate empty lines into the output
  54. -v, --verbose : Output some message when done
  55. --version : show version and exit
  56. --help : show this message and exit
  57. ";
  58. exit $retval;
  59. }
  60. #
  61. #
  62. sub jp2texif_unescape
  63. {
  64. $_ = shift();
  65. s!\\(n(?{"\n"})|r(?{"\r"})|f(?{"\f"})|t(?{"\t"})|u([0-9A-F]{4})(?{chr hex $2})|(.)(?{$3}))!$^R!g;
  66. return $_;
  67. }
  68. sub jp2texif_encode
  69. {
  70. $_ = shift;
  71. s!(([\@\{\}])(?{'@'."$2"})|\n(?{'@*'}))!$^R!g;
  72. # Texinfo-fier les espaces de tête pour les rendre significatifs
  73. if(/\A([ \t]+)(.*)\Z/)
  74. {
  75. my $spaceprefix = $1;
  76. my $remainder = $2;
  77. $spaceprefix =~ s!(.)!\@$1!g;
  78. $_ = $spaceprefix . $remainder;
  79. }
  80. # Texinfo-fier les espaces de queue pour les rendre significatifs
  81. if(/(.+?)([ \t]+)\Z/)
  82. {
  83. my $spacepostfix = $2;
  84. my $remainder = $1;
  85. $spacepostfix =~ s!(.)!\@$1!g;
  86. $_ = $remainder . $spacepostfix;
  87. }
  88. return $_
  89. }
  90. my @header = ();
  91. my $prefix = "";
  92. my $outputfile;
  93. my $showcomments;
  94. my $showemptylines;
  95. my $i = 0;
  96. while($i < @ARGV){
  97. if($i + 1 < @ARGV)
  98. {
  99. if($ARGV[$i] =~ /\A-(i|-input)\Z/)
  100. {
  101. $inputfile = $ARGV[$i+1];
  102. $i = $i +2;
  103. }
  104. elsif($ARGV[$i] =~ /\A-(o|-output)\Z/)
  105. {
  106. $outputfile = $ARGV[$i+1];
  107. $i = $i +2;
  108. }
  109. elsif($ARGV[$i] =~ /\A-(p|-prefix)\Z/)
  110. {
  111. $prefix = $ARGV[$i+1];
  112. $i = $i +2;
  113. }
  114. elsif($ARGV[$i] =~ /\A-(h|-header)\Z/)
  115. {
  116. $header[++$#header] = \$ARGV[$i+1];
  117. $i = $i +2;
  118. }
  119. else
  120. {
  121. goto ONE_ARG;
  122. }
  123. }
  124. else
  125. {
  126. ONE_ARG:
  127. {
  128. if($ARGV[$i] =~ /\A-(c|-showcomments)\Z/)
  129. {
  130. $showcomments = 1;
  131. $i ++;
  132. }
  133. elsif($ARGV[$i] =~ /\A-(e|-showemptylines)\Z/)
  134. {
  135. $showemptylines = 1;
  136. $i ++;
  137. }
  138. elsif($ARGV[$i] =~ /\A-(v|-verbose)\Z/)
  139. {
  140. $verbose = 1;
  141. $i ++;
  142. }
  143. elsif($ARGV[$i] eq "--version")
  144. {
  145. print "Version of javaprop2texiflag.pl = $version\n";
  146. exit 0;
  147. }
  148. elsif($ARGV[$i] eq "--help")
  149. {
  150. usage(0);
  151. exit;
  152. }
  153. else
  154. {
  155. print "Invalid remaining arguments: @ARGV[$i .. $#ARGV]\n";
  156. usage(-1);
  157. }
  158. }
  159. }
  160. }
  161. my $in;
  162. if($inputfile)
  163. {
  164. open($in, "< :encoding(ISO-8859-1)", $inputfile) or die "Can't open $inputfile $!";
  165. }
  166. else
  167. {
  168. $in = \*STDIN;
  169. }
  170. my $out;
  171. if($outputfile)
  172. {
  173. open($out, "> :encoding(UTF-8)", $outputfile) or die "Can't open $outputfile $!";
  174. }
  175. else
  176. {
  177. $out = \*STDOUT;
  178. }
  179. select $out;
  180. my $line;
  181. if(@header)
  182. {
  183. foreach(@header){
  184. say '@c ', $$_;
  185. }
  186. }
  187. my $folded_line = 0;
  188. my $flagnb = 0;
  189. my $propname;
  190. my $propval;
  191. my $nextpropval;
  192. LINE: while(<$in>){
  193. $line = $_ ;
  194. $linenb++ ;
  195. if($line =~ /\A(\s*)[#!](.*)\Z/)
  196. {
  197. if($showcomments)
  198. {
  199. say "$1" , '@c ' , "$2";
  200. }
  201. next LINE;
  202. }
  203. elsif($line =~ /\A\s*\Z/)
  204. {
  205. if($showemptylines)
  206. {
  207. say "\n";
  208. }
  209. next LINE;
  210. }
  211. elsif($line =~ /\A(\s*(.*))\Z/)
  212. {
  213. if($folded_line == 0)
  214. {
  215. if($line =~ /\A\s*((?:[a-zA-Z0-9_\.-]|\\[nr=:])+)\s*[=:](.*)\Z/)
  216. {
  217. $propname = $1;
  218. $propval = $2;
  219. if($propval =~ m!(\\+)$! && (length($1) & 1) == 1)
  220. {
  221. # nombre impair de contre-obliques en fin de ligne, c'est un repliement
  222. $folded_line = 1;
  223. $propval =~ s!.$!!;
  224. $propval = jp2texif_unescape($propval);
  225. }
  226. else
  227. {
  228. say "\@set $prefix$propname " , jp2texif_encode( jp2texif_unescape($propval));
  229. $flagnb ++;
  230. }
  231. }
  232. else
  233. {
  234. die "$inputfile:$linenb: Invalid line = $line";
  235. }
  236. }
  237. elsif($folded_line == 1)
  238. {
  239. $nextpropval = $2;
  240. if($nextpropval =~ m!(\\+)$! && (length($1) & 1) == 1)
  241. {
  242. # nombre impair de contre-obliques en fin de ligne, on reste en repliement
  243. $nextpropval =~ s!.$!!;
  244. $propval = $propval . jp2texif_unescape($nextpropval);
  245. }
  246. else
  247. {
  248. # le repliement est fini
  249. $folded_line = 0;
  250. $propval = $propval . jp2texif_unescape($nextpropval);
  251. say "\@set $prefix$propname " , jp2texif_encode($propval);
  252. $flagnb ++;
  253. }
  254. }
  255. else
  256. {
  257. die "$inputfile:$linenb: javaprop2texiflag INTERNAL BUG";
  258. }
  259. next LINE;
  260. }
  261. else
  262. {
  263. die "$inputfile:$linenb: Invalid line = $line";
  264. }
  265. }
  266. if($verbose)
  267. {
  268. if($inputfile)
  269. {
  270. $inputfile = "file \`$inputfile\'";
  271. }
  272. else
  273. {
  274. $inputfile = "standard input";
  275. }
  276. print STDOUT "\nDone: javaprop2texiflag is finished,\n\tinput was $inputfile,\n\t$linenb lines were processed,\n\t$flagnb flags were produced.\n";
  277. }