Subversion Repositories wimsdev

Rev

Rev 1949 | Rev 3859 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #!/usr/bin/perl
  2. ##script to generate some index files from tags of index.tags.xml for
  3. ## shtooka packages
  4. use locale;
  5. #use Encode;
  6. my @dir=() ;
  7. my $lang='' ;
  8. my @SPECIAL=('');
  9. my $file='index.xml' ;
  10. my $PREFIX;
  11. my @EXTRA=(
  12. swac_tech_qlt,
  13. swac_tech_date,
  14. swac_tech_soft,
  15. description,
  16. swac_coll_authors,
  17. swac_coll_copyright,
  18. swac_coll_desc,
  19. swac_coll_license,
  20. swac_coll_name,
  21. swac_coll_org,
  22. swac_coll_section,
  23. swac_lang,
  24. swac_pron_speed,
  25. swac_speak_birth_year,
  26. swac_speak_gender,
  27. swac_speak_lang_country,
  28. swac_speak_lang,
  29. swac_speak_lang_region,
  30. swac_speak_liv_country,
  31. swac_speak_liv_town,
  32. swac_speak_name,
  33. copyright,
  34. swac_coll_url,
  35. genre,
  36. license,
  37. title,
  38. ) ;
  39.  
  40. $Extra=join('|', @EXTRA) ;
  41. my @CHAMP=(
  42. swac_alphaidx,
  43. swac_baseform,
  44. swac_form_name,
  45. swac_coll,
  46. );
  47.  
  48. #my $MODE='utf8' ;
  49.  
  50. while ($_ = shift(@ARGV)) {
  51.   last if (/^$/);
  52.   if    (/^--dir=(.*)$/)     {  push @dir, $1 ;    }
  53.   elsif (/^--special=(.*)$/) {  push @SPECIAL,$1;}
  54.   elsif (/^--file=(.*)$/)    {  $file=$1;   }
  55.   elsif (/^--lang=(.*)$/)    {  $lang=$1;   }
  56.   elsif (/^--mode=(.*)$/)    {  $MODE=$1;   }
  57.   elsif (/^--modeout=(.*)$/) {  $MODE1=$1;  }
  58.   elsif (/^--prefix=(.*)$/) {  $PREFIX=$1 . '/';  }
  59.   else {
  60.     print STDERR "unknown option: $_\n" if (!/^--help$/);
  61.     usage(); # includes --help !
  62.   }
  63. }
  64. %hash=(swac_alphaidx => swac_baseform,
  65. swac_text => swac_baseform,) ;
  66.  
  67. my %ALLTAGS = ('swac_text' => {}) ;
  68. push @dir, glob("$lang-*") if ($lang) ;
  69. $ALLTAGS = \%ALLTAGS ;
  70. InitFromFiles($ALLTAGS, (@dir) ? @dir : ".") ;
  71. @KEYS=(keys %{$ALLTAGS->{swac_text}}) ;
  72.  
  73. ##On complète
  74. for $field (keys %hash) { $field2=$hash{$field} ;
  75.    for my $k (sort @KEYS) {
  76.     if( !($ALLTAGS->{$field2}{$k}) ) {
  77.       if( ($ALLTAGS->{$field}{$k})) { $l = $ALLTAGS->{$field}{$k} ;
  78.        $l = traite_francais($l) ;
  79.        $ALLTAGS->{$field2}{$k}= $l
  80.       }
  81.     }
  82.   }
  83. }
  84. sub traite_francais { my ($a) = @_ ;
  85.    if ($a =~ /(\w+)\s+(s')/) { $a = "s'". $1 ; } ;
  86.    if ($a =~ /(\w+)\s+(se)/) { $a = "se ". $1 } ;
  87.    $a =~ s/\best-à-dire/c'est-à-dire/ ;
  88.    $a =~ s /plaire\|\(conversation\)/s'il vous plaît/;
  89.   $a =~ s/\((\w+)\)// ;
  90.   $a =~ s /^|//;
  91.   $a}
  92. #### problème avec s'il te pl
  93. out(":" . join( "\n:",  @KEYS), canon2("")) ;
  94.  
  95. @SPECIAL= (keys %{$ALLTAGS})  if ($#SPECIAL==0) ;
  96. for my $special (@SPECIAL) {
  97.    out(indexkey($special), canon2($special)) if (indexkey($special)) && !($special =~ /($Extra)/);  
  98. }
  99.  
  100. ## permet de passer du fichier index.tags.txt à un fichier en tableau
  101.  
  102. #out(tableau(@CHAMP), 'ALL') ;
  103. out(tags(@CHAMP), canon('swac_tags')) ;
  104. sub tableau {  my @list = @_ ;
  105. my $TEXT = "[TAG]" ; $cc=1;
  106. for my $b (@list) {
  107.    $TEXT .= "$b=\\\&$cc\n" ;
  108.    $cc ++
  109. }
  110.  
  111. $TEXT .= "\n\n[LIST]\n" ;
  112.   for my $k (sort @KEYS) {
  113.     $TEXT .= $ALLTAGS->{swac_text}{$k} ;
  114.     for my $b (@list) {
  115.            $TEXT .= ';' . $ALLTAGS->{$b}{$k} ;
  116.       }  
  117.       $TEXT .=  ";$k\n"
  118.   }
  119.   $TEXT
  120.  }
  121.   sub tags {  my @list = @_ ;
  122.   my $TEXT = "" ;
  123.   for my $k (sort @KEYS) {
  124.     $TEXT .= $k . ":"
  125.           . 'swac_text' . '="' . $ALLTAGS->{'swac_text'}{$k}. '"' . "\\\n";
  126.     for my $b (@list) {
  127.            $TEXT .= $b . '="' .  $ALLTAGS->{$b}{$k} . '"' . "\\\n" if ($ALLTAGS->{$b}{$k}) ;
  128.       }
  129.      $TEXT .= "\n" ;
  130.   }
  131.   $TEXT =~ s/\\\n\n/\n/g ;
  132.   $TEXT ;
  133.  }
  134.  
  135.  
  136. sub indexkey { my ($swac)=@_ ;
  137.  my %HA = %{$ALLTAGS->{$swac}} ;
  138.  $HA =\%HA ;
  139.  %h = ();
  140.  while (my ($key, $val) = each %HA)
  141.    { $v = $val ; $v=~ s/\|/,/g ; @val1= split(',',$v) ;
  142.     for my $val2 (@val1) {
  143.      %h->{$val2} .= ((%h->{$val2}) ? "," : "") . $key if  $HA{$key} =~ /$val/  ;
  144.    }
  145.    }
  146.  my $text = "";
  147.  for my $a (keys %h){
  148.      $text .= $a . ":" . $h{$a} . "\n" ;
  149.  }
  150.  $text ;
  151. }
  152.  
  153. my (%errmsg); # empèche le ré-affichage d'un même warning.
  154. $SIG{__WARN__} = sub { my ($x) = @_;
  155.   return if $errmsg{$x};
  156.   $errmsg{$x} = 1;
  157.   print STDERR "### $x";
  158. };
  159.  
  160. #### à modifier ou partir d'un fichier sans global !
  161.  
  162. sub ConsListe { my ($file, $ref, $dir,$prefix) = @_;
  163.   my ($Id, $val) = ('', '');
  164. #  if (!open IN, $file) { warn "$file n'existe pas"; return; }
  165.   open IN, $file;
  166.   ### le lit en utf8
  167.   $actualdir=`pwd`;
  168.   if ($MODE eq "utf8") {binmode IN ,":utf8";}
  169.   print STDERR "... lecture de $actualdir$file\n";
  170.   while(<IN>) {
  171.     next if (/^#/ || (/^\s*$/ && !$val)); # vire commmentaires + lignes vides
  172.     next if (/<\/file\>/) ;
  173.     #warn "caractères de contrôle" if /[œ‘’ –]/; # carac. Windows courants
  174.      # if (/\[(.*)\]/) { $f=$1 ; $f =~ s/\.ogg/\.mp3/g ;  $id = $prefix . $dir . 'mp3/' . $f ; }
  175.      s /\<tag\s*//g; s/\s*\/\>//g;
  176.       if (/\<file path=\"(.*)\"/) {$id=$1 ; $id = $prefix . $dir . $id ; }
  177.       if (/(\w+)\s*=\s*\"?(.*?)\"?\s*$/) { $r=Traite($2) ;
  178.         $field=canonify($1) ;
  179.         next if ($field =~ /($Extra|path)/) ;
  180.         $ref->{$field}->{$id} = $r if !($id =~ /GLOBAL/);
  181.     }
  182.   }
  183.   close(IN);
  184. }
  185.  
  186. sub Traite { my ($record) = @_;
  187.   $record =~ s/œ/oe/g;
  188.   $record =~ s/\x{153}/oe/g;
  189.   $record =~ tr/‘’ –/`' :/;
  190.   $record =~ s/\s+$//;
  191.   $record =~ s/ {2,}/ /;
  192.   $record ;
  193. }
  194.  
  195. sub canon { my ($special)=@_ ;
  196.   $special = "swac" . $special if !($special=~ /swac/) ;
  197.   $special =~  s/^(swac)/$lang/ if ($lang) ;
  198.   $special =~  s/swac/sw/ ;
  199.   $special =~ s/ //g;
  200.   $special ;
  201. }
  202.  
  203. sub canon2 { my ($special)=@_ ;
  204.   $special=canon($special) ;
  205.   $special . "_keys" ;
  206. }
  207.  
  208. sub canonify { my ($special)=@_ ;
  209.   $special =~ tr /A-Z/a-z/ ;
  210.   $special ;
  211. }
  212.  
  213. # $ref a reference to a %Tag2Tableau hash, @files a list of data files
  214.  
  215. sub InitFromFiles { my ($ref, @files) = @_;
  216.   for (@files) { ConsListe($_ . (($_) ? "/": "") . $file, $ref, (!($_ eq ".")  ? $_ . "/": ""),$PREFIX); }
  217. }
  218.  
  219. sub sortuniq {
  220.   my $prev = "not $_[0]";
  221.   grep { $_ ne $prev && ($prev = $_, 1) } sort @_;
  222. }
  223.  
  224. sub out { my ($text, $file) = @_ ;
  225.   open( OUT, ">$file") ;
  226.   ## fichier ouvert en utf8 mais il y a toujours les problèmes d'encodage
  227.   if ($MODE1 eq 'utf8') {binmode OUT ,":utf8";} else {binmode OUT ,":iso-8859-1"};
  228.   print OUT $text ;
  229.   close OUT ;
  230. }
  231.  
  232. sub usage {
  233.   print STDERR << "EOT"
  234. swac.pl crée les fichiers dont j'ai besoin pour mon utilisation dans wims :
  235.  - un fichier SWAC_keys contenant les adresses des fichiers audio :base_swac/nom
  236.  - des fichiers utilisables par "lookup" ; on peut en créer un par tags :
  237.   ils sont de la forme
  238.    " texte_du_tag_demande:adresse_audio1,adresse_audio2, ..."
  239.    le texte_du_tag a été un peu normalisé en enlevant les espaces en trop.
  240.    
  241. swac.pl [ --dir=]  [ --special=] [ --file= ] [ --mode=]
  242.  --dir= : les dossiers dans lesquels on va chercher le fichier
  243.  --file= le nom du fichier  (le même pour tous), par défaut index.tags.txt
  244.  --special= les index que l'on désire sortir : par défaut
  245.     tous ceux qui ne sont pas communs, sauf
  246.     SWAC_TECH_QLT|SWAC_TECH_DATE|SWAC_TECH_SOFT|DESCRIPTION
  247.     --mode= utf8 ou rien pour l'instant
  248. EOT
  249. ;
  250.  exit 1;
  251. }
  252.  
  253.