From 0825ca12e0cb850d1dde4dca582e42df83f99fce Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Mon, 16 Sep 2013 06:43:33 +0200 Subject: [PATCH] Parse project.xml --- ACU/Project.pm | 183 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 ACU/Project.pm diff --git a/ACU/Project.pm b/ACU/Project.pm new file mode 100644 index 0000000..1a25064 --- /dev/null +++ b/ACU/Project.pm @@ -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;