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

Comparing COMP/SCRAM/src/ActiveDoc/Switcher.pm (file contents):
Revision 1.6 by williamc, Tue Nov 9 11:24:54 1999 UTC vs.
Revision 1.14 by williamc, Fri Apr 7 13:39:46 2000 UTC

# Line 12 | Line 12
12   #                                    to the desired routines
13   # usegroupchecker(groupchecker)    : Set a groupchecker
14   # parse()                          : Parse the file                            
15 # checkparam($name,$par)    : Exit with an error message if parameter
16 #                             is undefined in tag $name
15   # line()                    : return the current line number of the parse
16 + # tagstartline()            : return the line number on which the current
17 + #                             tag was opened
18   # stream(filehandle)        : stream output to the filehandle if not handled
19   #                               in any other way
20   package ActiveDoc::Switcher;
# Line 40 | Line 40 | sub stream {
40          $self->{stream}=shift;
41   }
42  
43 + sub streamexclude {
44 +        my $self=shift;
45 +        my $tag=shift;
46 +
47 +        $tag=~tr/A-Z/a-z/;
48 +        $self->{streamexclude}{$tag}=1;
49 + }
50 +
51   sub _initialise (hash1) {
52          my $self=shift;
53          $self->{filename}=shift;
# Line 76 | Line 84 | sub parse {
84          $self->{linecount}=0;
85          $self->_resetvars();
86          $self->{streamstore}="";
87 +        $self->{streamtmp}="";
88  
89          # Open the file
90          use FileHandle;
# Line 96 | Line 105 | sub parse {
105           } # end char while
106          } # End String while loop
107          undef $filehandle;
108 <        $self->_printstream();
109 < }
110 <
111 < sub checkparam($name, $key) {
103 <        my $self=shift;
104 <        my $name=shift;
105 <        my $key=shift;
106 <
107 <        if ( ! defined $self->{tagvar}{$key} ) {
108 <           print "Switcher: Badly formed $name tag -".
109 <                        " undefined $key parameter\n";
110 <           exit 1;
111 <        }
108 >        # make sure we close the last buffer
109 >        $self->_calltag($self->{textcontext}, $self->{textcontext},
110 >                                                        $self->_getstore());
111 >        #$self->_printstream();
112   }
113  
114   #
# Line 118 | Line 118 | sub line {
118          my $self=shift;
119          return $self->{linecount};
120   }
121 +
122 + # return the line the current tag was opened
123 + sub tagstartline {
124 +        my $self=shift;
125 +        $self->{tagstart};
126 + }
127   # --------------- Utility routines ----------------------------
128  
129   #
# Line 165 | Line 171 | sub _nextchar() {
171          my $self=shift;
172          my $char;
173          $char=substr($self->{currentline},$self->{stringpos}++,1);
174 < #       print "Debug : Fetching character $char\n";
174 >        #print "Debug : Fetching character $char\n";
175  
176          # Keep a record for any stream processes
177          $self->{streamstore}=$self->{streamstore}.$char;
# Line 177 | Line 183 | sub _opentag {
183          my $self=shift;
184          my $char;
185  
186 +        # Keep a record of where the tag started
187 +        $self->{tagstart}=$self->line();
188 +
189          # Close the last text segment
190 +        $self->{streamtmp}=$self->_popstream();
191          $self->_calltag($self->{textcontext}, $self->{textcontext},
192                                                          $self->_getstore());
193          $self->_resetstore();
194          $self->_resetlabels();
195  
186        $self->{scramtmp}=$self->_popstream();
196          # Do we have an opening or closing tag?
197          if ( ($char=$self->_nextchar()) eq "/" ) { #we have a closing tag
198            $self->{tagcontext}="endtag";
# Line 206 | Line 215 | sub _closetag {
215          $self->_closelabel();
216          
217          # -- Call the associated tag function if appropriate
218 <        $tagroutine=$self->{tagname}."_".$self->{tagcontext};
219 <        $self->_calltag($tagroutine, $self->{tagname},
218 >        if ( defined $self->{tagname} ) {
219 >         $tagroutine=$self->{tagname}."_".$self->{tagcontext};
220 >         $self->_calltag($tagroutine, $self->{tagname},
221                                                          $self->{tagvar});
222 <        #print "\nDebug : Closing Tag $tagroutine\n";
222 >         #print "\nDebug : Closing Tag $tagroutine\n";
223  
224 <        # -- Now make sure the text context is set for calling routines to
225 <        # -- deal with text portions outside of tags
226 <        if ( $self->{tagcontext} eq "starttag" ) {
224 >         # -- Now make sure the text context is set for calling routines to
225 >         # -- deal with text portions outside of tags
226 >         if ( $self->{tagcontext} eq "starttag" ) {
227            push @{$self->{textstack}} , $self->{textcontext};
228            $self->{textcontext}=$self->{tagname};
229 <        }
230 <        else {
229 >         }
230 >         else {
231            if ( $#{$self->{textstack}} > -1 ) {
232              if ( $self->{textcontext} eq $self->{tagname} ) {  
233                 $self->{textcontext}=pop @{$self->{textstack}};
# Line 232 | Line 242 | sub _closetag {
242               print "Warning : Unmatched </...> tag on line ".
243                                          $self->line()."\n";    
244            }
245 +         }
246          }
247          # Reset context back to text
248          $self->{tagcontext}="text";
# Line 246 | Line 257 | sub _calltag {
257  
258          if ( $self->{groupchecker}->status() ||
259                  ( $self->{tagcontainer}->inquiregroup($tagroutine)) ) {
260 <          $rt=$self->{tagcontainer}->getroutine($tagroutine);
260 >          ($rt,$obj)=$self->{tagcontainer}->getroutine($tagroutine);
261            if ( $rt ne "" ) {
262 +             if ( ! defined $obj ) {
263                 &{$rt}( $self->{allw},@_);
264 <               $found=1;
264 >             }
265 >             else {
266 >               &{$rt}( $obj,@_);
267 >             }
268 >             $found=1;
269            }
270          }
271          
272 <        if ( ! $found ) {
272 >        # stream function
273 >        if ( ! exists $self->{streamexclude}{$tagroutine} ) {
274              $self->_printstream();
275          }
276          $self->_clearstream();
# Line 353 | Line 370 | sub _labeltest {
370   sub _resetlabels {
371          my $self=shift;
372          undef $self->{tagvar};
373 +        undef $self->{tagname};
374   }
375  
376   sub _closelabel {
# Line 364 | Line 382 | sub _closelabel {
382           $self->{lastlabel}="";
383          }
384          elsif ( $self->_getstore() ne "") {
385 <         #Then it must be the tag name
386 <         ($self->{tagname}=$self->_getstore())=~tr/A-Z/a-z/;
385 >         # Then it must be the tag name
386 >         if ( ! defined $self->{tagname} ) {
387 >            ($self->{tagname}=$self->_getstore())=~tr/A-Z/a-z/;
388 >         }
389 >         else {
390 >            die ">Tag syntax error in $self->{tagname} on line ".
391 >                $self->line()." of file \n$self->{filename}";
392 >         }
393          }
394          $self->_resetstore();
395   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines