Parse project.xml
This commit is contained in:
parent
3678b13055
commit
0825ca12e0
1 changed files with 183 additions and 0 deletions
183
ACU/Project.pm
Normal file
183
ACU/Project.pm
Normal file
|
@ -0,0 +1,183 @@
|
|||
#! /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 { /^\Q$element->{Name}\E$/ } @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 { /^\Q$element->{Name}\E$/ } @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 { /^\Q$element->{Name}\E$/ } @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 { /^\Q$element->{Name}\E$/ } @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 { /^\Q$element->{Name}\E$/ } @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;
|
Reference in a new issue