ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ActiveDoc/SimpleDoc.pm
Revision: 1.5
Committed: Fri Dec 10 13:41:36 2004 UTC (20 years, 5 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V1_0_3-p4, V1_0_3-p3, V1_0_3-p2, before110xmlBRmerge, V1_0_4p1, V1_0_3-p1, V1_0_3, V1_0_2, V1_0_2_p1, v102p1, V1_0_1, V1_0_0
Branch point for: v103_with_xml, v103_branch
Changes since 1.4: +23 -1 lines
Log Message:
Merged V1_0 branch to HEAD

File Contents

# User Rev Content
1 williamc 1.1 #
2     # SimpleDoc.pm
3     #
4     # Originally Written by Christopher Williams
5     #
6     # Description
7     # -----------
8 williamc 1.2 # Simple multi parsing functionality and group manipulation
9 williamc 1.1 #
10     # Interface
11     # ---------
12 williamc 1.3 # new([DocVersionTag]) : A new ActiveDoc object. You can also
13     # specify an alternative doc version tag
14 williamc 1.1 # filetoparse([filename]) : Set/Return the filename of document
15     # newparse(parselabel) : Create a new parse type
16     # parse(parselabel) : Parse the document file for the given parse level
17 williamc 1.3 # addtag(parselabel,tagname,start,obj,[text,obj,end,obj]) :
18 williamc 1.1 # Add tags to the parse given by label
19 williamc 1.2 # grouptag(tagname, parselabel) : Allow a tag to switch context
20     # - if not you can never turn a context off!
21 williamc 1.1 # checktag(tagname, hashref, param) : check for existence of param in
22     # hashref from a tag call
23     # includeparse(local_parsename, objparsename, activedoc) : copy the parse from
24     # one object to another
25     # currentparser() : return the current parser object
26     # currentparsename([name]) : get/set current parse name
27     #
28     # addignoretags(parsename) : add <ignore> </igonore> tags funtionality to the
29     # specified parse
30 williamc 1.2 # opengroup(name) : declare a group to be open
31     # closegroup(name) : declare a group to be closed
32     # allowgroup(name,parse) : allow a group so named
33     # disallowgroup(name,parse) : disallow the named group
34     # restoregroup(name,parse) : restore group access setting (that before last change)
35 williamc 1.3 # doctype() : return the (type,version) of the document
36     # as specified by the DocVersionTag
37     # filenameref(string) : A string to refer to the file in parse error messages
38     # etc. Default is filetoparse
39 williamc 1.1 # --------------- Error handling routines ---------------
40     # verbose(string) : Print string in verbosity mode
41     # verbosity(0|1) : verbosity off|on
42     # line() : return the current line number in the current parse
43     # tagstartline() : return the line number where the current tag was
44     # opened
45     # parseerror(string) : print error and associate with line number etc.
46     # error(string) : handle an error
47    
48     package ActiveDoc::SimpleDoc;
49     require 5.004;
50     use ActiveDoc::Parse;
51    
52     sub new {
53     my $class=shift;
54     $self={};
55     bless $self, $class;
56 williamc 1.3 $self->_initdoc("doc",@_);
57 williamc 1.1 return $self;
58     }
59    
60 williamc 1.3 sub doctype {
61     my $self=shift;
62     my $rv=1;
63    
64     undef $self->{docversion};
65     undef $self->{doctype};
66     $self->parse("doc");
67     return ($self->{doctype},$self->{docversion});
68     }
69    
70     sub filenameref {
71     my $self=shift;
72     if ( @_ ) {
73     $self->{filenameref}=shift;
74     }
75     return (defined $self->{filenameref})?$self->{filenameref}
76     :$self->filetoparse();
77     }
78    
79     sub _initdoc {
80     my $self=shift;
81     my $parsename=shift;
82    
83     $self->{doctag}="DOC";
84     if ( @_ ) {
85     $self->{doctag}=shift;
86     }
87     $self->newparse($parsename);
88     $self->addtag($parsename,$self->{doctag},\&Doc_Start, $self);
89 williamc 1.1 }
90    
91     sub verbosity {
92     my $self=shift;
93     $self->{verbose}=shift;
94     }
95    
96     sub verbose {
97     my $self=shift;
98     my $string=shift;
99    
100     if ( $self->{verbose} ) {
101     print ">".ref($self)."($self) : \n->".$string."\n";
102     }
103     }
104    
105     # ----- parse related routines --------------
106     sub parse {
107     my $self=shift;
108     $parselabel=shift;
109     my $file=$self->filetoparse();
110 sashby 1.5
111 williamc 1.3 if ( -f $file ) {
112 williamc 1.1 if ( exists $self->{parsers}{$parselabel} ) {
113     $self->verbose("Parsing $parselabel in file $file");
114     $self->{currentparsename}=$parselabel;
115     $self->{currentparser}=$self->{parsers}{$parselabel};
116     $self->{parsers}{$parselabel}->parse($file,@_);
117     delete $self->{currentparser};
118     $self->{currentparsename}="";
119     $self->verbose("Parse $parselabel Complete");
120     }
121     }
122     else {
123 williamc 1.3 $self->error("Cannot parse \"$parselabel\" - file $file not known");
124 williamc 1.1 }
125     }
126    
127 sashby 1.5 sub parsefilelist
128     {
129     my $self=shift;
130     my $parselabel=shift;
131     my ($filenames)=@_;
132    
133     if ( exists $self->{parsers}{$parselabel} )
134     {
135     $self->verbose("ParsingFileList: Label = $parselabel (files = ".join(",",@$filenames)." ");
136     $self->{currentparsename}=$parselabel;
137     $self->{currentparser}=$self->{parsers}{$parselabel};
138     $self->{parsers}{$parselabel}->parsefilelist($filenames);
139     delete $self->{currentparser};
140     $self->{currentparsename}="";
141     $self->verbose("ParseFileList $parselabel Complete");
142     }
143     else
144     {
145     $self->error("Cannot parse \"$parselabel\" - Unknown parser!!");
146     }
147     }
148    
149 williamc 1.1 sub currentparsename {
150     my $self=shift;
151     @_?$self->{currentparsename}=shift
152     :(defined $self->{currentparsename}?$self->{currentparsename}:"");
153     }
154    
155     sub currentparser {
156     my $self=shift;
157     return $self->{currentparser};
158     }
159    
160    
161     sub newparse {
162     my $self=shift;
163     my $parselabel=shift;
164    
165     $self->{parsers}{$parselabel}=ActiveDoc::Parse->new();
166     }
167    
168     sub addignoretags {
169     my $self=shift;
170     my $parselabel=shift;
171     $self->{parsers}{$parselabel}->addignoretags();
172     }
173    
174     sub cleartags {
175     my $self=shift;
176     my $parselabel=shift;
177    
178     $self->{parsers}{$parselabel}->cleartags();
179     }
180    
181    
182     sub includeparse {
183     my $self=shift;
184     my $parselabel=shift;
185     my $remoteparselabel=shift;
186     my $activedoc=shift;
187    
188     # Some error trapping
189     if ( ! exists $self->{parsers}{$parselabel} ) {
190     $self->error("Unknown local parse name specified");
191     }
192     if ( ! exists $activedoc->{parsers}{$remoteparselabel} ) {
193     $self->error("Unknown parse name specified in remote obj $activedoc");
194     }
195    
196     #
197     my $rp=$activedoc->{parsers}{$remoteparselabel};
198     $self->{parsers}{$parselabel}->includeparse($rp);
199     }
200    
201     sub addtag {
202     my $self=shift;
203     my $parselabel=shift;
204 williamc 1.3 if ( ( $#_ != 6 ) && ( $#_ != 2) ) {
205 williamc 1.1 $self->error("Incorrect addtags specification\n".
206     "called with :\n@_ \n");
207     }
208     $self->{parsers}{$parselabel}->addtag(@_);
209     }
210    
211     sub filetoparse {
212     my $self=shift;
213    
214     if ( @_ ) {
215     $self->{filename}=shift;
216     }
217     return $self->{filename};
218 williamc 1.2 }
219     # --------- Group services
220     sub grouptag {
221     my $self=shift;
222     my $name=shift;
223     my $parselabel=shift;
224    
225     $self->{parsers}{$parselabel}->contexttag($name);
226     }
227    
228     sub opengroup {
229     my $self=shift;
230     my $name=shift;
231    
232     if ( defined $self->currentparser ) {
233     $self->currentparser()->opencontext($name);
234     }
235     else {
236     $self->error("Cannot Call opengroup outside of a parse (".
237     caller().")");
238     }
239     }
240    
241     sub closegroup {
242     my $self=shift;
243     my $name=shift;
244    
245     if ( defined $self->currentparser ) {
246     $self->currentparser()->closecontext($name);
247     }
248     else {
249     $self->error("Cannot Call closegroup outside of a parse (".
250     caller().")");
251     }
252     }
253    
254     sub allowgroup {
255     my $self=shift;
256     my $name=shift;
257     my $parselabel=shift;
258    
259     $self->{parsers}{$parselabel}->includecontext($name);
260     }
261    
262     sub disallowgroup {
263     my $self=shift;
264     my $name=shift;
265     my $parselabel=shift;
266    
267     $self->{parsers}{$parselabel}->excludecontext($name);
268 williamc 1.1 }
269    
270     # -------- Error Handling and Error services --------------
271    
272     sub error {
273     my $self=shift;
274     my $string=shift;
275    
276     die $string."\n";
277     }
278    
279     sub parseerror {
280     my $self=shift;
281     my $string=shift;
282    
283     if ( $self->currentparsename() eq "" ) {
284 williamc 1.3 $self->error("Error In file ".$self->filenameref."\n".$string);
285 williamc 1.1 }
286     else {
287     $line=$self->line();
288 williamc 1.3 print "Parse Error in ".$self->filenameref().", line ".
289 williamc 1.1 $line."\n";
290     print $string."\n";
291     exit;
292     }
293     }
294    
295     sub checktag {
296     my $self=shift;
297     my $tagname=shift;
298     my $hashref=shift;
299     my $param=shift;
300    
301     if ( ! exists $$hashref{$param} ) {
302     $self->parseerror("Incomplete Tag <$tagname> : $param required");
303     }
304     }
305    
306     sub line {
307     my $self=shift;
308     return $self->{currentparser}->line();
309     }
310    
311     sub tagstartline {
312     my $self=shift;
313     return $self->{currentparser}->tagstartline();
314     }
315    
316 williamc 1.3 # -- tag routines
317     sub Doc_Start {
318     my $self=shift;
319     my $name=shift;
320     my $hashref=shift;
321    
322     $self->checktag($name, $hashref, "type");
323     $self->checktag($name, $hashref, "version");
324    
325     $self->{doctype}=$$hashref{'type'};
326     $self->{docversion}=$$hashref{'version'};
327     }