ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/ActiveDoc/SimpleDoc.pm
(Generate patch)

Comparing COMP/SCRAM/src/ActiveDoc/SimpleDoc.pm (file contents):
Revision 1.1 by williamc, Wed Apr 5 10:12:13 2000 UTC vs.
Revision 1.5 by sashby, Fri Dec 10 13:41:36 2004 UTC

# Line 5 | Line 5
5   #
6   # Description
7   # -----------
8 < # Simple multi parsing functionality
8 > # Simple multi parsing functionality and group manipulation
9   #
10   # Interface
11   # ---------
12 < # new()         : A new ActiveDoc object
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) :
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
# Line 24 | Line 27
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
# Line 41 | Line 53 | sub new {
53          my $class=shift;
54          $self={};
55          bless $self, $class;
56 <        $self->verbose("New SimpleDoc (".ref($self).") Created");
45 <        $self->init(@_);
56 >        $self->_initdoc("doc",@_);
57          return $self;
58   }
59  
60 < sub init {
61 <        # dummy to be overridden by inheriting class
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 {
# Line 68 | Line 106 | sub verbose {
106   sub parse {
107          my $self=shift;
108          $parselabel=shift;
71
109          my $file=$self->filetoparse();
110 <        if ( $file ) {
110 >        
111 >        if ( -f $file ) {
112            if ( exists $self->{parsers}{$parselabel} ) {
113              $self->verbose("Parsing $parselabel in file $file");
114              $self->{currentparsename}=$parselabel;
# Line 82 | Line 120 | sub parse {
120            }
121          }
122          else {
123 <          $self->error("Cannot parse $parselabel - file not known");
123 >          $self->error("Cannot parse \"$parselabel\" - file $file not known");
124          }
125   }
126  
127 + 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   sub currentparsename {
150          my $self=shift;
151          @_?$self->{currentparsename}=shift
# Line 103 | Line 163 | sub newparse {
163          my $parselabel=shift;
164  
165          $self->{parsers}{$parselabel}=ActiveDoc::Parse->new();
106 #       $self->{parsers}{$parselabel}->addgrouptags();
166   }
167  
168   sub addignoretags {
# Line 142 | Line 201 | sub includeparse {
201   sub addtag {
202          my $self=shift;
203          my $parselabel=shift;
204 <        if ( $#_ != 6 ) {
204 >        if ( ( $#_ != 6 ) && ( $#_ != 2) ) {
205                  $self->error("Incorrect addtags specification\n".
206                                  "called with :\n@_ \n");
207          }
# Line 157 | Line 216 | sub filetoparse {
216          }
217          return $self->{filename};
218   }
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 + }
269  
270   # -------- Error Handling and Error services --------------
271  
# Line 172 | Line 281 | sub parseerror {
281          my $string=shift;
282  
283          if ( $self->currentparsename() eq "" ) {
284 <                $self->error($string);
284 >                $self->error("Error In file ".$self->filenameref."\n".$string);
285          }
286          else {
287           $line=$self->line();
288 <         print "Parse Error in ".$self->filetoparse().", line ".
288 >         print "Parse Error in ".$self->filenameref().", line ".
289                                          $line."\n";
290           print $string."\n";
291           exit;
# Line 204 | Line 313 | sub tagstartline {
313          return $self->{currentparser}->tagstartline();
314   }
315  
316 + # -- 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 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines