epita-std
/
ACU
Archived
1
0
Fork 0
This repository has been archived on 2021-10-08. You can view files and clone it, but cannot push or open issues or pull requests.
ACU/ACU/Project.pm

184 lines
3.7 KiB
Perl

#! /usr/bin/env perl
package Project;
use v5.10.1;
use strict;
use warnings;
use Carp;
use XML::LibXML;
use XML::SAX::ParserFactory;
use ACU::Log;
package ProjectHandler;
use strict;
use warnings;
use Carp;
my @stack_tags = (
"manager",
"submission",
"slides",
"subject",
"tutorial",
);
my @stackonce_tags = (
"period",
"upload",
"vcs",
"news",
"documents",
);
my @value_tags = (
"result",
"message",
"name",
"firstname",
"lastname",
"login",
"begin",
"end",
"date",
"tag",
"newsgroup"
);
sub new ($$)
{
my $class = shift;
my $self = {
parsed => shift,
saveChars => 0,
stack => [],
values => ""
};
bless $self, $class;
return $self;
}
sub start_element
{
my ($self, $element) = @_;
if ($element->{Name} eq "project" || $element->{Name} eq "Project") {
$self->{parsed}{name} = $element->{Attributes}{"{}name"}{Value} if ($element->{Attributes}{"{}name"});
}
elsif (grep { $element->{Name} eq $_ } @stack_tags)
{
my $data = {};
$data->{name} = $element->{Attributes}{"{}name"}{Value} if ($element->{Attributes}{"{}name"});
$data->{type} = $element->{Attributes}{"{}type"}{Value} if ($element->{Attributes}{"{}type"});
$data->{written_in} = $element->{Attributes}{"{}written_in"}{Value} if ($element->{Attributes}{"{}written_in"});
push @{ $self->{stack} }, $data;
}
elsif (grep { $element->{Name} eq $_ } @value_tags) {
$self->{saveChars} = 1;
$self->{values} = "";
}
elsif ($element->{Name} eq "vcs") {
push @{ $self->{stack} }, {
url => $element->{Attributes}{"{}url"}{Value},
tag => $element->{Attributes}{"{}tag"}{Value},
token => $element->{Attributes}{"{}token"}{Value} // 0,
quota => $element->{Attributes}{"{}quota"}{Value} // 20,
type => $element->{Attributes}{"{}type"}{Value} // "git",
};
}
elsif ($element->{Name} eq "upload") {
push @{ $self->{stack} }, {
format => $element->{Attributes}{"{}format"}{Value},
url => $element->{Attributes}{"{}url"}{Value},
identifier => $element->{Attributes}{"{}identifier"}{Value},
quota => $element->{Attributes}{"{}quota"}{Value} // 10,
};
}
elsif (grep { $element->{Name} eq $_ } @stackonce_tags) {
push @{ $self->{stack} }, { };
}
}
sub characters
{
my ($self, $characters) = @_;
if ($self->{saveChars}) {
$self->{values} .= $characters->{Data};
}
}
sub end_element
{
my ($self, $element) = @_;
if ($self->{saveChars})
{
if (@{ $self->{stack} } == 0) {
$self->{parsed}{$element->{Name}} = $self->{values};
}
else {
my $pop = pop @{ $self->{stack} };
$pop->{$element->{Name}} = $self->{values};
push @{ $self->{stack} }, $pop;
}
$self->{saveChars} = 0;
}
elsif (grep { $element->{Name} eq $_ } @stack_tags)
{
my $item = pop @{ $self->{stack} };
my $pop = pop @{ $self->{stack} };
if ($element->{Name} eq "submission") {
push @{ $self->{stack} }, $pop;
$item->{doc} = "$pop->{name}";
$pop = undef;
}
if ($pop)
{
if (!exists $pop->{$element->{Name}."s"}) {
$pop->{$element->{Name}."s"} = [];
}
push @{ $pop->{$element->{Name}."s"} }, $item;
push @{ $self->{stack} }, $pop;
}
else
{
if (!exists $self->{parsed}{$element->{Name}."s"}) {
$self->{parsed}{$element->{Name}."s"} = [];
}
push @{ $self->{parsed}{$element->{Name}."s"} }, $item;
}
}
elsif (grep { $element->{Name} eq $_ } @stackonce_tags)
{
my $item = pop @{ $self->{stack} };
my $pop = pop @{ $self->{stack} };
if ($pop)
{
$pop->{$element->{Name}} = $item;
push @{ $self->{stack} }, $pop;
}
else {
$self->{parsed}{$element->{Name}} = $item;
}
}
else {
return;
}
}
1;