ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ActiveDoc/SimpleDoc.pm
Revision: 1.4
Committed: Tue Dec 4 19:24:04 2001 UTC (23 years, 5 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V1_pre0, SCRAM_V1, SCRAMV1_IMPORT, V0_19_7, V0_19_6, V0_19_6p1, V0_19_5, SFATEST, V0_19_4, V0_19_4_pre3, V0_19_4_pre2, V0_19_4_pre1, V0_19_3, V0_19_2, V0_19_1
Branch point for: V1_pre1, SCRAM_V1_BRANCH, V0_19_4_B
Changes since 1.3: +0 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #
2 # SimpleDoc.pm
3 #
4 # Originally Written by Christopher Williams
5 #
6 # Description
7 # -----------
8 # Simple multi parsing functionality and group manipulation
9 #
10 # Interface
11 # ---------
12 # new([DocVersionTag]) : A new ActiveDoc object. You can also
13 # specify an alternative doc version tag
14 # 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 # addtag(parselabel,tagname,start,obj,[text,obj,end,obj]) :
18 # Add tags to the parse given by label
19 # grouptag(tagname, parselabel) : Allow a tag to switch context
20 # - if not you can never turn a context off!
21 # 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 # 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 # 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 # --------------- 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 $self->_initdoc("doc",@_);
57 return $self;
58 }
59
60 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 }
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
110 my $file=$self->filetoparse();
111 if ( -f $file ) {
112 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 $self->error("Cannot parse \"$parselabel\" - file $file not known");
124 }
125 }
126
127 sub currentparsename {
128 my $self=shift;
129 @_?$self->{currentparsename}=shift
130 :(defined $self->{currentparsename}?$self->{currentparsename}:"");
131 }
132
133 sub currentparser {
134 my $self=shift;
135 return $self->{currentparser};
136 }
137
138
139 sub newparse {
140 my $self=shift;
141 my $parselabel=shift;
142
143 $self->{parsers}{$parselabel}=ActiveDoc::Parse->new();
144 }
145
146 sub addignoretags {
147 my $self=shift;
148 my $parselabel=shift;
149 $self->{parsers}{$parselabel}->addignoretags();
150 }
151
152 sub cleartags {
153 my $self=shift;
154 my $parselabel=shift;
155
156 $self->{parsers}{$parselabel}->cleartags();
157 }
158
159
160 sub includeparse {
161 my $self=shift;
162 my $parselabel=shift;
163 my $remoteparselabel=shift;
164 my $activedoc=shift;
165
166 # Some error trapping
167 if ( ! exists $self->{parsers}{$parselabel} ) {
168 $self->error("Unknown local parse name specified");
169 }
170 if ( ! exists $activedoc->{parsers}{$remoteparselabel} ) {
171 $self->error("Unknown parse name specified in remote obj $activedoc");
172 }
173
174 #
175 my $rp=$activedoc->{parsers}{$remoteparselabel};
176 $self->{parsers}{$parselabel}->includeparse($rp);
177 }
178
179 sub addtag {
180 my $self=shift;
181 my $parselabel=shift;
182 if ( ( $#_ != 6 ) && ( $#_ != 2) ) {
183 $self->error("Incorrect addtags specification\n".
184 "called with :\n@_ \n");
185 }
186 $self->{parsers}{$parselabel}->addtag(@_);
187 }
188
189 sub filetoparse {
190 my $self=shift;
191
192 if ( @_ ) {
193 $self->{filename}=shift;
194 }
195 return $self->{filename};
196 }
197 # --------- Group services
198 sub grouptag {
199 my $self=shift;
200 my $name=shift;
201 my $parselabel=shift;
202
203 $self->{parsers}{$parselabel}->contexttag($name);
204 }
205
206 sub opengroup {
207 my $self=shift;
208 my $name=shift;
209
210 if ( defined $self->currentparser ) {
211 $self->currentparser()->opencontext($name);
212 }
213 else {
214 $self->error("Cannot Call opengroup outside of a parse (".
215 caller().")");
216 }
217 }
218
219 sub closegroup {
220 my $self=shift;
221 my $name=shift;
222
223 if ( defined $self->currentparser ) {
224 $self->currentparser()->closecontext($name);
225 }
226 else {
227 $self->error("Cannot Call closegroup outside of a parse (".
228 caller().")");
229 }
230 }
231
232 sub allowgroup {
233 my $self=shift;
234 my $name=shift;
235 my $parselabel=shift;
236
237 $self->{parsers}{$parselabel}->includecontext($name);
238 }
239
240 sub disallowgroup {
241 my $self=shift;
242 my $name=shift;
243 my $parselabel=shift;
244
245 $self->{parsers}{$parselabel}->excludecontext($name);
246 }
247
248 # -------- Error Handling and Error services --------------
249
250 sub error {
251 my $self=shift;
252 my $string=shift;
253
254 die $string."\n";
255 }
256
257 sub parseerror {
258 my $self=shift;
259 my $string=shift;
260
261 if ( $self->currentparsename() eq "" ) {
262 $self->error("Error In file ".$self->filenameref."\n".$string);
263 }
264 else {
265 $line=$self->line();
266 print "Parse Error in ".$self->filenameref().", line ".
267 $line."\n";
268 print $string."\n";
269 exit;
270 }
271 }
272
273 sub checktag {
274 my $self=shift;
275 my $tagname=shift;
276 my $hashref=shift;
277 my $param=shift;
278
279 if ( ! exists $$hashref{$param} ) {
280 $self->parseerror("Incomplete Tag <$tagname> : $param required");
281 }
282 }
283
284 sub line {
285 my $self=shift;
286 return $self->{currentparser}->line();
287 }
288
289 sub tagstartline {
290 my $self=shift;
291 return $self->{currentparser}->tagstartline();
292 }
293
294 # -- tag routines
295 sub Doc_Start {
296 my $self=shift;
297 my $name=shift;
298 my $hashref=shift;
299
300 $self->checktag($name, $hashref, "type");
301 $self->checktag($name, $hashref, "version");
302
303 $self->{doctype}=$$hashref{'type'};
304 $self->{docversion}=$$hashref{'version'};
305 }