Subversion Repositories wimsdev

Rev

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