source: cpc/trunk/project/batch/amendements/cut_amdmt.pl @ 2641

Last change on this file since 2641 was 2641, checked in by goya, 9 years ago

putain de robots mal conçus de l'an qui foutent du style 'auteurs' là ou ca ne devrait pas

File size: 9.9 KB
Line 
1#!/usr/bin/perl
2
3$file = shift;
4use HTML::TokeParser;
5use File::stat;
6use Date::Format;
7require ("../common/common.pm");
8
9my %amdmt;
10
11$source = $file;
12$source =~ s/^.*(http.*)$/\1/i;
13$source =~ s/_/\//g;
14
15# Récupération des informations identifiantes à partir de l'url plus sure :
16if ($source =~ /(\d{2})\/amendements\/(\d{4})\/(\d{4})(\d|[A-Z])(\d{4})\./i) {
17  $amdmt{'legislature'} = $1;
18  if ($2-$3 == 0) {
19    $amdmt{'loi'} = $3+0;
20  }
21  $num = $5+0;
22  $lettre = $4;
23  if ($lettre =~ /[a-z]/i) {
24    $amdmt{'numero'} = $num.uc($lettre);
25  } else {
26    $amdmt{'numero'} = (10000*$lettre+$num);
27  }
28} elsif ($source =~ /(\d{2})\/amendements\/(\d{4})\/(\d+)\./i) {
29  $amdmt{'legislature'} = $1;
30  $amdmt{'loi'} = $2+0;
31  $num = $3+0;
32  $amdmt{'numero'} = $num;
33}
34
35open(FILE, $file) ;
36@string = <FILE>;
37$string = "@string";
38utf8::decode($string) if ($string =~ /charset=UTF-?8/i);
39$string =~ s/(\<p class="presente".*)\s*\<br[\/]?\>\s*[\n]?\s*(.*)/\1, \2/g;
40$string =~ s/\<br\>.*\n//g;
41$string =~ s/&#8217;/'/g;
42$string =~ s/&#339;/oe/g;
43$string =~ s/&#8211;/-/g;
44$string =~ s/&Eacute;/É/g;
45$string =~ s/&eacute;/é/g;
46$string =~ s/&Egrave;/È/g;
47$string =~ s/&egrave;/è/g;
48$string =~ s/&Agrave;/À/g;
49$string =~ s/&agrave;/à/g;
50$string =~ s/\\//g;
51close FILE;
52
53my $presente = 0;
54my $texte = 0;
55my $identiques = 0;
56my $num_ident = -1;
57
58sub numero {
59    $line =~ s/^.*content="//; 
60    $line =~ s/".*$//;
61    $line =~ s/[\(\)]//g;
62    if ($line =~ /^\s*(\d+)\s+([1-9a-zA-Z].*)$/i) {
63      # $amdmt{'numero'} = $1;
64        $suite = $2;
65        if (!$suite =~ /rect/i) {
66            $amdmt{'rectif'} = 0;
67        } else {
68            if ($suite =~ /(\d+)/) {
69                $amdmt{'rectif'} = $1;
70            } else {
71                $amdmt{'rectif'} = 1;
72            } 
73            if ($suite =~ /bis/i) {
74                $amdmt{'rectif'}++;
75            }
76        }
77     } else {
78        $line =~ /(\d+)/;
79    #   $amdmt{'numero'} = $1;
80        $amdmt{'rectif'} = 0;
81     }
82}
83
84sub auteurs {
85    $line =~ s/\<br\/\>/, /g;
86    $line =~ s/\s*\<\/?[^\>]+\>//g;
87    $line =~ s/\s*présenté\s*par\s*//g;
88    $line =~ s/\s+e{1,2}t\s+/, /g;
89    $line =~ s/^et\s+/, /g;
90    $line =~ s/\s*EXPOSÉ SOMMAIRE\s*//g;
91    $line =~ s/\s+,/,/g;
92    $line =~ s/^de M/M/;
93    if (!$line =~ /^$/ && (!$amdmt{'auteurs'} || $amdmt{'auteurs'} !~  /, $line/)) {
94        $amdmt{'auteurs'} = $amdmt{'auteurs'}.", ".$line;
95    }
96}
97
98sub texte {
99    $line2 = $line;
100    $line2 =~ s/\s*\<\/?[^\>]+\>//g;
101    $line2 =~ s/^[ \s]+(\w)/\1/;
102    $line2 =~ s/[\s ]+$//;
103    if ($line2 !~ /^$/ && !($line2 =~ /\s*Adt\s+n°\s*$/)) {
104        $output = 'texte';
105        if ($texte == 2) {
106           return if $line2 =~ /^\s*\d+\s*$/;
107           $output = 'expose';
108        }
109        if (!$amdmt{$output}) { $amdmt{$output} = "<p>".$line2."</p>"; }
110        else { $amdmt{$output} = $amdmt{$output}."<p>".$line2."</p>"; }
111    }
112}
113
114sub sortseance {
115    if ($line =~ /irrecevable/i) {
116        $amdmt{'sort'} = 'Irrecevable';
117    } elsif ($line =~ /retiré.*séance/i) {
118        $amdmt{'sort'} = 'Retiré avant séance';
119    } elsif ($line =~ /retiré/i) {
120        $amdmt{'sort'} = 'Retiré';
121    } elsif ($line =~ /non.*(soutenu|défendu)/i) {
122        $amdmt{'sort'} = 'Non soutenu';
123    } elsif ($line =~ /tombe/i) {
124        $amdmt{'sort'} = 'Tombe';
125    } elsif ($line =~ /rejet/i) {
126        $amdmt{'sort'} = 'Rejeté';
127    } elsif ($line =~ /adopt/i) {
128        $amdmt{'sort'} = 'Adopté';
129    } elsif ($line =~ /Re/) {
130        $amdmt{'sort'} = 'Retiré';
131    }
132}
133
134sub identiques {
135    if ($line =~ /\<div\>\s*(de)?\s*(M[\s\.Mml].*)\s*\<\/div\>/) {
136        $line = $2;
137        if ($amdmt{'numero'} != $num_ident) {
138            auteurs();
139        }
140    } else {
141        $line =~ s/\s*\<\/?[^\>]+\>//g;
142        if ($line =~ /^.*Adt\s+n°\s+(\d+).*\s+de\s+(.*)\s*$/) {
143            $num = $1;
144            $line = $2;
145            if ($num_ident == -1) {
146                $num_ident = $num;
147                $amdmt{'serie'} = $num_ident."-";
148            }
149            if ($amdmt{'numero'} != $num) {
150                auteurs();
151            }
152            if ($num > $num_ident + 1) {
153                $amdmt{'serie'} = $amdmt{'serie'}.$num_ident.",".$num."-";
154            }
155            $num_ident = $num;
156        } elsif ($line =~ /^\s*(\d+)\s*$/) {
157            $num = $1;
158            if ($num_ident == -1) {
159                $num_ident = $num;
160                $amdmt{'serie'} = $num_ident."-";
161            }
162            if ($num > $num_ident + 1) {
163                $amdmt{'serie'} = $amdmt{'serie'}.$num_ident.",".$num."-";
164            }
165            $num_ident = $num;
166        } elsif ($line =~ /^\s*de\s+(M.*)\s*$/) {
167            $line = $1;
168            if ($amdmt{'numero'} != $num) {
169                auteurs();
170            }
171            $num_ident = $num;
172        }
173    }
174}
175
176
177
178$string =~ s/\r//g;
179$string =~ s/\t+/ /g;
180$string =~ s/ +\n+/\n/g;
181$string =~ s/\n+ +/\n/g;
182$string =~ s/&nbsp;/ /g;
183$string =~ s/\|(\W+)\|/$1/g;
184$string =~ s/([^\n>]+)\n/\1 /g;
185$string =~ s/>\n([^\n<]+)/> \1/g;
186foreach $line (split /\n/, $string)
187{
188#print "TEST: $presente / $texte / $line\n";
189    if ($line =~ /meta.*content=/) {
190        if ($line =~ /name="DATE_BADAGE"/i) { 
191            $line =~ s/^.*content="//i; 
192            $line =~ s/".*$//;
193            if ($line =~ /(\d{1,2})\/(\d{2})\/(\d{4})/) {
194                $amdmt{'date'} = $3.'-'.$2.'-'.sprintf('%02d', $1);
195            }
196        } elsif ($line =~ /name="DESIGNATION_ARTICLE"/i && !$amdmt{'sujet'}) {
197            $line =~ s/^.*content="//i; 
198            $line =~ s/"\s*(name|\>).*$//;
199            $amdmt{'sujet'} = $line;
200        } elsif ($line =~ /name="SORT_EN_SEANCE"/i) { 
201            $line =~ s/^.*content="//i; 
202            $line =~ s/".*$//;
203            sortseance();
204        } elsif ($line =~ /name="NUM_AMENDG?"/i) { 
205            numero();
206        }
207    } elsif ($line =~ /date_?amend.*([0-9]+e?r? \S+ [0-9]+)\D/i && !$amdmt{'date'}) {
208           $amdmt{'date'} = join '/', reverse datize($1);
209    } elsif ($line =~ /class="amddispotitre"/i && !$amdmt{'sujet'}) {
210            $line =~ s/<[^>]+>//g;
211            $amdmt{'sujet'} = $line;
212    } elsif (($line =~ /class="presente"/i || $line =~ /<div>\s*(de )?M[Mmel.s]+ /) && $line !~ /utilisateurs/) {
213        $texte = 0 if ($texte == 2);
214        if ($presente != 1) {
215            $presente = 1;
216        } elsif ($texte >= 1 && $line =~ /font-style: italic/i) {
217            texte();
218        }
219    } elsif ($presente == 1 && $line =~ /class="tirets"/i) {
220        $presente = 2;
221    }
222    if ($line =~ /(NOEXTRACT|EXPOSE)/i) {
223        if (!$amdmt{'numero'} && ($line =~ /class="numamendement"/i || $line =~ /class="titreamend".*num_partie/i)) {
224            if ($line =~ /\<num_amend\>\s*(.*)\s*\<\/num_amend\>/i) { 
225                $line = $1;
226                numero();
227            } elsif ($line =~ /\<\/num_partie\>\s*-\s*(.*)\<\/p\>/i) {
228                $line = $1;
229                numero();
230            }
231        } elsif (!$amdmt{'serie'} && ($line =~ /class="numamendement".*à\s+(\d+)\W/i)) {
232          $num_ident = $1;
233          $amdmt{'serie'} = ($amdmt{'numero'}+1).'-';
234        } elsif ($line =~ /class="presente"/i) {
235            if ($line =~ /amendement/) {
236                $line =~ /(\d+)/;
237                $amdmt{'parent'} = $1;
238            } elsif ($presente == 1) {
239                auteurs();
240            } else {
241                texte();
242            }
243        } elsif ($line =~ /class="amddispotitre"/i) {
244            $texte = 1;
245            if ($line =~ /amendement.*[\s°](\d+)[\s\<]/i) {
246                $amdmt{'parent'} = $1;
247            }
248        } elsif ($line =~ /class="amddispotexte"/i) {
249            texte();
250        } elsif ($line =~ /class="amdexpotitre"/i) {
251            if ($amdmt{'texte'} || !$line =~ /article/i) {
252                $texte = 2;
253            }
254        } elsif ($line =~ /class="amdexpotexte"/i) {
255            texte();
256        } elsif ($line =~ /amendements\s*identiques/i) {
257            $identiques = 1;
258        } elsif ($line =~ /\<div.*\>.*M[\.Mml]/ && !($line =~ /EXPOSE SOMMAIRE/i)) {
259            if ($identiques == 1) {
260                identiques();
261            } elsif ($presente == 1) { 
262                auteurs();
263            }
264        } elsif ($identiques == 1 && $line =~ /\<div\>.*(\d+).*\<\/div\>/) {
265                identiques();
266        } elsif ($texte >= 1 && $line =~ /\<div\>(.*)\<\/div\>/) {
267            $line = $1;
268            texte();
269        }
270    } elsif ($line =~ /class="amddispotitre"/i) {
271        $texte = 1;
272        if ($line =~ /amendement.*[\s°](\d+)[\s\<]/i) {
273            $amdmt{'parent'} = $1;
274        }
275    } elsif ($line =~ /class="amd(expo|dispo)texte"/i) {
276        texte();
277    } elsif ($line =~ /class="amdexpotitre"/i) {
278        if ($amdmt{'texte'} || !$line =~ /article/i) {
279            $texte = 2;
280        }
281    } elsif (!$amdt{'sort'} && $line =~ /\<div.*id="sort"/i) {
282        sortseance();
283    } elsif ($identiques == 1 && $line =~ /\<p style=".*text-align:.*\>.*M[\.Mml]/i) {
284        identiques();
285    } elsif ($line =~ /class="presente"/i) {
286        if ($line =~ /amendement/) {
287            $line =~ /(\d+)/;
288            $amdmt{'parent'} = $1;
289        } elsif ($texte < 1) {
290            auteurs() if ($line !~ /par<\/p>/);
291        } else {
292            texte();
293        }
294    } elsif ($presente == 1 && $line =~ /<(p style=".*text-indent:.*|td align="center"[^>]*)>.*(M[\.Mml]|Le gouvern)/i) { 
295        auteurs();
296    } elsif ($line =~ /\<p style=".*text-indent:/i) {
297        if ($line =~ /amendement.*(irrecevable|retir)/i) {
298            if (!$amdmt{'sort'}) {
299                if ($line =~ /irrecevable/i) {
300                    $amdmt{'sort'} = "Irrecevable";
301                } elsif ($line =~ /retir/i) {
302                    $amdmt{'sort'} = "Retiré avant séance";
303                }
304            }
305        }
306        texte();
307    } elsif ($line =~ /\<p[^\>]*\>(.*)\<\/p\>/i && $texte >= 1) {
308        $line = $1;
309        texte();
310    }
311}
312
313if ($num_ident > 0) {
314    $amdmt{'serie'} = $amdmt{'serie'}.$num_ident;
315}
316
317$amdmt{'auteurs'} =~ s/\s+Mme,\s*/ Mme /g;
318$amdmt{'auteurs'} =~ s/([a-z])\s+(M[\.Mml])/\1, \2/g;
319$amdmt{'auteurs'} =~ s/,\s*M[\s\.mle]+\s*,/,/g;
320$amdmt{'auteurs'} =~ s/\s*[,]?\s*les\s+[cC]ommissaires.*$//g;
321$amdmt{'auteurs'} =~ s/\s*[,]?\s*[rR]apporteur[\s,a-zéèêà\-']*M(.*)/, M\1/g;
322$amdmt{'auteurs'} =~ s/\s*[,]?\s*[rR]apporteur[\s,a-zéèêà\-']*//g;
323$amdmt{'auteurs'} =~ s/(,\s*,|,+)/,/g;
324$amdmt{'auteurs'} =~ s/,+/,/g;
325$amdmt{'auteurs'} =~ s/^\s*,\s*//g;
326$amdmt{'auteurs'} =~ s/\s*,\s*$//g;
327$amdmt{'auteurs'} =~ s/ et(M[mle\.\s])/, \1/g;
328$amdmt{'auteurs'} =~ s/ et(\W)/\1/g;
329$amdmt{'auteurs'} =~ s/([^,\s])\s*(les\s*membres.*groupe.*)$/\1, \2/i;
330
331if (!$amdmt{'date'}) {
332  $time = stat($file)->mtime;
333  $amdmt{'date'} = time2str("%Y-%m-%d", $time);
334}
335if (!$amdmt{'sort'} && $amdmt{'texte'} =~ /amendement irrecevable/i) {
336  $amdmt{'sort'} = 'Irrecevable';
337}
338
339print '{"source": "'.$source.'", "legislature": "'.$amdmt{'legislature'}.'", "loi": "'.$amdmt{'loi'}.'", "numero": "'.$amdmt{'numero'}.'", "serie": "'.$amdmt{'serie'}.'", "rectif": "'.$amdmt{'rectif'}.'", "parent": "'.$amdmt{'parent'}.'", "date": "'.$amdmt{'date'}.'", "auteurs": "'.$amdmt{'auteurs'}.'", "sort": "'.$amdmt{'sort'}.'", "sujet": "'.$amdmt{'sujet'}.'", "texte": "'.$amdmt{'texte'}.'", "expose": "'.$amdmt{'expose'}.'" } '."\n";
Note: See TracBrowser for help on using the repository browser.