184 lines
3.7 KiB
Perl
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;
|