source: cpc/trunk/project/batch/hemicycle/parse_hemicycle.pl @ 1313

Last change on this file since 1313 was 1313, checked in by goya, 11 years ago

parsing lois amélioré

File size: 9.9 KB
Line 
1#!/usr/bin/perl
2
3$file = $url = shift;
4#use HTML::TokeParser;
5$url =~ s/^[^\/]+\///;
6$url =~ s/_/\//g;
7$source = $url;
8
9if ($url =~ /\/(\d{4})\-(\d{4})[\/\-]/) {
10    $session = $1.$2;
11}
12
13open(FILE, $file) ;
14@string = <FILE>;
15$string = "@string";
16close FILE;
17
18#Si italique dans gras, on vire (pb fonction)
19if ($string =~ /M[me\.]+[ \&][^<]+<\/a>\.[^<]*<\/b>[^<]*<i>([^<]+)</ && $1 =~ /rapporteur|president/i) {
20        $string =~ s/(M[me\.]+[ \&][^<]+<\/a>)\.[^<]*<\/b>[^<]*<i>/$1,<\/b><i>/g;
21}
22$string =~ s/([^\.])\s*<\/b>\s*<i>([^<]+)<\/i>/$1 $2<\/b>/g;
23
24$string =~ s/<\/?b>/|/g;
25$string =~ s/<\/?i>/\//g;
26$string =~ s/\r//g;
27
28$mois{'janvier'} = '01';
29$mois{'février'} = '02';
30$mois{'mars'} = '03';
31$mois{'avril'} = '04';
32$mois{'mai'} = '05';
33$mois{'juin'} = '06';
34$mois{'juillet'} = '07';
35$mois{'août'} = '08';
36$mois{'septembre'} = '09';
37$mois{'octobre'} = '10';
38$mois{'novembre'} = '11';
39$mois{'décembre'} = '12';
40
41$heure{'neuf'} = '09';
42$heure{'dix'} = '10';
43$heure{'onze'} = '11';
44$heure{'douze'} = '12';
45$heure{'treize'} = '13';
46$heure{'quatorze'} = '14';
47$heure{'quinze'} = '15';
48$heure{'seize'} = '16';
49$heure{'dix-sept'} = '17';
50$heure{'dix-huit'} = '18';
51$heure{'dix-neuf'} = '19';
52$heure{'vingt'} = '20';
53$heure{'vingt et une'} = '21';
54$heure{'vingt-deux'} = '22';
55$heure{'quarante'} = '45';
56$heure{'quarante-cinq'} = '45';
57$heure{'trente'} = '30';
58$heure{'trente-cinq'} = '35';
59$heure{'quinze'} = '15';
60$heure{'zéro'} = '00';
61$heure{'cinq'} = '00';
62$heure{''} = '00';
63
64if ($string =~ /ance est ouverte/i) {
65    $heure = '09:30';
66}
67if ($string =~ /ouverte[^\.]+à ([^\.]+) heures?\s*([^\.]*)\./) {
68    $heure = $heure{$1}.':'.$heure{$2};
69}
70
71sub savepLoi() {
72    $no =~ s/&nbsp;/ /g;
73    $no =~ s/\s*et\s*/,/g;
74    $no =~ s/[^\d,]//g;
75    @no = split(/,/, $no);
76    $no = '';
77    foreach (@no) {
78        s/(\d{4})(\d{4})/$1,$2/g;
79        s/(\d{3})(\d{3})/$1,$2/g;
80        s/^0+//;
81        s/,0+//;
82        $no .= $_.',';
83    }
84    chop $no;
85    if ($no) {
86        #print "TEST3 $titre -_- $no\n";
87        $ploi{$titre} = $no;
88    }
89}
90
91$string =~ s/&#8217;/'/g;
92$string =~ s/<\/?sup>//g;
93$string =~ s/<!--[^A-Z]+-->//g;
94#Recherche des numéros de loi
95while($string =~ /ordre du jour([^<]+\W(proposition|loi)\W[^<]+)\(n\D+(\d+[^\)]+)\)/ig) {
96    if ($1 =~ /#item#/i) {
97      next;
98    }
99    #print "TEST2 $1 -_- $2 -_- $3\n";
100    $titre = lc $1;
101    $no = $3;
102    $titre =~ s/[^<]+ loi,? //;
103    savepLoi();
104}
105while($string =~ /#item#\d+\.?\s*([^#]+)\(n\D+(\d+[^\)]+)\)\s*#\/item#/ig) {
106    #print "TEST1 $1 -_- $2 \n";
107    $titre = lc $1;
108    $no = $2;
109    savepLoi();
110}
111
112sub getProjetLoi {
113    $titre_cleaned = $titre = lc shift;
114    return unless ($titre);
115    return $ploi{$titre} if (defined($ploi{$titre}));
116    $intervention = lc shift;
117    foreach $k (keys %ploi) {
118        if ($intervention =~ /$k/i) {
119            $ploi{$titre} = $ploi{$k};
120            return $ploi{$k};
121        }
122    }
123    return unless ($titre);
124    return $ploi{$titre} if (defined($ploi{$titre}));
125    $titre_cleaned =~ s/[^a-z]+/ /g;
126    while ($titre_cleaned) {
127        foreach $k (keys %ploi) {
128            $_ = $k;
129            s/[^a-z]+/ /g;
130            if (/$titre_cleaned/) {
131                $ploi{$titre} = $ploi{$k};
132                return $ploi{$k};
133            }
134        }
135        $titre_cleaned =~ s/^\s?\S+\s*//;
136    }
137    $ploi{$titre} = '';
138    return ;
139}
140
141
142$cpt = 0;
143sub checkout {
144    $cpt+=10;
145    $contexte = $titre1;
146    if ($titre2) {
147        $contexte .= ' > '.$titre2;
148    }
149    $out =  '{"contexte": "'.$contexte.'", "intervention": "'.$intervention.'", "timestamp": "'.$cpt.'", "date": "'.$date.'", "source": "'.$source.'", "heure":"'.$heure.'", "session": "'.$session.'", ';
150    if (($ploi = getProjetLoi($titre1, $intervention)) && $contexte !~ /questions?\sau|ordre\sdu\sjour|nomination|suspension\sde\séance|rappels?\sau\srèglement/i) {
151        $out .= "\"numeros_loi\": \"$ploi\", ";
152    }
153    if ($amendements) {
154        $out .= '"amendements": "'.$amendements.'", ';
155    }
156
157    if ($intervenant) {
158        if ($intervenant =~ s/( et|, )(\s*M[mes\.]*|)\s*([A-Z].*)//) {
159            print $out.'"intervenant": "'.$3."\"}\n";
160        }
161        if ($inter2fonction{$intervenant} =~ s/( et|, )(\s*M[mes\.]*|)\s*([A-Z].*)//g) {
162            print $out.'"intervenant": "'.$3."\"}\n";
163            $inter2fonction{$intervenant} = '';
164        }
165        print $out.'"intervenant": "'.$intervenant.'", "fonction": "'.$inter2fonction{$intervenant}.'", "intervenant_url": "'.$intervenant_url."\"}\n";
166    }elsif($intervention) {
167        print $out.'"intervenant":"'."\"}\n";
168    }else {
169        return ;
170    }
171    $commentaire = "";
172    $intervenant = "";
173    $intervenant_url = "";
174    $intervention = "";
175    $amendements = join ',', @pre_amendements;
176}
177
178sub setFonction {
179    my $fonction = shift;
180    my $intervenant = shift;
181    my $kfonction = lc($fonction);
182    $kfonction =~ s/[^a-z]+/ /gi;
183    $intervenant =~ s/\W+$//;
184    $fonction2inter{$kfonction} = $intervenant;
185#    print "$fonction ($kfonction)  => $intervenant \n";
186    if (!$inter2fonction{$intervenant}) {
187        $inter2fonction{$intervenant} = $fonction;
188    }
189}
190
191sub setIntervenant {
192    my $intervenant = shift;
193#    print "$intervenant\n";
194    $intervenant =~ s/^(M(\.|me))(\S)/$1 $2/;
195    $intervenant =~ s/[\|\/]//g;
196    $intervenant =~ s/\s*\&\#8211\;\s*$//;
197    $intervenant =~ s/\s*[\.\:]\s*$//;
198    $intervenant =~ s/Madame/Mme/;
199    $intervenant =~ s/Monsieur/M./;
200    $intervenant =~ s/et M\. /et M /;
201    $intervenant =~ s/^M[\.mes]*\s//i;
202    $intervenant =~ s/\s*\..*$//;
203    $intervenant =~ s/L([ea])\s/l$1 /i;
204    $intervenant =~ s/\s+\(/, /g;
205    $intervenant =~ s/\)//g;
206    $intervenant =~ s/[\.\,\s]+$//;
207    $intervenant =~ s/^\s+//;
208    $intervenant =~ s/É+/é/gi;
209    $intervenant =~ s/\&\#8217\;/'/g;
210    $intervenant =~ s/([^\s\,])\s+rapporteur/$1, rapporteur/i;
211    $intervenant =~ s/M\. /M /;
212    if ($intervenant =~ s/\,\s*(.*)//) {
213        setFonction($1, $intervenant);
214    }
215    if ($intervenant =~ /^[a-z]/) {
216        $intervenant =~ s/^l[ea]\s+//i;
217        if ($intervenant =~ /([pP]résidente?|[rR]apporteur[a-zé\s]+)\s([A-Z].+)/) { #\s([A-Z].*)/i) {
218            setFonction($1, $2);
219            return $2;
220        }
221        $conv = $fonction2inter{$intervenant};
222        if (!$conv) {
223            $tmp = $intervenant;
224            $tmp =~ s/[^a-z]+/ /gi;
225            $conv = $fonction2inter{$tmp};
226        }
227#       print "conv: '$conv' '$intervenant'\n";
228        if ($conv) {
229            $intervenant = $conv;
230        }else {
231            $test = lc($intervenant);
232            $test =~ s/[^a-z]+/ /gi;
233            foreach $fonction (keys %fonction2inter) {
234                if ($fonction =~ /$test/) {
235                    $inter = $fonction2inter{$fonction};
236                    last;
237                }
238            }
239            if (!$inter) {
240                foreach $fonction (keys %fonction2inter) {
241                    if ($test =~ /$fonction/) {
242                        $inter = $fonction2inter{$fonction};
243                        last;
244                    }
245                }
246            }
247            if ($inter) {
248                $fonction2inter{lc($intervenant)} = $inter;
249                $intervenant = $inter;
250            }
251        }
252    }
253    return $intervenant;
254}
255
256$string =~ s/\r//g;
257$string =~ s/&nbsp;/ /g;
258$string =~ s/&#339;|œ+/oe/g;
259$string =~ s/&#8217;/'/g;
260$string =~ s/\|(\W+)\|/$1/g;
261$majIntervenant = 0;
262$debut = 0;
263
264$string =~ s/<br>\n*//gi;
265$string =~ s/<\/?orateur>\n*//gi;
266$string =~ s/\| et \|/ et /gi;
267
268#print "$string\n"; exit;
269
270$donetitre1 = 0;
271foreach $line (split /\n/, $string)
272{
273    if ($line =~ /DEBUT_SEANCE|séance est ouverte/) {
274        $debut = 1;
275    }
276    #recherche amendements
277    if ($line =~ /\<\!\-\- AMEND_/) {
278        @pre_amendements = ();
279        while ($line =~ /\<\!\-\- AMEND_(\d+)\D/g) {
280            push @pre_amendements, $1;
281        }
282    }
283
284    #suppression des commentaires
285    $line =~ s/\<\!\-\-[^\>]+\>//g;
286    #si deux intervenant en même temps
287    $line =~ s/\|\s*et\s*\|/ et /gi;
288    #si italique ou gras sans raison on supprime
289    $line =~ s/\/\s*\// /g;
290    $line =~ s/\|\s*\|/ /g;
291
292    #récupère les ancres pour de meilleurs liens sources
293    if ($line =~ /\<[a]/i) {
294        if ($line =~ s/<a name=["']([^"']+)["'][^<]+<[^>]+>/<</g) {
295            $source = $url."#$1";
296        }
297    }
298
299    if ($line =~ /<h[1-9]+/i || $line =~ /"(sompresidence|sstitreinfo)"/) {
300        if ($line =~ /pr..?sidence de (M[^<\,]+)[<,]/i && $line !~ /sarkozy/i) {
301            $prez = $1;
302#           print "Présidence de $prez\n";
303            if ($prez =~ /^Mm/) {
304                setFonction('présidente', $prez);
305            }else {
306                setFonction('président', $prez);
307            }
308        }elsif($line =~ /h2 class="titre[23]"><*([^<\(]+)\s*/ || $line =~ /class="sstitreinfo">\/([^\/]+)\//) {
309            checkout();
310            if (($1 !~ /suspension/ && $1 !~ /séance/) || $1 =~ /demande/i){
311                $titre2 = $1;
312            }
313            $titre2 =~ s/a href[^>]+>//g;
314            $titre2 =~ s/\///g;
315            $titre2 =~ s/\s+$//;
316            $amendements = @pre_amendements = ();
317            $line = "<p>|$titre2|</p>";
318            $donetitre1 = 0;
319        }elsif(!$donetitre1 && $line =~ /h2 class="titre1">(.+)<\/h2/i) {
320            checkout();
321            $titre = $1;
322            $titre =~ s/<\/?[^>]+>//g;
323            $titre =~ s/<//g;
324            $titre =~ s/[\(\/][^\)\/]+[\)\/]//;
325            $titre =~ s/\///g;
326            $titre =~ s/\s+$//;
327            unless ($titre) {
328                next;
329            }
330            if ($titre =~ /^[\/\s]*[\wéè]+ \s*partie[\/\s]*(suite[\/\s]*|)$/i || $titre =~ /^\s*[\(\/]+.*[\/\)]+\s*$/) {
331                next
332            }
333            $donetitre1 = 1;
334            $titre1 = $titre;
335            $titre2 = '';
336            $amendements = @pre_amendements = ();
337            $line = "<p>|$titre1|</p>";
338        }elsif($line =~ /h1 class="seance"/) {
339            if ($line =~ /(\d{1,2})[ermd]*\s+([a-zéùû]+)\s+(\d{4})/) {
340                $date = $3.'-'.$mois{$2}.'-'.sprintf('%02d', $1);
341            }
342        }elsif($line =~ /h5 class="numencad"/) {
343            $donetitre1 = 0;
344        }
345    }
346
347    next unless ($debut);
348
349    $line =~ s/<<//g;
350
351#    print "$titre1 > $titre2 : $line\n" ; next;
352    $line =~ s/\|\///;
353    if ($line =~ /\<[p]/i) {
354        $last_href = '';
355        if ($line =~ /href=["']([^"']+)["']/) {
356            $last_href = $1;
357        }
358        $line =~ s/\s*\<\/?[^\>]+\>//g;
359        last if ($line =~ /^\|annexe/i);
360        next if ($line !~ /\w/);
361
362        #si italique ou tout gras => commentaire
363        if ($line =~ /^\s*\|.*\|\s*$/ || $line =~ /^\s*\/.*\/\s$/) {
364            checkout() if ($intervenant);
365        }elsif ($line =~ s/^\s*\|\s*(M[^\|\/\:]+)[\|\/\:]// ) {
366            checkout();
367            $majIntervenant = 1;
368            $intervenant = setIntervenant($1);
369            $intervenant_url = $last_href;
370            $found = 1;
371        }elsif ($line =~ /^\s*\|/) {
372            checkout() if ($intervenant);
373        }
374        $line =~ s/^\s+//;
375        $line =~ s/[\|\/]//g;
376        $line =~ s/^[\.\:]\s*//;
377        $intervention .= "<p>$line</p>";
378    }
379}
380checkout();
Note: See TracBrowser for help on using the repository browser.