Utilizador:Schoenfeld/estatísticas.pl

Origem: Wikcionário, o dicionário livre.
#!/usr/bin/perl -w
use strict;

use WWW::Mechanize;
use HTML::TokeParser;

#Função que retorna o maior dos seus argumentos
sub max{
my @lixo = sort {$b <=> $a} @_;
return $lixo[0];
}

my $agent = WWW::Mechanize->new();
$agent->agent_alias('Linux Mozilla'); #Se não fingir ser o mozilla a WMF bloqueia a conexão

#Pega a categoria dos idiomas
$agent->get('http://pt.wiktionary.org/wiki/Categoria:Idioma');

#inicializa um dicionário para os idiomas
my %idiomas = ();

#número de idiomas
my $contador_idiomas = 0;

#Coloca a lista de idiomas em %idiomas
do{
  #cria um parser HTML e envia-lhe a página atual
  my $html = HTML::TokeParser->new(\$agent->{content});

  #variável auxiliar que guarda o nome do idioma
  my $idioma = "";

  while(my $tag = $html->get_tag("div")){ #enquanto $tag não for undef, segue para o próximo <div>
    if($tag->[1]{class} && ($tag->[1]{class} eq 'CategoryTreeSection')){
      $html->get_tag("a");$html->get_tag("a"); #anda dois <a>
      $idioma = $html->get_trimmed_text("/a"); #coloca em $idioma o texto entre <a> e </a>
     
      #cria uma entrada para o idioma no hash, e define que categorias gramaticais serão contadas
      $idiomas{"$idioma"} = { 
        "indice" => $contador_idiomas,
        "Só idioma" => 0,
        "Substantivo" => 0,
        "Adjectivo" => 0,
        "Verbo" => 0,
        "Advérbio" => 0,
        "Conjunção" => 0,
        "Expressão" => 0,
        "Locução" => 0,
        "Sigla" => 0,
        "Numeral" => 0,
        "Pronome" => 0,
        "Interjeição" => 0,
        "Preposição" => 0,
        "Artigo" => 0,
        "Total" => 0,
      }; 
     $contador_idiomas++;
    }
  }
  sleep 5; #não temos pressa, não queremos sobrecarregar os servidores
} while ($agent->follow_link(text => "próximos 200")); #segue para frente enquanto houver link com texto "próximos 200"

#pega as categorias mais linkadas
$agent->get('http://pt.wiktionary.org/w/index.php?title=Especial:Mostlinkedcategories&limit=500&offset=0');

#Pega os dados dos idiomas
do{
  my $html = HTML::TokeParser->new(\$agent->{content});
  my $tag = $html->get_tag("ol"); #Vai até o primeiro <ol>

  my $idioma = "";
  while($tag = $html->get_tag("a")){ #enquanto $tag não for undef, segue para o próximo <a>
    if($tag->[1]{title} =~ /Categoria:/){ #se for um link para uma categoria   
      $idioma = $html->get_trimmed_text("/a"); #pega o nome da categoria      
      my $classe_gramatical = "Só idioma";#Supõe que a categoria é da forma 'idioma', e não 'classe gramatical (idioma)'

      if($idioma =~ /([\S\s]*)\s\(([\S\s]*)\)/){#Se for da forma 'classe gramatical (idioma)', ajusta o valor das variáveis
         $idioma = $2;                       
         $classe_gramatical = $1;
      }
      if (exists $idiomas{"$idioma"}) {#se realmente é uma categoria de idioma
        if (exists $idiomas{"$idioma"}->{"$classe_gramatical"}) {#e se realmente é uma categoria de classe gramatical
          my $numero = $html->get_trimmed_text("/li"); #pega o número de artigos linkados
          $numero =~ s/\D//g; #deixa apenas os dígitos
          $idiomas{"$idioma"}->{"$classe_gramatical"} = $numero; #atualiza o hash
          if($classe_gramatical ne "Só idioma") {$idiomas{"$idioma"}->{"Total"} += $numero;}; #atualiza o total
        }
      }
    }
  }
  sleep 5; #não temos pressa, não queremos sobrecarregar os servidores
} while ($agent->follow_link(text => "próximos 500")); #segue para frente enquanto houver link com texto "próximos 500"


#Cria a tabela com os idiomas, ordenada por max(total,só idioma)
my $idioma;
my $posicao = 1; #guarda o rank do idioma

#Constrói o cabeçalho da tabela
print "{|border=\"2\" cellpadding=\"4\" cellspacing=\"0\" style=\"margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse;\" 
!bgcolor=#CCCCCC|
!bgcolor=#CCCCCC|'''Idioma'''
!bgcolor=#CCCCCC|Substantivo
!bgcolor=#CCCCCC|Adjetivo
!bgcolor=#CCCCCC|Verbo
!bgcolor=#CCCCCC|Expressão
!bgcolor=#CCCCCC|Advérbio
!bgcolor=#CCCCCC|Sigla
!bgcolor=#CCCCCC|Numeral
!bgcolor=#CCCCCC|Pronome
!bgcolor=#CCCCCC|Interjeição
!bgcolor=#CCCCCC|Locução
!bgcolor=#CCCCCC|Preposição
!bgcolor=#CCCCCC|Conjunção
!bgcolor=#CCCCCC|Artigo
!bgcolor=#CCCCCC|Total
!bgcolor=#CCCCCC|Só idioma
|---- bgcolor=#FAFAFA\n";

#Constrói cada linha da tabela
for $idioma (sort {max($idiomas{$b}{"Só idioma"},$idiomas{$b}{"Total"}) <=> max($idiomas{$a}{"Só idioma"},$idiomas{$a}{"Total"})} keys %idiomas ) {

  if($posicao <= 50){ #coloca apenas os cinqüenta primeiros na tabela
    print "!<!-- posição --> $posicao\n";
    print "!<!-- idioma --> $idioma\n";
    print "|<!-- subst. --> ".$idiomas{"$idioma"}->{"Substantivo"}."\n";
    print "|<!-- adj. --> ".$idiomas{"$idioma"}->{"Adjectivo"}."\n";
    print "|<!-- verb. --> ".$idiomas{"$idioma"}->{"Verbo"}."\n";
    print "|<!-- expr. --> ".$idiomas{"$idioma"}->{"Expressão"}."\n";
    print "|<!-- adv. --> ".$idiomas{"$idioma"}->{"Advérbio"}."\n";
    print "|<!-- sigla --> ".$idiomas{"$idioma"}->{"Sigla"}."\n";
    print "|<!-- num. --> ".$idiomas{"$idioma"}->{"Numeral"}."\n";
    print "|<!-- pron. --> ".$idiomas{"$idioma"}->{"Pronome"}."\n";
    print "|<!-- interj. --> ".$idiomas{"$idioma"}->{"Interjeição"}."\n";
    print "|<!-- loc. --> ".$idiomas{"$idioma"}->{"Locução"}."\n";
    print "|<!-- prep. --> ".$idiomas{"$idioma"}->{"Preposição"}."\n";
    print "|<!-- conj. --> ".$idiomas{"$idioma"}->{"Conjunção"}."\n";
    print "|<!-- art. --> ".$idiomas{"$idioma"}->{"Artigo"}."\n";
    print "!<!-- total --> ".$idiomas{"$idioma"}->{"Total"}."\n";
    print "!<!-- só idioma --> ".$idiomas{"$idioma"}->{"Só idioma"}."\n";
    if($posicao < 50) {print "|-\n";}; #para que não haja uma linha a mais na tabela, o último verbete não deve imprimir isso
  }
  $posicao++
}
print "|}";#fecha a tabela