#!/usr/bin/perl -w
#
# scriptLattes V7
#
# Copyright 2005-2010: Jesús P. Mena-Chalco e Roberto M. Cesar-Jr.
#
#
# Este programa é um software livre; você pode redistribui-lo e/ou
# modifica-lo dentro dos termos da Licença Pública Geral GNU como
# publicada pela Fundação do Software Livre (FSF); na versão 2 da
# Licença, ou (na sua opnião) qualquer versão.
#
# Este programa é distribuido na esperança que possa ser util,
# mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer
# MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
# Licença Pública Geral GNU para maiores detalhes.
#
# Você deve ter recebido uma cópia da Licença Pública Geral GNU
# junto com este programa, se não, escreva para a Fundação do Software
# Livre(FSF) Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
use strict;
require Encode;
use scriptLattes;
use Data::Dumper;
use Date::Format;
use Date::Language;
use JSON;
use Unicode::Normalize;
my @pars= readParameters($ARGV[0]); # Lemos os parâmetros indicados no arquivo de configuração dado como entrada na execução do scriptLattes
my $groupName = $pars[0]; # Nome do grupo de pesquisa / titulo global para todas as paginas
my $authorListFileName = $pars[1]; # Nome do arquivo que contem a lista de autores
my $outputDir = $pars[2]; # Nome do diretorio onde serão armazenados os resultados
my $adminEmail = $pars[3]; # Email de contacto do administrador
my $itemsFromYear = $pars[4]; # Itens desde o ano...
my $itemsToYear = $pars[5]; # Itens até o ano...
my $MAXproducoesByPage = $pars[6]; # Número máximo de publicações por página
my $flagJSP = $pars[7]; # flag para a criaçao de páginas JSP no lugar de HTML
my $lang = $pars[8]; # idioma para a criaçao dos relatórios
my $flagIDSLattes = $pars[9]; # flag para mostrar os IDs Lattes nas páginas web
my $flagOrientacoes = $pars[10]; # flag para mostrar
my $flagBancas = $pars[11]; # flag para mostrar
my $flagComissoes = $pars[12]; # flag para mostrar
my $flagEventos = $pars[13]; # flag para mostrar
my $flagGrafo = $pars[14]; # flag para mostrar
my $flagTodosOsNos = $pars[15]; # flag para mostrar todos os nós no grafo de colaborações (i.e. inclusive os membros que nao colaboram)
my $flagIndicadores = $pars[16]; # flag para mostrar os indicadores
my $flagGoogleMap = $pars[17]; # flag para a criação do mapa de pesquisa
my $googleMapKey = $pars[18]; # key do maps.google.com para acessar as páginas
my $googleAnalyticsKey = $pars[19]; # flag para mostrar os indicadores
my @cepList;
my @transList;
my @authorIndicator;
readCEPsList();
loadTranslator();
my $urlLattes = 'http://lattes.cnpq.br/';
my $urlPhotoRetrieve = 'http://buscatextual.cnpq.br/buscatextual/servletrecuperafoto?id=';
my $urlscriptLattes = 'http://scriptlattes.sourceforge.net/';
my $version = 'V7.02';
my $fromYear = $itemsFromYear; $fromYear=~s/HOJE/2099/gi; $fromYear=scalar($fromYear);
my $toYear = $itemsToYear; $toYear=~s/HOJE/2099/gi; $toYear =scalar($toYear);
my $extension;
my $beginHTML;
my $endHTML;
if ($flagJSP=~"n") { $extension = "html"; $beginHTML = ""; $endHTML = ""; }
else { $extension = "jsp"; $beginHTML = "<%@ page language=\"java\" contentType=\"text/html; charset=ISO8859-1\" pageEncoding=\"ISO8859-1\"%> <%@ taglib prefix=\"f\" uri=\"http://java.sun.com/jsf/core\"%> "; $endHTML = ""; }
# ---------------------------------------------------------------------------- #
# Passo 1: Leitura da lista de autores, e processamento dos CVs baixados
# ---------------------------------------------------------------------------- #
my @authorList = readAuthorList($authorListFileName);
getLattesFiles(\@authorList, $outputDir);
open(LOG, ">$outputDir/log.txt");
# ---------------------------------------------------------------------------- #
# Passo 2: Leitura das produçoes de todos os autores
# ---------------------------------------------------------------------------- #
print "\n\nExtraindo as publicações dos arquivos baixados:";
my $numberOfAuthors = @authorList;
my @totalPublications;
my $numberOfPublicationsTypes;
my @nameOfPublicationsTypes;
my @totalOrientacoesEmAndamento;
my @totalOrientacoesConcluidas;
my $numberOfOrientacoesTypes;
my @nameOfOrientacoesTypes;
my @nameOfOrientacoesStatus;
my $numberOfProducoesTecnicasTypes;
my @nameOfProducoesTecnicasTypes;
my $numberOfProducoesArtisticasTypes;
my @nameOfProducoesArtisticasTypes;
my @totalProducoesTecnicas;
my @totalProducoesArtisticas;
my $numberOfBancasExaminadorasTypes;
my @nameOfBancasExaminadorasTypes;
my @totalBancasExaminadoras;
my $numberOfComissoesJulgadorasTypes;
my @nameOfComissoesJulgadorasTypes;
my @totalComissoesJulgadoras;
my $numberOfEventosTypes;
my @nameOfEventosTypes;
my @totalEventos;
my @curriculumHTML;
my $numberOfItem;
foreach (my $aut=0; $aut<$numberOfAuthors; $aut++)
{
my $authorCode = ${$authorList[$aut]}[0];
my $authorName = ${$authorList[$aut]}[1];
my $authorPeriods = ${$authorList[$aut]}[2]; $authorPeriods =~ s/\s*//g;
my $cvFile = $outputDir."/".$authorCode.".download";
my $authorPublications = new scriptLattes; $authorPublications->parse_file($cvFile);
$authorName = trimBlanks($authorPublications->{Name}); # nome do CV Lattes
print "\n- [".($aut+1)."/$numberOfAuthors] $cvFile ($authorName) ($authorPeriods)";
${$authorList[$aut]}[1] = $authorName;
${$authorList[$aut]}[3] = trimBlanks($authorPublications->{Address}); # endereço do CV Lattes
(${$authorList[$aut]}[4],${$authorList[$aut]}[5],${$authorList[$aut]}[6]) = getLatitudeAndLongitude(${$authorList[$aut]}[3]);
${$authorList[$aut]}[7] = $authorPublications->{Orientandos};
${$authorList[$aut]}[8] = getURLPhoto($authorPublications->{PhotoID});
print "\n Publicaçoes";
@nameOfPublicationsTypes = @{$authorPublications->{Publication_type}};
$numberOfPublicationsTypes = @{$authorPublications->{Publication_type}};
$authorIndicator[$aut] = setProducoes ($aut, \@{$authorPublications->{Publication}}, \@totalPublications, \@nameOfPublicationsTypes, $numberOfPublicationsTypes, 0, "", "", $authorPeriods);
print "\n Produção técnica";
$numberOfProducoesTecnicasTypes = @{$authorPublications->{ProducaoTecnica_type}};
@nameOfProducoesTecnicasTypes = @{$authorPublications->{ProducaoTecnica_type}};
setProducoes ($aut, \@{$authorPublications->{ProducaoTecnica}}, \@totalProducoesTecnicas, \@nameOfProducoesTecnicasTypes, $numberOfProducoesTecnicasTypes, 0, "", "", $authorPeriods);
print "\n Produção artística";
$numberOfProducoesArtisticasTypes = @{$authorPublications->{ProducaoArtistica_type}};
@nameOfProducoesArtisticasTypes = @{$authorPublications->{ProducaoArtistica_type}};
setProducoes ($aut, \@{$authorPublications->{ProducaoArtistica}}, \@totalProducoesArtisticas, \@nameOfProducoesArtisticasTypes, $numberOfProducoesArtisticasTypes, 0, "", "", $authorPeriods);
print "\n Orientações em andamento";
@nameOfOrientacoesTypes = @{$authorPublications->{Orientacoes_type}};
$numberOfOrientacoesTypes = @{$authorPublications->{Orientacoes_type}};
@nameOfOrientacoesStatus = @{$authorPublications->{Orientacoes_status}};
setProducoes ($aut, \@{$authorPublications->{Orientacoes_andamento}}, \@totalOrientacoesEmAndamento, \@nameOfOrientacoesTypes, $numberOfOrientacoesTypes, 1, $authorCode, $authorName, $authorPeriods);
print "\n Orientações concluídas";
setProducoes ($aut, \@{$authorPublications->{Orientacoes_concluidas}}, \@totalOrientacoesConcluidas, \@nameOfOrientacoesTypes, $numberOfOrientacoesTypes, 1, $authorCode, $authorName, $authorPeriods);
print "\n Bancas examinadoras";
$numberOfBancasExaminadorasTypes = @{$authorPublications->{BancasExaminadoras_type}};
@nameOfBancasExaminadorasTypes = @{$authorPublications->{BancasExaminadoras_type}};
setProducoes ($aut, \@{$authorPublications->{BancasExaminadoras}}, \@totalBancasExaminadoras, \@nameOfBancasExaminadorasTypes, $numberOfBancasExaminadorasTypes, 2, $authorCode, $authorName, $authorPeriods);
print "\n Comissoes julgadoras";
$numberOfComissoesJulgadorasTypes = @{$authorPublications->{ComissoesJulgadoras_type}};
@nameOfComissoesJulgadorasTypes = @{$authorPublications->{ComissoesJulgadoras_type}};
setProducoes ($aut, \@{$authorPublications->{ComissoesJulgadoras}}, \@totalComissoesJulgadoras, \@nameOfComissoesJulgadorasTypes, $numberOfComissoesJulgadorasTypes, 2, $authorCode, $authorName, $authorPeriods);
print "\n Eventos";
$numberOfEventosTypes = @{$authorPublications->{Eventos_type}};
@nameOfEventosTypes = @{$authorPublications->{Eventos_type}};
setProducoes ($aut, \@{$authorPublications->{Eventos}}, \@totalEventos, \@nameOfEventosTypes, $numberOfEventosTypes, 2, $authorCode, $authorName, $authorPeriods);
print "\n";
}
# ---------------------------------------------------------------------------- #
# Passo 3: Filtramos redundancias e criamos a matriz de colaboraçoes
# ---------------------------------------------------------------------------- #
my @netCollaborations;
my @netCollaborationsDetail;
foreach (my $i=0; $i<$numberOfAuthors; $i++)
{
foreach (my $j=0; $j<$numberOfAuthors; $j++)
{
$netCollaborations[$i][$j] = 0;
$netCollaborationsDetail[$i][$j] = "";
}
}
print "\nLog do processamento em: $outputDir/log.txt\n";
print "\n\nFiltrando publicações redudantes na compilacao total: (T=total, DF=depois da filtragem, F=filtradas)";
print LOG "\n================================================================================";
print LOG "\n\nFiltrando publicações redudantes na compilacao total (lista de redundantes)";
my @totalFilteredPublications;
getFilteredList( \@totalPublications, \@totalFilteredPublications, \@nameOfPublicationsTypes, $numberOfPublicationsTypes);
print "\n\nFiltrando produções técnicas redudantes na compilacao total: (T=total, DF=depois da filtragem, F=filtradas)";
print LOG "\n================================================================================";
print LOG "\n\nFiltrando produções técnicas redudantes na compilacao total (lista de redundantes)";
my @totalFilteredProducoesTecnicas;
getFilteredList( \@totalProducoesTecnicas, \@totalFilteredProducoesTecnicas, \@nameOfProducoesTecnicasTypes, $numberOfProducoesTecnicasTypes);
print "\n\nFiltrando produções artísticas redudantes na compilacao total: (T=total, DF=depois da filtragem, F=filtradas)";
print LOG "\n================================================================================";
print LOG "\n\nFiltrando produções artísticas redudantes na compilacao total (lista de redundantes)";
my @totalFilteredProducoesArtisticas;
getFilteredList( \@totalProducoesArtisticas, \@totalFilteredProducoesArtisticas, \@nameOfProducoesArtisticasTypes, $numberOfProducoesArtisticasTypes);
# ---------------------------------------------------------------------------- #
# Passo 4: Ordenamos as diferentes produçoes por ano
# ---------------------------------------------------------------------------- #
print "\n\nOrdenando as producoes por ano:";
my @publicationsByYear;
my %allPublicationsByYear;
my $numberOfAllPublications = sortProducoesByYear(\@totalFilteredPublications, \@publicationsByYear, \%allPublicationsByYear, $numberOfPublicationsTypes, 0);
print "\n- $numberOfAllPublications \t: Publicações";
my @producoesTecnicasByYear;
my %allProducoesTecnicasByYear;
my $numberOfAllProducoesTecnicas = sortProducoesByYear(\@totalFilteredProducoesTecnicas, \@producoesTecnicasByYear, \%allProducoesTecnicasByYear, $numberOfProducoesTecnicasTypes, 0);
print "\n- $numberOfAllProducoesTecnicas \t: Produções técnicas";
my @producoesArtisticasByYear;
my %allProducoesArtisticasByYear;
my $numberOfAllProducoesArtisticas = sortProducoesByYear(\@totalFilteredProducoesArtisticas, \@producoesArtisticasByYear, \%allProducoesArtisticasByYear, $numberOfProducoesArtisticasTypes, 0);
print "\n- $numberOfAllProducoesArtisticas \t: Produções artísticas";
my @orientacoesEmAndamentoByYear;
my %allOrientacoesEmAndamentoByYear;
my $numberOfAllOrientacoesEmAndamento = sortProducoesByYear(\@totalOrientacoesEmAndamento, \@orientacoesEmAndamentoByYear, \%allOrientacoesEmAndamentoByYear, $numberOfOrientacoesTypes, 1);
print "\n- $numberOfAllOrientacoesEmAndamento \t: Orientações em andamento";
my @orientacoesConcluidasByYear;
my %allOrientacoesConcluidasByYear;
my $numberOfAllOrientacoesConcluidas = sortProducoesByYear(\@totalOrientacoesConcluidas, \@orientacoesConcluidasByYear, \%allOrientacoesConcluidasByYear, $numberOfOrientacoesTypes, 1);
print "\n- $numberOfAllOrientacoesConcluidas \t: Orientações concluídas";
my @bancasExaminadorasByYear;
my %allBancasExaminadorasByYear;
my $numberOfAllBancasExaminadoras = sortProducoesByYear(\@totalBancasExaminadoras, \@bancasExaminadorasByYear, \%allBancasExaminadorasByYear, $numberOfBancasExaminadorasTypes, 0);
print "\n- $numberOfAllBancasExaminadoras \t: Bancas examinadoras";
my @comissoesJulgadorasByYear;
my %allComissoesJulgadorasByYear;
my $numberOfAllComissoesJulgadoras = sortProducoesByYear(\@totalComissoesJulgadoras, \@comissoesJulgadorasByYear, \%allComissoesJulgadorasByYear, $numberOfComissoesJulgadorasTypes, 0);
print "\n- $numberOfAllComissoesJulgadoras \t: Comissões julgadoras";
my @eventosByYear;
my %allEventosByYear;
my $numberOfAllEventos = sortProducoesByYear(\@totalEventos, \@eventosByYear, \%allEventosByYear, $numberOfEventosTypes, 0);
print "\n- $numberOfAllEventos \t: Eventos";
# ---------------------------------------------------------------------------- #
# Passo 5: Criacao de graficos estatísticos e grafo de colaboraçoes
# ---------------------------------------------------------------------------- #
print "\n\nCriando os graficos estatísticos e grafo de colaborações.";
my $graphMap;
makeCollaborationsGraph(\@netCollaborations, \@authorList);
makeStatisticsBarsByType(\@publicationsByYear, $numberOfPublicationsTypes, "P", translate("Número de publicações"));
makeStatisticsBars(\%allPublicationsByYear, "$outputDir/P.png", translate("Total de publicações"));
if ($numberOfAllProducoesTecnicas>0)
{
makeStatisticsBarsByType(\@producoesTecnicasByYear, $numberOfProducoesTecnicasTypes, "PT", translate("Número de produções técnicas"));
makeStatisticsBars(\%allProducoesTecnicasByYear, "$outputDir/PT.png", translate("Total de produções técnicas"));
}
if ($numberOfAllProducoesArtisticas>0)
{
makeStatisticsBarsByType(\@producoesArtisticasByYear, $numberOfProducoesArtisticasTypes, "PA", translate("Número de produções artísticas"));
makeStatisticsBars(\%allProducoesArtisticasByYear, "$outputDir/PA.png", translate("Total de produções artísticas"));
}
if ($numberOfAllOrientacoesEmAndamento>0)
{
makeStatisticsBarsByType(\@orientacoesEmAndamentoByYear, $numberOfOrientacoesTypes, "OA", translate("Número de orientações em andamento"));
makeStatisticsBars(\%allOrientacoesEmAndamentoByYear, "$outputDir/OA.png", translate("Total de orientações em andamento"));
}
if ($numberOfAllOrientacoesConcluidas>0)
{
makeStatisticsBarsByType(\@orientacoesConcluidasByYear, $numberOfOrientacoesTypes, "OC", translate("Número de orientações concluídas"));
makeStatisticsBars(\%allOrientacoesConcluidasByYear, "$outputDir/OC.png", translate("Total de orientações concluídas"));
}
if ($numberOfAllBancasExaminadoras>0)
{
makeStatisticsBarsByType(\@bancasExaminadorasByYear, $numberOfBancasExaminadorasTypes, "BE", translate("Número de bancas examinadoras"));
makeStatisticsBars(\%allBancasExaminadorasByYear, "$outputDir/BE.png", translate("Total de bancas examinadoras"));
}
if ($numberOfAllComissoesJulgadoras>0)
{
makeStatisticsBarsByType(\@comissoesJulgadorasByYear, $numberOfComissoesJulgadorasTypes, "CJ", translate("Número de comissões julgadoras"));
makeStatisticsBars(\%allComissoesJulgadorasByYear, "$outputDir/CJ.png", translate("Total de comissões julgadoras"));
}
if ($numberOfAllEventos>0)
{
makeStatisticsBarsByType(\@eventosByYear, $numberOfEventosTypes, "Ev", translate("Número de eventos"));
makeStatisticsBars(\%allEventosByYear, "$outputDir/Ev.png", translate("Total de eventos"));
}
# ---------------------------------------------------------------------------- #
# Passo 6: Criação das páginas web
# Toda enumeração começa em 0 (zero)
# ---------------------------------------------------------------------------- #
print "\n\nCriando páginas web das produções.";
my $dateLang;
my $timestamp;
my $meta = "
$groupName ";
my $scriptLattes_message = "";
my $graph_message;
my $map_message;
my $noItems;
my $button;
if ($lang eq "EN")
{
$dateLang = Date::Language->new('English');
$timestamp = $dateLang->time2str("%A, %m/%d/%Y %X\n", time);
$noItems = "
No item was found on Lattes curricula
";
$button = "
$groupName
";
if ($fromYear ne "" && $toYear ne "") { $scriptLattes_message .= "(*) Report created with productions since $itemsFromYear to ".translate($itemsToYear); }
$scriptLattes_message .= "
Processing date: ".$timestamp."
";
$graph_message = "$numberOfAuthors Lattes curricula were considered.
It generated the following Colaborations Graph based on publications, technical production and artistic/cultural productions.
Click on name inside the vertex to visualize the Lattes Curriculum.
Ningun item fue encontrado en los curriculos Lattes
";
$button = "
$groupName
";
if ($fromYear ne "" && $toYear ne "") { $scriptLattes_message .= "(*) Reporte creado con producciones desde $itemsFromYear hasta ".translate($itemsToYear); }
$scriptLattes_message .= " Fecha de procesamiento: ".$timestamp." ";
$graph_message = "$numberOfAuthors curriculos Lattes fueron considerados, generando el siguiente Grafo de Colaboraciones encontradas con base en las publicaciones,
producciones técnicas y producciones artísticas.
Haga click en el nombre dentro del vertice para visualizar el respectivo currículo Lattes. Haga click en la arista para visualizar las producciones realizadas en colaboración. ";
if ($flagTodosOsNos!~"s") { $graph_message .= "Solamente los miembros con co-autoria en el grupo analizado aparecen en el grafo."; }
$graph_message .= "
";
if ($fromYear ne "" && $toYear ne "") { $scriptLattes_message .= "(*) Relatório criado com produções desde $itemsFromYear até $itemsToYear"; }
$scriptLattes_message .= " Data de processamento: ".$timestamp." ";
$graph_message = "$numberOfAuthors currículos Lattes foram considerados, gerando o seguinte grafo de colaborações encontradas com base nas publicações,
produções técnicas e produções artísticas.
Clique no nome dentro do vértice para visualizar o currículo Lattes. Clique na aresta para visualizar as produções realizadas em colaboração. ";
if ($flagTodosOsNos!~"s") { $graph_message .= "Apenas os membros com co-autoria no grupo analisado aparecem no grafo."; }
$graph_message .= "
$graph_message ";
if ($flagIndicadores=~"s")
{
print COLLABORATIONS "Para cada vértice: Os valores entre parênteses indicam \"número de publicações\"/\"grau de colaboração\",
a cor representa a quantidade de publicações do membro do grupo considerando o seguinte mapa de cores:
";
}
print COLLABORATIONS "
$graphMap $ending_message";
close(COLLABORATIONS);
open(APPLET,">$outputDir/collaborators_applet.$extension");
print APPLET "$head_message
$ending_message";
close(APPLET);
# (i.1) Detalhe das colaborações
open(COLLABORATIONSDETAIL,">$outputDir/collaboratorsDetail.html");
print COLLABORATIONSDETAIL "$head_message ";
for (my $i=0; $i<$numberOfAuthors-1; $i++)
{
for (my $j=$i+1; $j<$numberOfAuthors; $j++)
{
my $indI = $i;
my $indJ = $j;
if ($indI>$indJ) # trocamos
{
my $temp = $indI;
$indI = $indJ;
$indJ = $temp;
}
if ($netCollaborationsDetail[$indI][$indJ] ne "")
{
print COLLABORATIONSDETAIL "\n
";
$numberOfItem++;
}
# ---------------------------------------------------------------------------- #
# isValidItem: Avalia o ano da publição nos períodos do autor
# ---------------------------------------------------------------------------- #
sub isValidItem
{
my($year, $listOfPeriods) = @_;
my $numberOfPeriods = @{$listOfPeriods};
# se não foi informado período algúm OU nao foi achao o ano na produçao
#if($year!~/^[\d]+$/ || $numberOfPeriods==0)
if($year!~/^[\d]+$/)
{
return 1;
}
if ($fromYear<=$year && $year<=$toYear || $fromYear eq "" && $toYear eq "")
{
if($numberOfPeriods==0)
{
return 1;
}
for(my $p=0; $p<$numberOfPeriods; $p++)
{
if( $$listOfPeriods[$p][0]<=$year && $year<=$$listOfPeriods[$p][1])
{
return 1;
}
}
}
return 0;
}
# ---------------------------------------------------------------------------- #
# getListOfPeriods
# ---------------------------------------------------------------------------- #
sub getListOfPeriods
{
my($authorPeriods) = @_;
my @listOfPeriods;
$authorPeriods =~ s/HOJE/2099/gi;
my @listOfStrings = split('&', $authorPeriods) ;
for (my $i=0; $i<@listOfStrings; $i++)
{
my $period = $listOfStrings[$i];
my @date = split ('-', $period, 2);
if( scalar($date[0])>scalar($date[1]) )
{
print "\n ERRO: Período invalido ($period) no arquivo de entrada\n\n";
exit;
}
$listOfPeriods[$i][0] = scalar($date[0]);
$listOfPeriods[$i][1] = scalar($date[1]);
}
return @listOfPeriods;
}
# ---------------------------------------------------------------------------- #
# getFilteredList
# ---------------------------------------------------------------------------- #
sub getFilteredList
{
my($totalProducoes, $totalFilteredProducoes, $nameOfTypesRef, $numberOfTypes) = @_;
my @nameOfTypes = @$nameOfTypesRef;
for (my $type=0; $type<$numberOfTypes; $type++)
{
if ($$totalProducoes[$type]) # Se existe publicacoes do tipo $type
{
print LOG "\n\nProduções do tipo: ".$nameOfTypes[$type];
my @totalProducoesByType = @{$$totalProducoes[$type]};
my $numberOfProducoesByType = @{$totalProducoesByType[0]};
my $numOfSimilar = 0;
# ************************************************************************* #
# ************************************************************************* #
my @arrayOfLetters;
my $indexOfLetter = 0;
my @Lista;
for (my $pubi=0; $pubi<=$numberOfProducoesByType-1; $pubi++)
{
my $firstLetter = substr(${$totalProducoesByType[1]}[$pubi], 0, 1);
my $index = -1;
for (my $i=0; $i<$indexOfLetter; $i++)
{
if ($arrayOfLetters[$i] eq $firstLetter)
{
$index = $i;
}
}
if ($index == -1) # se a letra não está no BAG
{
$arrayOfLetters[$indexOfLetter] = $firstLetter;
$index = $indexOfLetter;
$indexOfLetter++;
}
# insere na Lista[$index] o 3-item
push @{$Lista[$index][0]}, ${$totalProducoesByType[0]}[$pubi];
push @{$Lista[$index][1]}, ${$totalProducoesByType[1]}[$pubi];
push @{$Lista[$index][2]}, ${$totalProducoesByType[2]}[$pubi];
}
# operamos para cada BAG: Comparamos somente os elementos dentro do BAG
for (my $i=0; $i<$indexOfLetter; $i++)
{
my $numberOfElements= @{$Lista[$i][0]};
# -------------------------------------------------------------------- #
# Para toda publicacao da lista $i
# comparamos a publicacao com as outras da mesmo BAG
# -------------------------------------------------------------------- #
for (my $pubi=0; $pubi<=$numberOfElements-1; $pubi++)
{
my $similarPublication = 0;
for (my $pubj=$pubi+1; $pubj<=$numberOfElements-1; $pubj++)
{
if (${$Lista[$i][0]}[$pubi] ne ${$Lista[$i][0]}[$pubj]) # para autores diferentes
{
if( compareString(${$Lista[$i][1]}[$pubi],${$Lista[$i][1]}[$pubj]) )
{
$numOfSimilar++;
print LOG "\n\n[$numOfSimilar]: ".${$authorList[${$Lista[$i][0]}[$pubi]]}[1]." -> ".${$authorList[${$Lista[$i][0]}[$pubj]]}[1];
print LOG "\n- ".${$Lista[$i][1]}[$pubi];
print LOG "\n- ".${$Lista[$i][1]}[$pubj];
$netCollaborations[${$Lista[$i][0]}[$pubi]][${$Lista[$i][0]}[$pubj]]++;
$netCollaborations[${$Lista[$i][0]}[$pubj]][${$Lista[$i][0]}[$pubi]]++;
$similarPublication = 1;
my $indI = ${$Lista[$i][0]}[$pubi];
my $indJ = ${$Lista[$i][0]}[$pubj];
if ($indI>$indJ) # trocamos
{
my $temp = $indI;
$indI = $indJ;
$indJ = $temp;
}
$netCollaborationsDetail[$indI][$indJ] .= "\n
".$nameOfTypes[$type]." ".highlightTitle(${$Lista[$i][2]}[$pubj],"P");
}
}
}
if ($similarPublication==0)
{
push @{$$totalFilteredProducoes[$type][0]}, ${$Lista[$i][0]}[$pubi];
push @{$$totalFilteredProducoes[$type][1]}, ${$Lista[$i][1]}[$pubi];
push @{$$totalFilteredProducoes[$type][2]}, ${$Lista[$i][2]}[$pubi];
}
}
}
# ************************************************************************* #
# ************************************************************************* #
my @totalFilteredPubByType = @{$$totalFilteredProducoes[$type]};
my $numberOfFilteredPubByType = @{$totalFilteredPubByType[0]};
print "\n-\t T=".$numberOfProducoesByType."\t\t DF=".$numberOfFilteredPubByType."\t\t F=".($numberOfProducoesByType-$numberOfFilteredPubByType)." \t\t: ".$nameOfTypes[$type];
}
}
}
# ---------------------------------------------------------------------------- #
# sortProducoesByYear
# ---------------------------------------------------------------------------- #
sub sortProducoesByYear
{
my($totalFilteredProducoes, $producoesByYear, $allProducoesByYear, $numberOfTypes, $flag) = @_;
my $numberOfAllProducoes = 0;
for (my $type=0; $type<$numberOfTypes; $type++)
{
if ($$totalFilteredProducoes[$type]) # Se existe publicacoes do tipo $type
{
my @totalFilteredPubByType = @{$$totalFilteredProducoes[$type]};
my $numberOfFilteredPubByType;
if ($flag==0) { $numberOfFilteredPubByType = @{$totalFilteredPubByType[0]}; }
if ($flag==1) { $numberOfFilteredPubByType = @totalFilteredPubByType; }
$numberOfAllProducoes += $numberOfFilteredPubByType;
for (my $p=0; $p<$numberOfFilteredPubByType; $p++)
{
my $pub;
if ($flag==0) { $pub = ${$totalFilteredPubByType[2]}[$p]; }
if ($flag==1) { $pub = $totalFilteredPubByType[$p]; }
my $year = getYearOnPublication($pub);
push @{$$producoesByYear[$type]{$year}} , $pub;
push @{$$allProducoesByYear{$year}}, $pub;
}
}
}
return $numberOfAllProducoes;
}
# ---------------------------------------------------------------------------- #
# getNumberOfProducoes
# ---------------------------------------------------------------------------- #
sub getNumberOfProducoes
{
my($listOfProducoes, $flag) = @_;
my $numberOfProduces;
if ($flag==0) { $numberOfProduces = @{$$listOfProducoes[0]}; } # para publicações e produções técnicas & artísticas
if ($flag==1) { $numberOfProduces = @{$listOfProducoes}; } # para orientações
return $numberOfProduces;
}
# ---------------------------------------------------------------------------- #
# getNumberOfPages: Calcula o número de páginas dado o número de produções
# ---------------------------------------------------------------------------- #
sub getNumberOfPages
{
my($numberOfProducoes) = @_;
my $numberOfPages = 1;
if (scalar($numberOfProducoes)>=$MAXproducoesByPage)
{
$numberOfPages = int($numberOfProducoes/$MAXproducoesByPage);
if ($numberOfProducoes % $MAXproducoesByPage>0)
{
$numberOfPages+=1;
}
}
return $numberOfPages;
}
# ---------------------------------------------------------------------------- #
# makeHTMLOfProducoes
# ---------------------------------------------------------------------------- #
sub makeHTMLOfProducoes
{
my($totalFilteredProducoes, $producoesByYear, $nameOfProducoesTypes, $numberOfTypes, $prefix, $flag) = @_;
for (my $type=0; $type<$numberOfTypes; $type++)
{
if ($$producoesByYear[$type]) # Se existe publicacoes do tipo $type
{
my $nameOfProducoes = $$nameOfProducoesTypes[$type];
my $numberOfProducoes = getNumberOfProducoes(\@{$$totalFilteredProducoes[$type]}, $flag);
$nameOfProducoes =~ s/\_/ /g;
makeHTMLItemOfProducoes(\%{$$producoesByYear[$type]}, translate($nameOfProducoes), $numberOfProducoes, $type, $prefix);
}
}
}
# ---------------------------------------------------------------------------- #
# makeHTMLItemOfProducoes
# ---------------------------------------------------------------------------- #
sub makeHTMLItemOfProducoes
{
my($producoesByYear, $nameOfProducoes, $numberOfProducoes, $type, $prefix) = @_;
my $numberOfPages = getNumberOfPages($numberOfProducoes);
print INDEXHTML "\n
";
print SERIES "\n$prefix$type:";
if ($type ne "")
{
$allInfoByType->{$prefix}{$type} = ();
}
my $pageNumber = 0;
my $producoesByPage = 0;
my @htmlPageBuffer; # Armazenamos no htmlPageBuffer a lista de produções para cada página de no máximo $MAXproducoesByPage
# Ordenar as chaves do hash %producoesByYear por ano inverso
foreach my $year (reverse sort(keys %{$producoesByYear}))
{
my $index = 0;
if ($producoesByPage<$MAXproducoesByPage) { $htmlPageBuffer[$pageNumber] .= "\n
$year
\n
"; }
if ($type ne "")
{
$allInfoByType->{$prefix}{$type}{$year} = ();
}
foreach my $producao (sort @{$$producoesByYear{$year}})
{
$index += 1;
$producoesByPage += 1;
if ($type ne "")
{
push(@{$allInfoByType->{$prefix}{$type}{$year}}, $producao);
}
$htmlPageBuffer[$pageNumber] .= "\n
";
#}
print SERIES " ($year,$index)";
}
# Criamos as páginas contendo no maximo $MAXproducoesByPage publicaoes
for (my $p=0; $p<=$pageNumber; $p++)
{
my $linksOfPages = ""; # Indice de páginas (links para melhorar a navegação nas páginas)
if ($numberOfPages>=2)
{
$linksOfPages = "\n