ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ActiveDoc/Container.pm
Revision: 1.1
Committed: Thu Dec 15 16:38:10 2005 UTC (19 years, 5 months ago) by sashby
Content type: text/plain
Branch: MAIN
Log Message:
Start to migrate project boot to XML based parsing.

File Contents

# User Rev Content
1 sashby 1.1 #____________________________________________________________________
2     # File: ActiveDoc::Container.pm
3     #____________________________________________________________________
4     #
5     # Author: Shaun Ashby <Shaun.Ashby@cern.ch>
6     # Update: 2005-11-25 15:54:24+0100
7     # Revision: $Id$
8     #
9     # Copyright: 2005 (C) Shaun Ashby
10     #
11     #--------------------------------------------------------------------
12     package ActiveDoc::Container;
13     require 5.004;
14     use Exporter;
15    
16     @ISA=qw(Exporter);
17     @EXPORT_OK=qw( );
18     our $AUTOLOAD;
19    
20     =head1 NAME
21    
22     ActiveDoc::Container - A container base class which handles basic data
23     storage in a nested data structure.
24    
25     =head1 SYNOPSIS
26    
27     Not to be instantiated directly. Every SCRAM document class that inherits from
28     ActiveDoc::SimpleXMLDoc must implement a class called Container which inherits
29     from this base class. The container class must be located in the X::Y namespace where X::Y
30     is the class of the SCRAM document.
31    
32     =head1 DESCRIPTION
33    
34     Not to be instantiated. Every SCRAM document class that inherits from
35     ActiveDoc::SimpleXMLDoc must implement a class called Container which inherits
36     from this base class. The container class must be located in the X::Y namespace where X::Y
37     is the class of the SCRAM document.
38    
39     =head1 METHODS
40    
41     =over
42    
43     =cut
44    
45     sub new()
46     {
47     ###############################################################
48     # new #
49     ###############################################################
50     # modified : Fri Nov 25 15:54:30 2005 / SFA #
51     # params : #
52     # : #
53     # function : #
54     # : #
55     ###############################################################
56     my $proto=shift;
57     my $class=ref($proto) || $proto;
58     my $self={};
59    
60     bless $self,$class;
61    
62     $self->{activelevel}=0;
63     $self->{currenttag} = [];
64     $self->{nested} = {};
65     $self->{content}= {};
66     $self->{leveldata_}={};
67    
68     return $self;
69     }
70    
71     sub register_handlers_()
72     {
73     my $self=shift;
74     my ($handler_data)=@_;
75     $self->{HANDLER_DATA}=$handler_data;
76     map
77     {
78     if ($self->{HANDLER_DATA}->{$_}->[1])
79     {
80     # Store nested tags:
81     $self->nested_($_,1);
82     }
83     else
84     {
85     $self->nested_($_,0);
86     }
87     } keys %$handler_data;
88     }
89    
90     sub currentenv_()
91     {
92     my $self=shift;
93     # Return the name of the env at the top of the stack:
94     return $self->{currenttag}->[$#{$self->{currenttag}}];
95     }
96    
97     sub parentenv_()
98     {
99     my $self=shift;
100     # Return the name of the env before the top of the stack:
101     return $self->{currenttag}->[$#{$self->{currenttag}}-1];
102     }
103    
104     sub nested_()
105     {
106     my $self=shift;
107     my ($tag,$val)=@_;
108    
109     if ($val ne "")
110     {
111     $self->{nested}->{$tag} = $val;
112     }
113     else
114     {
115     return $self->{nested}->{$tag};
116     }
117     }
118    
119     sub open()
120     {
121     my $self=shift;
122     my ($current)=@_;
123     $self->{activelevel}++;
124     push (@{$self->{currenttag}},$current);
125     }
126    
127     sub close()
128     {
129     my $self=shift;
130     my ($current)=@_;
131    
132     if ($current ne $self->parentenv_())
133     {
134     $self->{leveldata_}->{$self->{activelevel}-1}->{$self->parentenv_()}->{$current} =
135     $self->{leveldata_}->{$self->{activelevel}}->{$current};
136     }
137     else
138     {
139     $self->{content}->{$current} = $self->{leveldata_}->{$self->{activelevel}}->{$current};
140     }
141    
142     # Look for text content for current env:
143     $self->textstorage_($current);
144     # Clean up the data for this tag at current level:
145     delete $self->{leveldata_}->{$self->{activelevel}}->{$current};
146     # Drop down to the next level:
147     $self->{activelevel}--;
148     pop @{$self->{currenttag}};
149     }
150    
151     sub text_()
152     {
153     my $self=shift;
154     if (exists($self->{textcontent}->{$self->currentenv_()}))
155     {
156     push(@{$self->{textcontent}->{$self->currentenv_()}},@_);
157     }
158     }
159    
160     sub data_()
161     {
162     my $self=shift;
163     return $self->{content};
164     }
165    
166     sub textstorage_()
167     {
168     my $self=shift;
169     my ($current)=@_;
170    
171     # Look for text content for current env:
172     if (exists($self->{textcontent}->{$current}))
173     {
174     if (exists($self->{leveldata_}->{$self->{activelevel}-1}->{$self->parentenv_()}->{$current}->{'content'}))
175     {
176     $self->{leveldata_}->{$self->{activelevel}-1}->{$self->parentenv_()}->{$current}->{'content'} =
177     $self->{textcontent}->{$current};
178     }
179     elsif ($self->{content}->{$current}->{'content'})
180     {
181     $self->{content}->{$current}->{'content'} = $self->{textcontent}->{$current};
182     }
183    
184     delete $self->{textcontent}->{$current};
185     }
186     }
187    
188     sub AUTOLOAD()
189     {
190     my $self=shift;
191     my ($attributes)=@_;
192    
193     return if $AUTOLOAD =~ /::DESTROY$/;
194     my $name=$AUTOLOAD;
195     $name =~ s/.*://;
196    
197     if (exists($self->{leveldata_}->{$self->{activelevel}}))
198     {
199     $self->{leveldata_}->{$self->{activelevel}}->{$name} = $attributes;
200     }
201     else
202     {
203     $self->{leveldata_}->{$self->{activelevel}} = { $name => $attributes };
204     }
205     }
206    
207     sub DESTROY()
208     {
209     my $self=shift;
210     # Clean up the contents which aren't needed any more:
211     delete $self->{textcontent};
212     delete $self->{HANDLER_DATA};
213     delete $self->{activelevel};
214     delete $self->{leveldata_};
215     delete $self->{nested};
216     delete $self->{currenttag};
217     }
218    
219     1;
220    
221     =back
222    
223     =head1 AUTHOR/MAINTAINER
224    
225     Shaun ASHBY
226    
227     =cut
228