Newer
Older
alignement-pascal-francis / 04-generation_tei / alignment2tei.pl
@besagni besagni on 10 Nov 2021 60 KB Renommage des répertoires
#!/usr/bin/perl


# Déclaration des pragmas
use strict;
use utf8;
use open qw/:std :utf8/;

# Appel des modules externes de base
use Encode;
use Getopt::Long;

# Appel des modules spécifiques à l'application
use HTML::Entities qw(decode_entities %entity2char);
## use HTTP::CookieJar::LWP;
use JSON;
## use LWP::UserAgent;
use Text::Unidecode;
## use URI::Encode qw(uri_encode uri_decode);

my ($programme) = $0 =~ m|^(?:.*/)?(.+)|;
my  $substitut  = " " x (length($programme) - 2);
my $Version     = "1.9.2";
my $dateModif   = "7 Mars 2021";

my $usage = "Usage : \n" .
            "    $programme -f (fichier|-) -a fichier_align -d date -v version [ -l log ] \n" .
            "    $substitut [ -c répertoire_cc ] [ -r (0|1) ] [ -x ] \n" .
            "    $programme -h fichier_HFD -a fichier_align -d date -v version [ -l log ] \n" .
            "    $substitut [ -c répertoire_cc ] [ -r (0|1) ] [ -x ] \n" .
            "    $programme -i \n";
$substitut .= "  ";

my $align   = undef;
my $cc_dir  = "CC";
my $date    = undef;
my $fichier = undef;
my $hfd     = undef;
my $info    = undef;
my $log     = undef;
my $ready   = 1;
my $version = undef;
my $xclam   = 0;

eval    {
        $SIG{__WARN__} = sub {usage(1);};
        GetOptions(
                "align=s"   => \$align,
                "cc_dir=s"  => \$cc_dir,
                "date=s"    => \$date,
                "fichier=s" => \$fichier,
                "hfd=s"     => \$hfd,
                "info"      => \$info,
                "log=s"     => \$log,
                "ready=i"   => \$ready,
                "version=s" => \$version,
                "xclam"     => \$xclam,
                );
        };
$SIG{__WARN__} = sub {warn $_[0];};

if ( $info ) {
        print " \n";
        print "Programme : \n";
        print "    “$programme”, version $Version ($dateModif)\n";
        print "    Permet de créer les fichiers d’enrichissement avec les codes de classement \n";
        print "    et les mots-clés Pascal ou Francis au format TEI StandOff \n";
        print "\n";
        print $usage;
        print "\nOptions : \n";
        print "    -a  indique le nom du fichier résultat de l’alignement (qui peut être un \n";
        print "        fichier compressé avec “gzip” ou “bzip2”) \n";
        print "    -c  indique le nom du répertoire contenant les tables de correspondance \n";
        print "        entre codes et verbalisation \n";
        print "    -d  indique la date à laquelle a été fait l’alignement, en utilisant le format \n";
        print "        “aaaa-mm-jj” (par ex. “2020-09-28”) \n";
        print "    -f  indique le nom du fichier d’entrée (qui peut être un fichier compressé \n";
        print "        avec “gzip” ou “bzip2”). Pour utiliser l’entrée standard, mettre un \n";
        print "        tiret “-” comme argument \n";
        print "    -h  indique le nom du fichier HFD servant d’entrée au programme \n";
        print "    -i  affiche cette aide \n";
        print "    -l  indique le nom du fichier “log” contenant la liste des notices INIST \n";
        print "        appariées ainsi que les identifiants des documents ISTEX correspondants \n";
        print "    -r  crée l'organisation hiérarchique en 4 répertoires d’ISTEX si la valeur \n";
        print "        est 1 (valeur par défaut). Autrement, les fichiers sont créés dans le \n";
        print "        répertoire courant \n";
        print "    -v  indique le numéro de version du programme “matchStan2Istex.pl” utilisé \n";
        print "        pour réaliser l’alignement \n";
        print "    -x  accepte comme valides les appariements lorsque la valeur du score est \n";
        print "        suivie d’un point d’exclamation (“!”) \n";
        print " \n";

        exit 0;
        }

usage(2) if not $align or not $date or not $version;
usage(2) if not $fichier and not $hfd;
usage(2) if $fichier and $hfd;

if ( $date !~ /^(\d\d\d\d)-(\d\d)-(\d\d)\z/ ) {
        print STDERR "\n";
        print STDERR "$programme : erreur dans le format de la date ! \n";
        print STDERR "$substitut   Utilisez le format “aaaa-mm-jj”. \n";
        exit 3;
        }

if ( $version !~ /^\d+\.\d+\.\d+\z/ ) {
        print STDERR "\n";
        print STDERR "$programme : erreur dans le format de la version ! \n\n";
        print STDERR "Vérifiez la bonne version avec la commande : “matchStan2Istex.pl -i” \n";
        exit 4;
        }

if ( $cc_dir =~ m|^(.*)/\z| ) {
        $cc_dir = $1;
        }

# Variables
my $annee   = "";
my $inist   = "";
my $num     = 0;
my @matchs  = ();
my @parties = ();
my %base    = ();
my %canon   = ();
my %classe  = ();
my %equiv   = ();
my %francis = ();
my %lodex   = ();
my %match   = ();
my %verb    = ();

# Tables nécessaires aux verbalisation
my $verbPascalFr   = "$cc_dir/verbPascalFr.txt";
my $verbPascalEn   = "$cc_dir/verbPascalEn.txt";
my $verbFrancisFr  = "$cc_dir/verbFrancisFr.txt";
my $verbFrancisEn  = "$cc_dir/verbFrancisEn.txt";
my $equivCCPascal  = "$cc_dir/equivCCPascal.txt";
my $equivCCFrancis = "$cc_dir/equivCCFrancis.txt";
my $liensLodex     = "$cc_dir/liensLodex.txt";

# Lecture des tables
open(VPF, "<:utf8", $verbPascalFr) or die "$!,";
while(<VPF>) {
        chomp;
        s/\r//go;
        my ($code, $intitule) = split(/\t/);
        $verb{$code}{'FR'} = $intitule;
        }
close VPF;

open(VPE, "<:utf8", $verbPascalEn) or die "$!,";
while(<VPE>) {
        chomp;
        s/\r//go;
        my ($code, $intitule) = split(/\t/);
        $verb{$code}{'EN'} = $intitule;
        }
close VPE;

open(VFF, "<:utf8", $verbFrancisFr) or die "$!,";
while(<VFF>) {
        chomp;
        s/\r//go;
        my ($code, $intitule) = split(/\t/);
        $verb{$code}{'FR'} = $intitule;
        if ( $code =~ /^[567]\d\d\z/o ) {
                $francis{$code} ++;
                }
        }
close VFF;

open(VFE, "<:utf8", $verbFrancisEn) or die "$!,";
while(<VFE>) {
        chomp;
        s/\r//go;
        my ($code, $intitule) = split(/\t/);
        $verb{$code}{'EN'} = $intitule;
        }
close VFE;

open(EQP, "<:utf8", $equivCCPascal) or die "$!,";
while(<EQP>) {
        chomp;
        s/\r//go;
        my ($ac, $canon) = split(/\t/);
        my ($an, $code) = split(/-/, $ac);
        $equiv{'Pascal'}{$an}{$code} = $canon;
        $canon{'Pascal'}{$code}{$canon} ++;
        }
close EQP;

open(EQF, "<:utf8", $equivCCFrancis) or die "$!,";
while(<EQF>) {
        chomp;
        s/\r//go;
        my ($ca, $canon) = split(/\t/);
        if ( $canon =~ /^-(.+)/ ) {
                $canon = $1;
                }
#       if ( $canon =~ /^(.+?)-(.+)/o ) {
#               $canon = $1.$2;
#               }
        if ( $canon =~ /^(.+?) (.+)/o ) {
                $canon = "$1-$2";
                }
        my ($code, $an) = split(/#/, $ca);
#       if ( $code =~ /^(.+?)-(.+)/o ) {
#               $code = $1.$2;
#               }
        if ( $code =~ /^(.+?) (.+)/o ) {
                $code = "$1-$2";
                }
        $equiv{'Francis'}{$an}{$code} = $canon;
        }
close EQF;

open(LDX, "<:utf8", $liensLodex) or die "$!,";
while(<LDX>) {
        chomp;
        s/\r//go;
        my ($lien, $code, $intitule) = split(/\t/);
        $lodex{$code} = $lien;
        }
close LDX;

# Lecture du modèle de fichier
while(<DATA>) {
        next if /^\s*$/o;
        next if /^#/o;
        if ( /^%%\s+partie\s+(\d+)/o ) {
                $num = $1;
                }
        elsif ( /^%%\s+FIN/o ) {
                last;
                }
        else    {
                $parties[$num] .= $_;
                }
        }

# Modification de la date et du numéro de version
$parties[3] =~ s/%DATE%/$date/;
$parties[3] =~ s/%VERSION%/$version/;

# Complétion de la table des entitées HTML
#foreach my $item (qw/amp gt lt/) {
#       delete $entity2char{$item};
#       }
while(<DATA>) {
        next if /^\s*$/o;
        next if /^#/o;
        chomp;
        my ($num, $sgml) = split(/\t+/);
        next if $entity2char{$sgml};
        $entity2char{$sgml} = chr($num);
        }
close DATA;

my %trans = (
        "205" => 1,
        "210" => 1,
        "215" => 1,
        "220" => 1,
        "221" => 1,
        "222" => 1,
        "223" => 1,
        "224" => 1,
        "225" => 1,
        "226" => 1,
        "227" => 1,
        "230" => 1,
        "235" => 1,
        "240" => 1,
        "250" => 1,
        "260" => 1,
        "280" => 1,
        "295" => 1,
        );

my %voc = (
        "2" => "Sciences de la Terre",
        "9" => "Traductions",
        "X" => "Sciences exactes, Sciences de la vie, Technologies",
        "A" => "Art et archéologie",
        "B" => "Science administrative",
        "C" => "Sciences de l’éducation",
        "D" => "Gestion des entreprises",
        "E" => "Économie de l’énergie",
        "G" => "Bibliographie géographique internationale",
        "H" => "Préhistoire et protohistoire",
        "I" => "Histoire et sciences de la littérature",
        "J" => "Informatique et sciences juridiques",
        "L" => "Sciences du langage",
        "N" => "Éthnologie",
        "P" => "Philosophie",
        "R" => "Histoire et sciences des religions",
        "S" => "Sociologie",
        "T" => "Histoire des sciences et techniques",
        "U" => "Amérique latine",
        "V" => "Sciences humaines de la santé",
        "W" => "Économie générale",
        "1" => "Sciences de l’ingénieur",
        "3" => "Physique",
        );
my %nfe = (
        "agr" => "Agrovoc descriptor",
        "ar"  => "Architect",
        "cog" => "Geographical coordinate",
        "da"  => "Anion",
        "dc"  => "Cation",
        "de"  => "Enzyme",
        "dg"  => "Geography",
        "dp"  => "Psychometrics",
        "ds"  => "Systematics",
        "dw"  => "Virus",
        "fa"  => "Author",
        "fc"  => "Organic ligand",
        "fd"  => "Chronology",
        "fe"  => "Enzyme",
        "ff"  => "Pesticide",
        "fm"  => "Methodology",
        "fr"  => "Medicament",
        "fs"  => "Site",
        "fx"  => "Toxic",
        "na"  => "Anion",
        "nb"  => "Cited work",
        "nc"  => "Cation",
        "nd"  => "Date",
        "ne"  => "Technique",
        "nf"  => "Person (human being, divinity)",
        "ng"  => "Geography",
        "ni"  => "Matter-Concept",
        "nj"  => "Organization-Institution",
        "nk"  => "Chemical compound",
        "nl"  => "Language",
        "nm"  => "Disease",
        "nn"  => "Ethnic group",
        "no"  => "Celestial body",
        "np"  => "Psychometric test",
        "ns"  => "Systematics",
        "nt"  => "Soil",
        "nv"  => "Petrography",
        "nw"  => "Virus",
        "nx"  => "Stratigraphy",
        "ny"  => "Paleontology",
        "nz"  => "Mineralogy",
        "sa"  => "Works (buildings)",
        "si"  => "Information system",
        "tec" => "Commercial name. Technical name",
        "vf"  => "Pesticides",
        "vk"  => "Chemical terms",
        "vr"  => "Medicaments",
        "vx"  => "Toxics",
        "CD"  => "Candidate keyword",
        "INC" => "Uncontrolled term",
        );
my %nff = (
        "agr" => "Descripteur Agrovoc",
        "ar"  => "Architecte",
        "cog" => "Coordonnée géographique",
        "da"  => "Anion",
        "dc"  => "Cation",
        "de"  => "Enzyme",
        "dg"  => "Géographie",
        "dp"  => "Psychométrie",
        "ds"  => "Systématique",
        "dw"  => "Virus",
        "fa"  => "Auteur",
        "fc"  => "Coordinat organique",
        "fd"  => "Chronologie",
        "fe"  => "Enzyme",
        "ff"  => "Pesticide",
        "fm"  => "Méthodologie",
        "fr"  => "Médicament",
        "fs"  => "Site",
        "fx"  => "Toxique",
        "na"  => "Anion",
        "nb"  => "Oeuvre citée",
        "nc"  => "Cation",
        "nd"  => "Date",
        "ne"  => "Technique",
        "nf"  => "Personne (être humain, divinité)",
        "ng"  => "Géographie",
        "ni"  => "Matière-Concept",
        "nj"  => "Organisme-Institution",
        "nk"  => "Composé chimique",
        "nl"  => "Langue",
        "nm"  => "Maladie",
        "nn"  => "Ethnie",
        "no"  => "Objet céleste",
        "np"  => "Test de psychométrie",
        "ns"  => "Systématique",
        "nt"  => "Sol",
        "nv"  => "Pétrographie",
        "nw"  => "Virus",
        "nx"  => "Stratigraphie",
        "ny"  => "Paléontologie",
        "nz"  => "Minéralogie",
        "sa"  => "Ouvrages (bâtiments)",
        "si"  => "Système d'information",
        "tec" => "Nom commercial. Nom technique",
        "vf"  => "Pesticides",
        "vk"  => "Termes chimiques",
        "vr"  => "Médicaments",
        "vx"  => "Toxiques",
        "CD"  => "Candidat descripteur",
        "INC" => "Terme non contrôlé",
        );

if ( $align =~ /\.gz\z/o ) {
        open(INP, "gzip -cd $align |") or die "$!,";
        binmode(INP, ":utf8");
        }
elsif ( $align =~ /\.bz2\z/o ) {
        open(INP, "bzip2 -cd $align |") or die "$!,";
        binmode(INP, ":utf8");
        }
else    {
        open(INP, "<:utf8", $align) or die "$!,";
        }

if ( $log ) {
        open(LOG, ">:utf8", $log) or die "$!,";
        }
else    {
        open(LOG, ">:utf8", "/dev/null") or die "$!,";
        }

while(<INP>) {
        if (/^([_.0\*\+]+\x{00A0}*)\t(\d\.\d+)(!?)\t/o) {
                my $score  = $1;
                my $grade  = $2;
                my $statut = $3;
                $statut = undef if not $xclam;
                if ( $grade < 3.490 and not $statut ) {
                        $inist = undef;
                        next;
                        }
                chomp;
                my @champs = split(/\t/);
                $inist     = $champs[3];
                my $id     = $champs[17];
                my $ark    = $champs[18];
                my $doi    = $champs[19];
                my $pii    = $champs[20];
                my $pmid   = $champs[21];
                print LOG "$inist\t$grade$statut\t$id\t$ark\t$doi\t$pii\t$pmid\n";
                push(@{$match{$inist}}, "$id\t$ark\t$doi\t$pii\t$pmid");
                }
        elsif (/^([_.0\*\+]+\x{00A0}*)\t(\d\.\d+)\W\t/o) {
                $inist = undef;
                }
        elsif ( /^ ~~> \t/o ) {
                next if not $inist;
                chomp;
                my @champs = split(/\t/);
                my $id     = $champs[5];
                my $ark    = $champs[6];
                my $doi    = $champs[7];
                my $pii    = $champs[8];
                my $pmid   = $champs[9];
                print LOG "$inist\t \" \" \t$id\t$ark\t$doi\t$pii\t$pmid\n";
                push(@{$match{$inist}}, "$id\t$ark\t$doi\t$pii\t$pmid");
                }
        }
close INP;

if ( $fichier ) {
        if ( $fichier =~ /\.gz\z/o ) {
                open(INP, "gzip -cd $fichier |") or die "$!,";
                binmode(INP, ":raw");
                }
        elsif ( $fichier =~ /\.bz2\z/o ) {
                open(INP, "bzip2 -cd $fichier |") or die "$!,";
                binmode(INP, ":raw");
                }
        else    {
                open(INP, "<:raw", $fichier) or die "$!,";
                }
        }
elsif ( $hfd ) {
        open(INP, "IhfdCat $hfd |") or die "$!,";
        binmode(INP, ":raw");
        }

while(<INP>) {
#       ($inist) = m|<fA47 dir=\d+><s0>((?:\d\d\d-)?\d\d-\d+)</s0></fA47>|o;
        ($inist) = m|<fA47 dir=\d+><s0>(.+?)</s0></fA47>|o;
        next if not defined $match{$inist};

        $annee = undef;
        if ( $inist =~ /^(\d\d)-\d+\z/o ) {
                $annee = $1;
                }
        elsif ( $inist =~ /^\d\d\d[-.](\d\d)[-.]\d+\z/o ) {
                $annee = $1;
                }
        else    {
                print STDERR "N° INIST incorrect \"$inist\"\n";
                }
        if ( $annee > 50 ) {
                $annee = "19$annee";
                }
        else    {
                $annee = "20$annee";
                }

        my @codes = ();
        foreach my $item (m|(<fC02 dir=\w+>.+?</fC02>)|go) {
                if ( $item =~ m|<fC02 dir=(\d\d)(\w)000><s0>(([567]\d\d)(.*?))</s0><s1>(.+?)</s1>|o ) {
                        my $pos  = $1;
                        my $base = $2;
                        my $code = $3;
                        if ( $5 ) {
                                $code = "$4-$5";
                                }
                        elsif ( $codes[$#codes] =~ /^$code/ ) {
                                next;
                                }
                        $codes[$pos]  = "$base:$code";
                        $base{$code} = "$4";
                        $classe{$code} = "$4-$6";
                        }
                elsif ( $item =~ m|<fC02 dir=(\d\d)(\w)000><s0>(.+?)</s0>|o ) {
                        my $pos  = $1;
                        my $base = $2;
                        my $code = $3;
                        if ( $code =~ /^([567]\d\d)(\w+)\z/o ) {
                                $code = "$1-$2" if $francis{$1};
                                }
                        elsif ( $code =~ /^(2\d\d)\w*\z/o ) {
                                next if $trans{$1};
                                }
                        else    {
                                if ( $code =~ /^001B40F30A[12]\z/o ) {
                                        $code .= "0";
                                        }
                                elsif ( $code =~ /^002B31\w+\z/o ) {
                                        $code = "002B31";
                                        }
                                }
                        $codes[$pos] = "$base:$code";
                        }
                elsif ( $item =~ m|<fC02 dir=(\d\d)(\w)000><s1>(.+?)</s1>|o ) {
#                       my $pos  = $1;
#                       my $base = $2;
                        my $code = $3;
                        if ( $code =~ /^[IVXL]+\z/o ) {
                                if ( $codes[$#codes] =~ /^\w:(([567]\d\d)-?\w+)\z/o ) {
                                        $classe{$1} = "$2-$code";
                                        }
                                }
                        }
                }
        my %specifiques = ();
        my %generiques  = ();
        foreach my $item (m|(<fC03 dir=\w+>.+?</fC03>)|go) {
                my $langue = "";
                my $numero = "";
                my $ig2    = "";
                my $motcle = "";
                my $type   = "";
                my @nf     = ();
                if ( $item =~ m|<fC03 dir=(\d\d)(\w)(\w+)>|o ) {
                        $langue = $3;
                        $numero = $1;
                        $ig2    = $2;
                        }
                if ( $item =~ m|<s0>(.+?)</s0>|o ) {
                        $motcle = decode_entities($1);
                        $motcle =~ s/^\s+//o;
                        $motcle =~ s/\s+\z//o;
                        $motcle =~ s/\s\s+/ /go;
                        }
                if ( $item =~ m|<s2>.+?</s2>|o ) {
                        next if $item =~ m|<s2>PAC</s2>|o;
                        my %tmp = ();
                        foreach my $nf ($item =~ m|<s2>(.+?)</s2>|go) {
                                next if $tmp{$nf} ++;
                                push(@nf, $nf);
                                }
                        }
                if ( $item =~ m#<s4>(CD|INC)</s4>#io ) {
                        $type = $1;
                        }
                $specifiques{$langue}{$numero}{$motcle}{'voc'} = $ig2;
                if ( @nf ) {
                        push(@{$specifiques{$langue}{$numero}{$motcle}{'nf'}}, @nf);
                        }
                if ( $type ) {
                        $specifiques{$langue}{$numero}{$motcle}{'type'} = $type;
                        }
                }
        foreach my $item (m|(<fC07 dir=\w+>.+?</fC07>)|go) {
                my $langue = "";
                my $numero = "";
                my $ig2    = "";
                my $motcle = "";
                my $type   = "";
                my @nf     = ();
                if ( $item =~ m|<fC07 dir=(\d\d)(\w)(\w+)>|o ) {
                        $langue = $3;
                        $numero = $1;
                        $ig2    = $2;
                        }
                if ( $item =~ m|<s0>(.+?)</s0>|o ) {
                        $motcle = decode_entities($1);
                        $motcle =~ s/^\s+//o;
                        $motcle =~ s/\s+\z//o;
                        $motcle =~ s/\s\s+/ /go;
                        }
                if ( $item =~ m|<s2>.+?</s2>|o ) {
                        my %tmp = ();
                        foreach my $nf ($item =~ m|<s2>(.+?)</s2>|go) {
                                next if $tmp{$nf} ++;
                                push(@nf, $nf);
                                }
                        }
                if ( $item =~ m#<s4>(CD|INC)</s4>#io ) {
                        $type = $1;
                        }
                $generiques{$langue}{$numero}{$motcle}{'voc'} = $ig2;
                if ( @nf ) {
                        push(@{$generiques{$langue}{$numero}{$motcle}{'nf'}}, @nf);
                        }
                if ( $type ) {
                        $generiques{$langue}{$numero}{$motcle}{'type'} = $type;
                        }
                }
        foreach my $istex (@{$match{$inist}}) {
                my ($id, $ark, $doi, $pii, $pmid) = split(/\t/, $istex);
                if ( $ready ) {
                        my $chemin = substr($id, 0, 1);
                        if ( not -d $chemin ) {
                                mkdir($chemin, 0755) or die "$!,";
                                }
                        $chemin .= "/" . substr($id, 1, 1);
                        if ( not -d $chemin ) {
                                mkdir($chemin, 0755) or die "$!,";
                                }
                        $chemin .= "/" . substr($id, 2, 1);
                        if ( not -d $chemin ) {
                                mkdir($chemin, 0755) or die "$!,";
                                }
                        $chemin .= "/$id";
                        if ( not -d $chemin ) {
                                mkdir($chemin, 0755) or die "$!,";
                                }
                        open(TEI, ">:utf8", "$chemin/${id}_ipf.tei") or die "$!,";
                        }
                else    {
                        open(TEI, ">:utf8", "${id}_ipf.tei") or die "$!,";
                        }
                print TEI $parties[1];
                my $marge = 24;
                print TEI " " x $marge, "<idno type=\"ISTEX\">$id</idno>\n";
                print TEI " " x $marge, "<idno type=\"ARK\">$ark</idno>\n";
                print TEI " " x $marge, "<idno type=\"INIST\">$inist</idno>\n";
                if ( $doi ) {
                        print TEI " " x $marge, "<idno type=\"DOI\">$doi</idno>\n";
                        }
                if ( $pii ) {
                        print TEI " " x $marge, "<idno type=\"PII\">$pii</idno>\n";
                        }
                if ( $pmid ) {
                        print TEI " " x $marge, "<idno type=\"PMID\">$pmid</idno>\n";
                        }
                print TEI $parties[3];
                if ( @codes ) {
                        my @tmp = grep(/:00[12]/o, @codes);
                        if ( @tmp ) {
                                @codes = @tmp;
                                }
                        (my $tmp = $parties[4]) =~ s/%YEAR%/$annee/;
                        print TEI $tmp;
                        my @lignes = codes('FR', @codes);
                        print TEI @lignes;
                        print TEI $parties[6];
                        ($tmp = $parties[7]) =~ s/%YEAR%/$annee/;
                        print TEI $tmp;
                        @lignes = codes('EN', @codes);
                        print TEI @lignes;
                        print TEI $parties[9]
                        # En l’absence de verbalisations espagnoles,
                        # on ne fait pas (pour l’instant) les parties
                        # 10 à 12
                        }
                if ( defined $specifiques{'FRE'} or defined $generiques{'FRE'} ) {
                        my @lignes = ();
                        print TEI $parties[13];
                        if ( defined $specifiques{'FRE'} ) {
                                @lignes = motscles('FRE', %specifiques);
                                print TEI @lignes;
                                }
                        if ( defined $generiques{'FRE'} ) {
                                @lignes = motscles('FRE', %generiques);
                                print TEI @lignes;
                                }
                        print TEI $parties[15]
                        }
                if ( defined $specifiques{'ENG'} or defined $generiques{'ENG'} ) {
                        my @lignes = ();
                        print TEI $parties[16];
                        if ( defined $specifiques{'ENG'} ) {
                                @lignes = motscles('ENG', %specifiques);
                                print TEI @lignes;
                                }
                        if ( defined $generiques{'ENG'} ) {
                                @lignes = motscles('ENG', %generiques);
                                print TEI @lignes;
                                }
                        print TEI $parties[18]
                        }
                if ( defined $specifiques{'SPA'} or defined $generiques{'SPA'} ) {
                        my @lignes = ();
                        print TEI $parties[19];
                        if ( defined $specifiques{'SPA'} ) {
                                @lignes = motscles('SPA', %specifiques);
                                print TEI @lignes;
                                }
                        if ( defined $generiques{'SPA'} ) {
                                @lignes = motscles('SPA', %generiques);
                                print TEI @lignes;
                                }
                        print TEI $parties[21]
                        }
                print TEI $parties[22];
                close TEI;
                }
        }
close INP;


exit 0;


sub usage
{
print STDERR "\n$usage\n";

exit shift;
}

sub niveaux
{
my $code = shift;

my @niveaux = ();
$niveaux[0] = 0;

if ( $code =~ /^2\d\d/o ) {
        if ( $code =~ /^(((2\d\d)[A-Z])\d\d)/o ) {
                $niveaux[1] = $3;
                $niveaux[2] = $2;
                $niveaux[3] = $1;
                $niveaux[0] = 3;
                }
        elsif ( $code =~ /^((2\d\d)[A-Z])/o ) {
                $niveaux[1] = $2;
                $niveaux[2] = $1;
                $niveaux[0] = 2;
                }
        elsif ( $code =~ /^(2\d\d)/o ) {
                $niveaux[1] = $1;
                $niveaux[0] = 1;
                }
        }
elsif ( $code =~ /^00[12][A-Z]/o ) {
        if ( $code =~ /^(((((((00[12][A-Z])\d\d)[A-Z])\d\d)[A-Z])\d)[A-Z])/o ) {
                $niveaux[1] = $7;
                $niveaux[2] = $6;
                $niveaux[3] = $5;
                $niveaux[4] = $4;
                $niveaux[5] = $3;
                $niveaux[6] = $2;
                $niveaux[7] = $1;
                $niveaux[0] = 7;
                }
        elsif ( $code =~ /^((((((00[12][A-Z])\d\d)[A-Z])\d\d)[A-Z])\d)/o ) {
                $niveaux[1] = $6;
                $niveaux[2] = $5;
                $niveaux[3] = $4;
                $niveaux[4] = $3;
                $niveaux[5] = $2;
                $niveaux[6] = $1;
                $niveaux[0] = 6;
                }
        elsif ( $code =~ /^(((((00[12][A-Z])\d\d)[A-Z])\d\d)[A-Z])/o ) {
                $niveaux[1] = $5;
                $niveaux[2] = $4;
                $niveaux[3] = $3;
                $niveaux[4] = $2;
                $niveaux[5] = $1;
                $niveaux[0] = 5;
                }
        elsif ( $code =~ /^((((00[12][A-Z])\d\d)[A-Z])\d\d)/o ) {
                $niveaux[1] = $4;
                $niveaux[2] = $3;
                $niveaux[3] = $2;
                $niveaux[4] = $1;
                $niveaux[0] = 4;
                }
        elsif ( $code =~ /^(((00[12][A-Z])\d\d)[A-Z])/o ) {
                $niveaux[1] = $3;
                $niveaux[2] = $2;
                $niveaux[3] = $1;
                $niveaux[0] = 3;
                }
        elsif ( $code =~ /^((00[12][A-Z])\d\d)/o ) {
                $niveaux[1] = $2;
                $niveaux[2] = $1;
                $niveaux[0] = 2;
                }
        elsif ( $code =~ /^(00[12][A-Z])/o ) {
                $niveaux[1] = $1;
                $niveaux[0] = 1;
                }
        }
elsif ( $code =~ /^([567]\d\d)/o) {
        if ( $base{$code} ) {
                $niveaux[1] = $base{$code};
                }
        else    {
                $niveaux[1] = $1;
                }
        $niveaux[0] = 1;
        if ( $classe{$code} ) {
                $niveaux[2] = $classe{$code};
                $niveaux[0] = 2;
                }
        if ( $code ne $niveaux[1] ) {
                push(@niveaux, $code);
                $niveaux[0] ++;
                }
        }

return @niveaux;
}

sub codes
{
my ($langue, @liste) = @_;

my $ligne   = "";
my $marge   = 16;
my @lignes  = ();
my %dejaVu  = ();
my %inconnu = ();

# my $ligne = " " x $marge . "<keywords resp=\"#inist-cnrs\" ";
# $ligne .= "scheme=\"https://inist-category.data.istex.fr\">\n";
# push(@lignes, $ligne);

foreach my $item (@liste) {
        next if not $item;
        my ($code) = $item =~ /^.:(.+)/o;
        my @niveaux = niveaux($code);
        if ( $code =~ /^00[12]/o ) {
                for ( my $nb = $niveaux[0] ; $nb > 0 ; $nb -- ) {
                        my $cc = $niveaux[$nb];
                        if ( not defined $equiv{'Pascal'}{$annee}{$cc} and 
                             not defined $verb{$cc} ) {
                                if ( defined $canon{'Pascal'}{$cc} ) {
                                        my @canon = keys %{$canon{'Pascal'}{$cc}};
                                        if ( $#canon == 0 ) {
                                                $equiv{'Pascal'}{$annee}{$cc} = $canon[0];
                                                }
                                        else    {
                                                my @items = sort {$canon{'Pascal'}{$b} <=> $canon{'Pascal'}{$a}} @canon;
                                                $equiv{'Pascal'}{$annee}{$cc} = $items[0];
                                                }
                                        }
                                else    {
                                        $inconnu{$cc} ++;
                                        if ( $nb == $niveaux[0] ) {
                                                $niveaux[0] --;
                                                }
                                        }
                                }
                        }
                
                }
        next if $niveaux[0] < 1;
        next if $dejaVu{$niveaux[$niveaux[0]]};
        $dejaVu{$niveaux[$niveaux[0]]} ++;
        $ligne = " " x $marge . "<keywords resp=\"#inist-cnrs\" ";
        $ligne .= "scheme=\"https://inist-category.data.istex.fr\">\n";
        push(@lignes, $ligne);
        $marge += 4;
        for ( my $nb = 1 ; $nb <= $niveaux[0] ; $nb ++ ) {
                my $cc = $niveaux[$nb];
                $ligne = " " x $marge . "<term key=\"$niveaux[$nb]\" level=\"$nb\"";
                if ( $equiv{'Pascal'}{$annee}{$cc} and
                     $equiv{'Pascal'}{$annee}{$cc} ne $cc and
                     defined $verb{$equiv{'Pascal'}{$annee}{$cc}}{$langue} ) {
                        my $equiv = $equiv{'Pascal'}{$annee}{$cc};
                        if ( $lodex{$equiv} ) {
                                $ligne .= " ref=\"$lodex{$equiv}\"";
                                }
                        $ligne .= ">\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 4) . "<term>$verb{$equiv}{$langue}</term>\n";
                        push(@lignes, $ligne);
                        $ligne = " " x $marge . "</term>\n";
                        push(@lignes, $ligne);
                        }
                elsif ( $equiv{'Francis'}{$annee}{$cc} and
                        $equiv{'Francis'}{$annee}{$cc} ne $cc and
                        defined $verb{$equiv{'Francis'}{$annee}{$cc}}{$langue} ) {
                        my $equiv = $equiv{'Francis'}{$annee}{$cc};
                        if ( $lodex{$equiv} ) {
                                $ligne .= " ref=\"$lodex{$equiv}\"";
                                }
                        $ligne .= ">\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 4) . "<term>$verb{$equiv}{$langue}</term>\n";
                        push(@lignes, $ligne);
                        $ligne = " " x $marge . "</term>\n";
                        push(@lignes, $ligne);
                        }
                elsif ( defined $verb{$cc}{$langue} ) {
                        if ( $lodex{$cc} ) {
                                $ligne .= " ref=\"$lodex{$cc}\"";
                                }
                        $ligne .= ">\n";
                        push(@lignes, $ligne);
                        if ( $inconnu{$cc} ) {
                                if ( $langue eq 'FR' ) {
                                        $ligne = " " x ($marge + 4) . "<note>Intitulé absent</note>\n";
                                        }
                                elsif ( $langue eq  'EN' ) {
                                        $ligne = " " x ($marge + 4) . "<note>Term not available</note>\n";
                                        }
                                }
                        else    {
                                $ligne = " " x ($marge + 4) . "<term>$verb{$cc}{$langue}</term>\n";
                                }
                        push(@lignes, $ligne);
                        $ligne = " " x $marge . "</term>\n";
                        push(@lignes, $ligne);
                        }
                else    {
                        print STDERR "Notice \"$inist\" : pas de verbalisation pour \"$cc\"\n";
                        }
                }
        $marge -= 4;
        push(@lignes, " " x $marge . "</keywords>\n");
        }

return @lignes
}

sub motscles
{
my ($langue, %motscles) = @_;

my $marge = 20;
my @lignes = ();

my $rnf = \%nff;
if ( $langue eq 'ENG' ) {
        $rnf = \%nfe;
        }

foreach $num (sort {$a <=> $b} keys %{$motscles{$langue}}) {
        my ($motcle) = keys %{$motscles{$langue}{$num}};
        my $type = undef;
        my @nf = ();
        if ( defined $motscles{$langue}{$num}{$motcle}{'type'} ) {
                $type = $motscles{$langue}{$num}{$motcle}{'type'};
                }
        if ( defined $motscles{$langue}{$num}{$motcle}{'nf'} ) {
                @nf = @{$motscles{$langue}{$num}{$motcle}{'nf'}};
                }
        my $ligne = " " x $marge . "<term>\n";
        push(@lignes, $ligne);
        $ligne = " " x $marge . "    <term>$motcle</term>\n";
        push(@lignes, $ligne);
        if ( @nf or $type ) {
                $marge += 4;
#               my $ligne = " " x $marge . "<fs type=\"codes-inist\">\n";
#               push(@lignes, $ligne);
                foreach my $nf (@nf) {
                        my $intitule = $nf;
                        if ( defined $rnf->{$nf} ) {
                                $intitule = $rnf->{$nf};
                                }
                        elsif ( defined $rnf->{lc($nf)} ) {
                                $intitule = $rnf->{lc($nf)};
                                }
                        elsif ( $nf =~ /^[lqt][1-9]\z/io ) {
                                next;
                                }
                        else    {
                                print STDERR "Notice \"$inist\" : NF \"$nf\" pour ";
                                print STDERR "mot-clé \"$motcle\"\n";
                                next;
                                }
                        my $ligne = " " x $marge . "<fs type=\"codes-inist\">\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 4) . "<f name=\"nature-fonction\">\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 8) . "<symbol value=\"$nf\" />\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 4) . "</f>\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 4) . "<f name=\"nature-fonction\">\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 8) . "<string>$intitule</string>\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 4) . "</f>\n";
                        push(@lignes, $ligne);
                        $ligne = " " x $marge . "</fs>\n";
                        push(@lignes, $ligne);
                        }
                if ( $type ) {
                        my $ligne = " " x $marge . "<fs type=\"codes-inist\">\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 4) . "<f name=\"statut\">\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 8) . "<symbol value=\"$type\" />\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 4) . "</f>\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 4) . "<f name=\"statut\">\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 8) . "<string>$rnf->{$type}</string>\n";
                        push(@lignes, $ligne);
                        $ligne = " " x ($marge + 4) . "</f>\n";
                        push(@lignes, $ligne);
                        $ligne = " " x $marge . "</fs>\n";
                        push(@lignes, $ligne);
                        }
#               $ligne = " " x $marge . "</fs>\n";
#               push(@lignes, $ligne);
                $marge -= 4;
                }
        $ligne = " " x $marge . "</term>\n";
        push(@lignes, $ligne);
        }

return @lignes;
}



__DATA__

%% partie 1

<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="https://xml-schema.delivery.istex.fr/formats/tei-istex.xsd"
     xmlns:ns1="https://xml-schema.delivery.istex.fr/formats/ns1.xsd">
    <ns1:standOff>
        <teiHeader>
            <fileDesc>
                <titleStmt>
                    <title>Alignement Pascal/Francis — ISTEX</title>
                    <respStmt>
                        <resp>enrichissement INIST-CNRS</resp>
                        <name resp="inist-cnrs">INIST-CNRS</name>
                    </respStmt>
                </titleStmt>
                <publicationStmt>
                    <authority>ISTEX</authority>
                    <availability status="restricted">
                        <licence target="http://creativecommons.org/licenses/by/4.0/">
                            <p> L’élément standOff de ce document est distribué sous licence
                                Creative Commons 4.0 non transposée (CC BY 4.0) </p>
                            <p> Ce standOff a été créé dans le cadre du projet ISTEX – Initiative
                                d’Excellence en Information Scientifique et Technique </p>
                        </licence>
                    </availability>
                </publicationStmt>
                <sourceDesc>
                    <bibl type="istex-host">

%% partie 2     #

                        <idno type="ISTEX">D6F3AA7EDD75E1885C4BB439D518F98194569F42</idno>
                        <idno type="INIST">95-0599541</idno>
                        <idno type="REFCODE">6340873</idno>

%% partie 3

                    </bibl>
                </sourceDesc>
            </fileDesc>
            <encodingDesc>
                <appInfo>
                    <application ident="matchStan2Istex.pl" version="%VERSION%">
                        <label>Indexation Pascal/Francis</label>
                    </application>
                </appInfo>
            </encodingDesc>
            <revisionDesc>
                <change when="%DATE%" who="inist-cnrs" xml:id="matchStan2Istex.pl">Alignement Pascal/Francis — Istex</change>
            </revisionDesc>
        </teiHeader>

%% partie 4

        <ns1:listAnnotation type="category" xml:lang="fr">
            <date>%YEAR%</date>
            <annotationBlock>

%% partie 5     #

                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">SCIENCES APPLIQUEES.</term>
                    <term key="001D14" level="2" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-0GLS0ZKS-L">BATIMENT. TRAVAUX PUBLICS.</term>
                    <term key="001D14G" level="3">Matériaux</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">SCIENCES APPLIQUEES.</term>
                    <term key="001D10" level="2">INDUSTRIE DES POLYMERES, PEINTURES, BOIS.</term>
                    <term key="001D10A" level="3">Technologie des polymères</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">SCIENCES APPLIQUEES.</term>
                    <term key="001D08" level="2">INDUSTRIES CHIMIQUE ET PARACHIMIQUE.</term>
                    <term key="001D08B" level="3">Matériaux de construction. Céramique. Verres.</term>
                    <term key="001D08B06" level="4">Verres.</term>
                    <term key="001D08B06C" level="5">Structure, analyse, propriétés</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">SCIENCES APPLIQUEES.</term>
                    <term key="001D14" level="2" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-0GLS0ZKS-L">BATIMENT. TRAVAUX PUBLICS.</term>
                    <term key="001D14C" level="3">Calcul des constructions. Sollicitations.</term>
                    <term key="001D14C01" level="4">Résistance des matériaux (élasticité, plasticité, flambage, etc.)</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="295" level="1">BATIMENT. TRAVAUX PUBLICS.</term>
                </keywords>

%% partie 6

            </annotationBlock>
        </ns1:listAnnotation>

%% partie 7

        <ns1:listAnnotation type="category" xml:lang="en">
            <date>%YEAR%</date>
            <annotationBlock>

%% partie 8     #

                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">APPLIED SCIENCES.</term>
                    <term key="001D14" level="2" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-0GLS0ZKS-L">BUILDINGS. PUBLIC WORKS.</term>
                    <term key="001D14G" level="3">Materials</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">APPLIED SCIENCES.</term>
                    <term key="001D10" level="2">POLYMER INDUSTRY, PAINTS, WOOD.</term>
                    <term key="001D10A" level="3">Technology of polymers.</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">APPLIED SCIENCES.</term>
                    <term key="001D08" level="2">CHEMICAL INDUSTRY AND CHEMICALS.</term>
                    <term key="001D08B" level="3">Building materials. Ceramics. Glasses.</term>
                    <term key="001D08B06" level="4">Glasses.</term>
                    <term key="001D08B06C" level="5">Structure, analysis, properties</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">APPLIED SCIENCES.</term>
                    <term key="001D14" level="2" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-0GLS0ZKS-L">BUILDINGS. PUBLIC WORKS.</term>
                    <term key="001D14C" level="3">Structural analysis. Stresses.</term>
                    <term key="001D14C01" level="4">Strength of materials (elasticity, plasticity, buckling, etc.)</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="295" level="1">BUILDINGS. PUBLIC WORKS.</term>
                </keywords>

%% partie 9

            </annotationBlock>
        </ns1:listAnnotation>

%% partie 10

        <ns1:listAnnotation type="category" xml:lang="es">
            <annotationBlock>

%% partie 11    #

                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">CIENCIAS APLICADAS.</term>
                    <term key="001D14" level="2" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-0GLS0ZKS-L">Edificios; Obras publicas</term>
                    <term key="001D14G" level="3">Materiales</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">CIENCIAS APLICADAS.</term>
                    <term key="001D10" level="2">INDUSTRIA DEL POLIMERO, PINTURAS, MADERAS.</term>
                    <term key="001D10A" level="3">Tecnologia de los polimeros</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">CIENCIAS APLICADAS.</term>
                    <term key="001D08" level="2">Quimica. Ciencia de los materiales.</term>
                    <term key="001D08B" level="3">Materiales de construcción. Cerámica. Vidrio.</term>
                    <term key="001D08B06" level="4">Vidrio</term>
                    <term key="001D08B06C" level="5">Estructura, análisis, propiedades.</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="001D" level="1" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-H0T3FBJN-Q">CIENCIAS APLICADAS.</term>
                    <term key="001D14" level="2" ref="https://inist-category.data.istex.fr/ark:/67375/RZL-0GLS0ZKS-L">Edificios; Obras publicas</term>
                    <term key="001D14C" level="3">Calculo de las construcciones; Solicitaciones</term>
                    <term key="001D14C01" level="4">Resistencia de los materiales (elasticidad, plasticidad, pandeo, etc.)</term>
                </keywords>
                <keywords resp="#inist-cnrs" scheme="https://inist-category.data.istex.fr">
                    <term key="295" level="1">Edificios; Obras publicas</term>
                </keywords>

%% partie 12

            </annotationBlock>
        </ns1:listAnnotation>

%% partie 13

        <ns1:listAnnotation type="keyphrase" xml:lang="fr">
            <annotationBlock>
                <keywords resp="#inist-cnrs">

%% partie 14

                    <term>
                        <term>Composite hybride</term>
                        <fs type="codes-inist">
                            <f name="statut">
                                <symbol value="CD"/>
                            </f>
                            <f name="statut">
                                <string>Candidat descripteur</string>
                            </f>
                        </fs>
                    </term>
                    <term>Experience</term>
                    <term>
                        <term>Ethylène polymère</term>
                        <fs type="codes-inist">
                            <f name="nature-fonction">
                                <symbol value="NK"/>
                            </f>
                            <f name="nature-fonction">
                                <string>Composé chimique</string>
                            </f>
                        </fs>
                    </term>
                    <term>Fibre verre</term>

%% partie 15

                </keywords>
            </annotationBlock>
#           <!-- faire un annotationBlock pour chaque référentiel utilisé dans l'indexation du document,
#                en indiquant le nom du référentiel dans l'attribut "scheme" de la balise <keywords>...-->
        </ns1:listAnnotation>

%% partie 16

        <ns1:listAnnotation type="keyphrase" xml:lang="en">
            <annotationBlock>
                <keywords resp="#inist-cnrs">

%% partie 17    #

                    <term>
                        <term>Hybrid composites</term>
                        <fs type="codes-inist">
                            <f name="statut">
                                <symbol value="CD"/>
                            </f>
                            <f name="statut">
                                <string>Descriptor candidate</string>
                            </f>
                        </fs>
                    </term>
                    <term>
                        <term>Flexural modulus</term>
                        <fs type="codes-inist">
                            <f name="statut">
                                <symbol value="INC"/>
                            </f>
                            <f name="statut">
                                <string>Uncontrolled index</string>
                            </f>
                        </fs>
                    </term>
                    <term>
                        <term>Interlaminar shear strength</term>
                        <fs type="codes-inist">
                            <f name="statut">
                                <symbol value="INC"/>
                            </f>
                            <f name="statut">
                                <string>Uncontrolled index</string>
                            </f>
                        </fs>
                    </term>
                    <term>Experiments</term>
                    <term>
                        <term>Polyethylenes</term>
                        <fs type="codes-inist">
                            <f name="nature-fonction">
                                <symbol value="NK"/>
                            </f>
                            <f name="nature-fonction">
                                <string>Chemical compound</string>
                            </f>
                        </fs>
                    </term>
                    <term>Glass fibers</term>

%% partie 18

                </keywords>
            </annotationBlock>
        </ns1:listAnnotation>

%% partie 19

        <ns1:listAnnotation type="keyphrase" xml:lang="es">
            <annotationBlock>
                <keywords resp="#inist-cnrs">

%% partie 20    #

                    <term>
                        <term>Compuesto hibrido</term>
                        <fs type="codes-inist">
                            <f name="statut">
                                <symbol value="CD"/>
                            </f>
                            <f name="statut">
                                <string>Candidato descriptor</string>
                            </f>
                        </fs>
                    </term>
                    <term>Experiencia</term>
                    <term>
                        <term>Etileno polímero</term>
                        <fs type="codes-inist">
                            <f name="nature-fonction">
                                <symbol value="NK"/>
                            </f>
                            <f name="nature-fonction">
                                <string>Compuesto quimico</string>
                            </f>
                        </fs>
                    </term>
                    <term>Fibra vidrio</term>

%% partie 21

                </keywords>
            </annotationBlock>
        </ns1:listAnnotation>

%% partie 22

    </ns1:standOff>
</TEI>

%% FIN

##
##  Liste d’entités caractères
##

##
##  NE PAS MODIFIER !
##
##  DO NOT EDIT!
##

33	excl
34	dquot
35	num
36	dollar
37	percnt
40	lpar
41	rpar
42	ast
43	plus
44	comma
45	hyphen
46	period
47	sol
58	colon
59	semi
61	equals
63	quest
64	commat
91	lsqb
92	bsol
93	rsqb
95	lowbar
96	grave
123	lcub
124	verbar
125	rcub
256	Amacr;
257	amacr;
258	Abreve;
259	abreve;
260	Aogon;
261	aogon;
262	Cacute;
263	cacute;
264	Ccirc;
265	ccirc;
266	Cdot;
267	cdot;
268	Ccaron;
269	ccaron;
270	Dcaron;
271	dcaron;
272	Dstrok;
273	dstrok;
274	Emacr;
275	emacr;
278	Edot;
279	edot;
280	Eogon;
281	eogon;
282	Ecaron;
283	ecaron;
284	Gcirc;
285	gcirc;
286	Gbreve;
287	gbreve;
288	Gdot;
289	gdot;
290	Gcedil;
291	gcedil;
292	Hcirc;
293	hcirc;
294	Hstrok;
295	hstrok;
296	Itilde;
297	itilde;
298	Imacr;
299	imacr;
302	Iogon;
303	iogon;
304	Idot;
305	inodot;
306	IJlig;
307	ijlig;
308	Jcirc;
309	jcirc;
310	Kcedil;
311	kcedil;
312	kgreen;
313	Lacute;
314	lacute;
315	Lcedil;
316	lcedil;
317	Lcaron;
318	lcaron;
319	Lmidot;
320	lmidot;
321	Lstrok;
322	lstrok;
323	Nacute;
324	nacute;
325	Ncedil;
326	ncedil;
327	Ncaron;
328	ncaron;
329	napos;
330	ENG;
331	eng;
332	Omacr;
333	omacr;
336	Odblac;
337	odblac;
340	Racute;
341	racute;
342	Rcedil;
343	rcedil;
344	Rcaron;
345	rcaron;
346	Sacute;
347	sacute;
348	Scirc;
349	scirc;
350	Scedil;
351	scedil;
354	Tcedil;
355	tcedil;
356	Tcaron;
357	tcaron;
358	Tstrok;
359	tstrok;
360	Utilde;
361	utilde;
362	Umacr;
363	umacr;
364	Ubreve;
365	ubreve;
366	Uring;
367	uring;
368	Udblac;
369	udblac;
370	Uogon;
371	uogon;
372	Wcirc;
373	wcirc;
374	Ycirc;
375	ycirc;
377	Zacute;
378	zacute;
379	Zdot;
380	zdot;
381	Zcaron;
382	zcaron;
501	gacute;
711	caron;
728	breve;
729	dot;
730	ring;
731	ogon;
733	dblac;
902	Aacgr;
904	Eacgr;
905	EEacgr;
906	Iacgr;
908	Oacgr;
910	Uacgr;
911	OHacgr;
912	idiagr;
913	Agr;
914	Bgr;
915	Ggr;
916	Dgr;
917	Egr;
918	Zgr;
919	EEgr;
920	THgr;
921	Igr;
922	Kgr;
923	Lgr;
924	Mgr;
925	Ngr;
926	Xgr;
927	Ogr;
928	Pgr;
929	Rgr;
931	Sgr;
932	Tgr;
933	Ugr;
934	PHgr;
935	KHgr;
936	PSgr;
937	OHgr;
938	Idigr;
939	Udigr;
940	aacgr;
941	eacgr;
942	eeacgr;
943	iacgr;
944	udiagr;
945	agr;
946	bgr;
947	ggr;
948	dgr;
949	egr;
950	zgr;
951	eegr;
952	thgr;
953	igr;
954	kgr;
955	lgr;
956	mgr;
957	ngr;
958	xgr;
959	ogr;
960	pgr;
961	rgr;
962	sfgr;
963	sgr;
964	tgr;
965	ugr;
966	phgr;
967	khgr;
968	psgr;
969	ohgr;
970	idigr;
971	udigr;
972	oacgr;
973	uacgr;
974	ohacgr;
977	thetav;
981	phiv;
988	gammad;
1008	kappav;
1009	rhov;
1025	IOcy;
1026	DJcy;
1027	GJcy;
1028	Jukcy;
1029	DScy;
1030	Iukcy;
1031	YIcy;
1032	Jsercy;
1033	LJcy;
1034	NJcy;
1035	TSHcy;
1036	KJcy;
1038	Ubrcy;
1039	DZcy;
1040	Acy;
1041	Bcy;
1042	Vcy;
1043	Gcy;
1044	Dcy;
1045	IEcy;
1046	ZHcy;
1047	Zcy;
1048	Icy;
1049	Jcy;
1050	Kcy;
1051	Lcy;
1052	Mcy;
1053	Ncy;
1054	Ocy;
1055	Pcy;
1056	Rcy;
1057	Scy;
1058	Tcy;
1059	Ucy;
1060	Fcy;
1061	KHcy;
1062	TScy;
1063	CHcy;
1064	SHcy;
1065	SHCHcy;
1066	HARDcy;
1067	Ycy;
1068	SOFTcy;
1069	Ecy;
1070	YUcy;
1071	YAcy;
1072	acy;
1073	bcy;
1074	vcy;
1075	gcy;
1076	dcy;
1077	iecy;
1078	zhcy;
1079	zcy;
1080	icy;
1081	jcy;
1082	kcy;
1083	lcy;
1084	mcy;
1085	ncy;
1086	ocy;
1087	pcy;
1088	rcy;
1089	scy;
1090	tcy;
1091	ucy;
1092	fcy;
1093	khcy;
1094	tscy;
1095	chcy;
1096	shcy;
1097	shchcy;
1098	hardcy;
1099	ycy;
1100	softcy;
1101	ecy;
1102	yucy;
1103	yacy;
1105	iocy;
1106	djcy;
1107	gjcy;
1108	jukcy;
1109	dscy;
1110	iukcy;
1111	yicy;
1112	jsercy;
1113	ljcy;
1114	njcy;
1115	tshcy;
1116	kjcy;
1118	ubrcy;
1119	dzcy;
8196	emsp13;
8197	emsp14;
8199	numsp;
8200	puncsp;
8202	hairsp;
8208	dash;
8211	ndash;
8212	mdash;
8213	horbar;
8214	Verbar;
8229	nldr;
8244	tprime;
8245	bprime;
8257	caret;
8259	hybull;
8411	tdot;
8412	DotDot;
8453	incare;
8459	hamilt;
8463	planck;
8466	lagran;
8467	ell;
8470	numero;
8471	copysr;
8478	rx;
8486	ohm;
8491	angst;
8492	bernou;
8499	phmmat;
8500	order;
8502	beth;
8503	gimel;
8504	daleth;
8531	frac13;
8532	frac23;
8533	frac15;
8534	frac25;
8535	frac35;
8536	frac45;
8537	frac16;
8538	frac56;
8539	frac18;
8540	frac38;
8541	frac58;
8542	frac78;
8597	varr;
8598	nwarr;
8599	nearr;
8600	drarr;
8601	dlarr;
8602	nlarr;
8603	nrarr;
8605	rarrw;
8606	Larr;
8608	Rarr;
8610	larrtl;
8611	rarrtl;
8614	map;
8617	larrhk;
8618	rarrhk;
8619	larrlp;
8620	rarrlp;
8621	harrw;
8622	nharr;
8624	lsh;
8625	rsh;
8630	cularr;
8631	curarr;
8634	olarr;
8635	orarr;
8636	lharu;
8637	lhard;
8638	uharr;
8639	uharl;
8640	rharu;
8641	rhard;
8642	dharr;
8643	dharl;
8644	rlarr2;
8646	lrarr2;
8647	larr2;
8648	uarr2;
8649	rarr2;
8650	darr2;
8651	lrhar2;
8652	rlhar2;
8653	nlArr;
8654	nhArr;
8655	nrArr;
8661	vArr;
8666	lAarr;
8667	rAarr;
8705	comp;
8708	nexist;
8714	epsis;
8717	bepsi;
8720	coprod;
8722	minus;
8723	mnplus;
8724	plusdo;
8726	setmn;
8728	compfn;
8735	ang90;
8737	angmsd;
8738	angsph;
8739	mid;
8740	nmid;
8741	par;
8742	npar;
8750	conint;
8757	becaus;
8765	bsim;
8768	wreath;
8769	nsim;
8771	sime;
8772	nsime;
8775	ncong;
8777	nap;
8778	ape;
8780	bcong;
8782	bump;
8783	bumpe;
8784	esdot;
8785	eDot;
8786	efDot;
8787	erDot;
8788	colone;
8789	ecolon;
8790	ecir;
8791	cire;
8793	wedgeq;
8796	trie;
8802	nequiv;
8806	lE;
8807	gE;
8808	lne;
8809	gne;
8810	Lt;
8811	Gt;
8812	twixt;
8814	nlt;
8815	ngt;
8816	nle;
8817	nge;
8818	lsim;
8819	gsim;
8822	lg;
8823	gl;
8826	pr;
8827	sc;
8828	pre;
8829	sce;
8830	prsim;
8831	scsim;
8832	npr;
8833	nsc;
8837	nsup;
8840	nsube;
8841	nsupe;
8842	subne;
8843	supne;
8846	uplus;
8847	sqsub;
8848	sqsup;
8849	sqsube;
8850	sqsupe;
8851	sqcap;
8852	sqcup;
8854	ominus;
8856	osol;
8857	odot;
8858	ocir;
8859	oast;
8861	odash;
8862	plusb;
8863	minusb;
8864	timesb;
8865	sdotb;
8866	vdash;
8867	dashv;
8868	top;
8871	models;
8872	vDash;
8873	Vdash;
8874	Vvdash;
8876	nvdash;
8877	nvDash;
8878	nVdash;
8879	nVDash;
8882	vltri;
8883	vrtri;
8884	ltrie;
8885	rtrie;
8888	mumap;
8890	intcal;
8891	veebar;
8892	barwed;
8900	diam;
8902	sstarf;
8903	divonx;
8904	bowtie;
8905	ltimes;
8906	rtimes;
8907	lthree;
8908	rthree;
8909	bsime;
8910	cuvee;
8911	cuwed;
8912	Sub;
8913	Sup;
8914	Cap;
8915	Cup;
8916	fork;
8918	ldot;
8919	gsdot;
8920	Ll;
8921	Gg;
8922	leg;
8923	gel;
8924	els;
8925	egs;
8926	cuepr;
8927	cuesc;
8928	npre;
8929	nsce;
8934	lnsim;
8935	gnsim;
8936	prnsim;
8937	scnsim;
8938	nltri;
8939	nrtri;
8940	nltrie;
8941	nrtrie;
8942	vellip;
8966	Barwed;
8972	drcrop;
8973	dlcrop;
8974	urcrop;
8975	ulcrop;
8981	telrec;
8982	target;
8988	ulcorn;
8989	urcorn;
8990	dlcorn;
8991	drcorn;
8994	frown;
8995	smile;
9251	blank;
9416	oS;
9472	boxh;
9474	boxv;
9484	boxdr;
9488	boxdl;
9492	boxur;
9496	boxul;
9500	boxvr;
9508	boxvl;
9516	boxhd;
9524	boxhu;
9532	boxvh;
9552	boxH;
9553	boxV;
9554	boxdR;
9555	boxDr;
9556	boxDR;
9557	boxdL;
9558	boxDl;
9559	boxDL;
9560	boxuR;
9561	boxUr;
9562	boxUR;
9563	boxuL;
9564	boxUl;
9565	boxUL;
9566	boxvR;
9567	boxVr;
9568	boxVR;
9569	boxvL;
9570	boxVl;
9571	boxVL;
9572	boxHd;
9573	boxhD;
9574	boxHD;
9575	boxHu;
9576	boxhU;
9577	boxHU;
9578	boxvH;
9579	boxVh;
9580	boxVH;
9600	uhblk;
9604	lhblk;
9608	block;
9617	blk14;
9618	blk12;
9619	blk34;
9633	squ;
9642	squf;
9645	rect;
9646	marker;
9651	xutri;
9652	utrif;
9653	utri;
9656	rtrif;
9657	rtri;
9661	xdtri;
9662	dtrif;
9663	dtri;
9666	ltrif;
9667	ltri;
9675	cir;
9733	starf;
9734	star;
9742	phone;
9792	female;
9794	male;
9834	sung;
9837	flat;
9838	natur;
9839	sharp;
10003	check;
10007	cross;
10016	malt;
10022	lozf;
10038	sext;
64256	fflig;
64257	filig;
64258	fllig;
64259	ffilig;

##
## The End!
##