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

Comparing COMP/SCRAM/src/ActiveDoc/ActiveDoc.pm (file contents):
Revision 1.6 by williamc, Fri Nov 19 15:27:46 1999 UTC vs.
Revision 1.17 by williamc, Thu Jan 20 18:47:41 2000 UTC

# Line 7 | Line 7
7   #
8   # Interface
9   # ---------
10 < # new()         : A new ActiveDoc object
10 > # new(ActiveConfig[,options])           : A new ActiveDoc object
11   # url()         : Return/set the docs url - essential
12   # file()        : Return the local filename of document
13   #
# Line 15 | Line 15
15   # newparse(parselabel) : Create a new parse type
16   # addtag(parselabel,tagname,start,obj,text,obj,end,obj)
17   #                               : Add tags to the parse given by label
18 + # checktag(tagname, hashref, param) : check for existence of param in
19 + #                                       hashref from a tag call
20 + # includeparse(local_parsename, objparsename, activedoc) : copy the parse from
21 + #                                                       one object to another
22 + # currentparsename([name]) : get/set current parse name
23   # newdoc(file)  : Return an new object of the appropriate type
24   # getfile(url)  : get a processedfile object given a url
25 + # activatedoc(url) : Return the object ref for a doc described by the given url
26 + #                    -- any parse called "init" will also be run
27   # config([ActiveConfig]) : Set up/return Configuration for the document
28   # basequery([ActiveConfig]) : Set up/return UserQuery for the doc
29   # copydocconfig(ActiveDoc) : Copy the basic configuration from the ActiveDoc
30   # copydocquery(ActiveDoc) : Copy the basicquery from the ActiveDoc
31 + # userinterface()       : Return the defaullt userinterface
32 + # option(var)           : return the value of the option var
33 + # requestoption("message") : Ask the user to supply a value for an option
34 + #                            if it dosnt already exist
35   #
36   # -- error methods --
37   # error(string)       : Report an general error to the user
# Line 33 | Line 44 | require 5.004;
44   use ActiveDoc::Parse;
45   use ActiveDoc::ActiveConfig;
46   use ActiveDoc::PreProcessedFile;
47 < use ObjectUtilities::ObjectBase;
47 > use ObjectUtilities::StorableObject;
48   use URL::URLhandler;
49  
50 < @ISA = qw(ObjectUtilities::ObjectBase);
50 > @ISA = qw(ObjectUtilities::StorableObject);
51  
52   sub new {
53          my $class=shift;
54          $self={};
55          bless $self, $class;
56          $self->config(shift);
57 <        
57 >
58 >        # have some override options been passed
59 >        if ( @_ ) {
60 >           $self->basequery(shift);
61 >        }
62 >        else {
63 >           # --- is there a starter document?
64 >           my $basedoc=$self->config()->basedoc();
65 >           if ( defined $basedoc ) {
66 >             $self->copydocquery($basedoc);
67 >           }
68 >           else {
69 >             $self->error("Error : No base doc found");
70 >           }
71 >        }
72 >        $self->_init2();
73 > }
74 >
75 > sub _init2 {
76 >
77 >        my $self=shift;
78          # A URL handler per document
79          $self->{urlhandler}=URL::URLhandler->new($self->config()->cache());
80  
81 +        # A default UserInterface
82 +        $self->{userinterface}=ActiveDoc::SimpleUserInterface->new();
83          $self->init(@_);
84          return $self;
85 +
86   }
87  
88   # ----- parse related routines --------------
# Line 57 | Line 91 | sub parse {
91          $parselabel=shift;
92  
93          my $file=$self->file();
60        print "Parse called on file $file\n";
94          if ( $file ) {
95 <          $self->{parsers}{$parselabel}->parse($file,@_);
95 >          if ( exists $self->{parsers}{$parselabel} ) {
96 >            $self->{currentparsename}=$parselabel;
97 >            $self->{currentparser}=$self->{parsers}{$parselabel};
98 >            $self->{parsers}{$parselabel}->parse($file,@_);
99 >            delete $self->{currentparser};
100 >            $self->{currentparsename}="";
101 >          }
102          }
103          else {
104            print "Cannot parse - file not known\n";
105          }
106   }
107  
108 + sub currentparsename {
109 +        my $self=shift;
110 +        @_?$self->{currentparsename}=shift
111 +          :$self->{currentparsename};
112 + }
113 +
114   sub newparse {
115          my $self=shift;
116          my $parselabel=shift;
# Line 75 | Line 120 | sub newparse {
120          $self->{parsers}{$parselabel}->addgrouptags();
121   }
122  
123 + sub cleartags {
124 +        my $self=shift;
125 +        my $parselabel=shift;
126 +
127 +        $self->{parsers}{$parselabel}->cleartags();
128 + }
129 +
130 +
131 + sub includeparse {
132 +        my $self=shift;
133 +        my $parselabel=shift;
134 +        my $remoteparselabel=shift;
135 +        my $activedoc=shift;
136 +
137 +        # Some error trapping
138 +        if ( ! exists $self->{parsers}{$parselabel} ) {
139 +          $self->error("Unknown local parse name specified");
140 +        }
141 +        if ( ! exists $activedoc->{parsers}{$remoteparselabel} ) {
142 +          $self->error("Unknown parse name specified in remote obj $activedoc");
143 +        }
144 +
145 +        #
146 +        my $rp=$activedoc->{parsers}{$remoteparselabel};
147 +        $self->{parsers}{$parselabel}->includeparse($rp);
148 + }
149 +
150   sub addtag {
151          my $self=shift;
152          my $parselabel=shift;
# Line 96 | Line 168 | sub addurltags {
168  
169   sub url {
170          my $self=shift;
171 <        @_ ?$self->{File}=$self->getfile(shift)
172 <            : $self->{File};
171 >        # get file & preprocess
172 >        if ( @_  ) {$self->{File}=$self->getfile(shift)}
173 >        $self->{File}->url();
174   }
175  
176   sub copydocconfig {
# Line 112 | Line 185 | sub copydocquery {
185          my $self=shift;
186          my $ActiveDoc=shift;
187  
188 <         $self->basequery($ActiveDoc->basequery());
188 >        $self->basequery($ActiveDoc->basequery());
189   }
190  
191   sub config {
# Line 123 | Line 196 | sub config {
196  
197   sub basequery {
198          my $self=shift;
199 <        @_ ? $self->{UserQuery}=shift
200 <           : $self->{UserQuery};
199 >        @_ ? $self->{Query}=shift
200 >           : $self->{Query};
201 > }
202 >
203 > sub option {
204 >        my $self=shift;
205 >        my $param=shift;
206 >        if ( defined $self->basequery()) {
207 >                return $self->basequery()->getparam($param);
208 >        }
209 >        else {
210 >                return $undef;
211 >        }
212 > }
213 >
214 > sub requestoption {
215 >        my $self=shift;
216 >        my $param=shift;
217 >        my $string=shift;
218 >
219 >        my $par=undef;
220 >        if ( defined $self->basequery()) {
221 >        $par=$self->basequery()->getparam($param);
222 >        while ( ! defined $par ) {
223 >          $self->basequery()->querytype( $param, "basic");
224 >          $self->basequery()->querymessage( $param, $string);
225 >          $self->userinterface()->askuser($self->basequery());
226 >          $par=$self->basequery()->getparam($param);
227 >        }
228 >        }
229 >        return $par;
230   }
231  
232   sub getfile() {
# Line 132 | Line 234 | sub getfile() {
234          my $origurl=shift;
235  
236          my $fileref;
135        print "GETFILE called\n";
237          my ($url, $file)=$self->{urlhandler}->get($origurl);
238          # do we already have an appropriate object?
239 <        #my ($fileref)=$self->config()->find("__preprocessed",$url);
240 <        undef $fileref;
239 >        ($fileref)=$self->config()->find($url);
240 >        #undef $fileref;
241          if (  defined $fileref ) {
242           print "found $url in database ----\n";
243           $fileref->update();
# Line 150 | Line 251 | sub getfile() {
251           $fileref=ActiveDoc::PreProcessedFile->new($self->config());
252           $fileref->url($url);
253           $fileref->update();
153         $self->config()->store($fileref,"__preprocessed",$url);
254          }
155        print "---------- returning".$fileref."\n";
255          return $fileref;
256   }
257  
258 + sub activatedoc {
259 +        my $self=shift;
260 +        my $url=shift;
261 +
262 +        # first get a preprocessed copy of the file
263 + #       my $fileob=$self->getfile($url);
264 +
265 +        # now parse it for the <DocType> tag
266 +        my $tempdoc=ActiveDoc::ActiveDoc->new($self->config());
267 +        $tempdoc->{urlhandler}=$self->{urlhandler};
268 +        my $fullurl=$tempdoc->url($url);
269 +        $url=$fullurl;
270 +        $tempdoc->{doctypefound}=0;
271 +        $tempdoc->newparse("doctype");
272 +        $tempdoc->addtag("doctype","Doc", \&Doc_Start, $tempdoc,
273 +                                          "", $tempdoc, "", $tempdoc);
274 +        $tempdoc->parse("doctype");
275 +
276 +        if ( ! defined $tempdoc->{docobject} ) {
277 +          print "No <Doc type=> Specified in ".$url."\n";
278 +          exit 1;
279 +        }
280 +        # Set up a new object of the specified type
281 +        eval "require $tempdoc->{docobject}";
282 +        die $@ if $@;
283 +        my $newobj=$tempdoc->{docobject}->new($self->config());
284 +        undef $tempdoc;
285 +        $newobj->url($url);
286 +        $newobj->_initparse();
287 +        return $newobj;
288 + }
289 +
290 + sub _initparse {
291 +        my $self=shift;
292 +
293 +        $self->parse("init");
294 + }
295   # -------- Error Handling and Error services --------------
296  
297   sub error {
# Line 188 | Line 324 | sub checktag {
324   }
325  
326   sub line {
327 <        $self=shift;
327 >        my $self=shift;
328 >
329          my ($line, $fileobj)=
330 <                $self->{Processedfile}->line($self->{switch}->line());
330 >                $self->{File}->realline($self->{currentparser}->line());
331          return ($line, $fileobj);
332   }
333  
334 + sub tagstartline {
335 +        my $self=shift;
336 +        my ($line, $fileobj)=$self->{File}->line(
337 +                $self->{currentparser}->tagstartline());
338 +        return ($line, $fileobj);
339 + }
340 +
341   sub file {
342          my $self=shift;
343  
344 <        $self->{PPf}->file();
344 >        $self->{File}->file();
345   }
346  
347   # --------------- Initialisation Methods ---------------------------
348  
205 sub preprocess_init {
206        my $self=shift;
207        $self->{PPfile}=PreProcessedFile->new($self->config());
208 }
209
349   sub init {
350          # Dummy Routine - override for derived classes
351   }
# Line 227 | Line 366 | sub Base_start {
366          push @{$self->{basestack}}, $$hashref{"type"};
367          # Set the base
368          $self->{urlhandler}->setbase($$hashref{"type"},$hashref);
230
369   }
370  
371   sub Base_end {
# Line 245 | Line 383 | sub Base_end {
383            $self->{urlhandler}->unsetbase($type);
384          }
385   }
386 +
387 + sub Doc_Start {
388 +        my $self=shift;
389 +        my $name=shift;
390 +        my $hashref=shift;
391 +        
392 +        $self->checktag($name, $hashref, "type");
393 +        $self->{doctypefound}++;
394 +        if ( $self->{doctypefound} == 1 ) { # only take first doctype
395 +           $self->{docobject}=$$hashref{'type'};
396 +        }
397 + }
398 +
399 + sub userinterface {
400 +        my $self=shift;
401 +        @_?$self->{userinterface}=shift
402 +          :$self->{userinterface}
403 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines