This version of the patch fixes a problem with additional arguments to 
the PROCESS directive.  Still looking for feedback.

-myk

diff -Naur Template-Toolkit-2.06d/lib/Template/Context.pm 
Template-Toolkit-2.06d-flush/lib/Template/Context.pm
--- Template-Toolkit-2.06d/lib/Template/Context.pm      Tue Jan 22 19:09:32 2002
+++ Template-Toolkit-2.06d-flush/lib/Template/Context.pm        Thu Mar  7 18:41:30 
+2002
@@ -258,7 +258,7 @@
 #------------------------------------------------------------------------
 
 sub process {
-    my ($self, $template, $params) = @_;
+    my ($self, $template, $outstream, $params) = @_;
     my ($trim, $blocks) = @$self{ qw( TRIM BLOCKS ) };
     my (@compiled, $name, $compiled);
     my ($stash, $tblocks, $error, $tmpout);
@@ -267,6 +267,9 @@
 #    my ($blocks, $output);
 #    my $name = $template;
 
+    $self->{ OUTSTREAM } = $outstream
+       if UNIVERSAL::isa($template, 'Template::Document');
+    
     $template = [ $template ] unless ref $template eq 'ARRAY';
 
     # fetch compiled template for each name specified
@@ -679,6 +682,18 @@
 }
 
 
+#------------------------------------------------------------------------
+# output()
+#
+# Outputs generated content to the output stream.
+#------------------------------------------------------------------------
+
+sub output {
+    my ($self, $output) = @_;
+    return Template::output($self->{ OUTSTREAM }, $output);
+}
+
+
 #------------------------------------------------------------------------
 # AUTOLOAD
 #
diff -Naur Template-Toolkit-2.06d/lib/Template/Directive.pm 
Template-Toolkit-2.06d-flush/lib/Template/Directive.pm
--- Template-Toolkit-2.06d/lib/Template/Directive.pm    Tue Nov 20 12:29:28 2001
+++ Template-Toolkit-2.06d-flush/lib/Template/Directive.pm      Thu Mar  7 18:43:13 
+2002
@@ -339,6 +339,7 @@
     my ($file, $args) = @$nameargs;
     my $hash = shift @$args;
     $file = $class->filenames($file);
+    $file .= ', $context->{ OUTSTREAM }';
     $file .= @$hash ? ', { ' . join(', ', @$hash) . ' }' : '';
     return "$OUTPUT \$context->process($file);"; 
 }
@@ -694,6 +695,16 @@
 }
 
 #------------------------------------------------------------------------
+# flush()                                                     [% FLUSH %]
+#
+# NOTE: this is redundant, being hard-coded (for now) into Parser.yp
+#------------------------------------------------------------------------
+
+sub flush {
+    return "\$context->output(\$output); \$output = '';";
+}
+
+#------------------------------------------------------------------------
 # break()                                                     [% BREAK %]
 #
 # NOTE: this is redundant, being hard-coded (for now) into Parser.yp
diff -Naur Template-Toolkit-2.06d/lib/Template/Service.pm 
Template-Toolkit-2.06d-flush/lib/Template/Service.pm
--- Template-Toolkit-2.06d/lib/Template/Service.pm      Tue Jan 22 19:09:32 2002
+++ Template-Toolkit-2.06d-flush/lib/Template/Service.pm        Thu Mar  7 18:41:30 
+2002
@@ -54,7 +54,7 @@
 #------------------------------------------------------------------------
 
 sub process {
-    my ($self, $template, $params) = @_;
+    my ($self, $template, $outstream, $params) = @_;
     my $context = $self->{ CONTEXT };
     my ($name, $output, $procout, $error);
     $output = '';
@@ -79,7 +79,7 @@
        # PRE_PROCESS
        eval {
            foreach $name (@{ $self->{ PRE_PROCESS } }) {
-               $output .= $context->process($name);
+               $output .= $context->process($name, $outstream);
            }
        };
        last SERVICE if ($error = $@);
@@ -87,7 +87,7 @@
        # PROCESS
        eval {
            foreach $name (@{ $self->{ PROCESS } || [ $template ] }) {
-               $procout .= $context->process($name);
+               $procout .= $context->process($name, $outstream);
            }
        };
        if ($error = $@) {
@@ -99,7 +99,7 @@
        # POST_PROCESS
        eval {
            foreach $name (@{ $self->{ POST_PROCESS } }) {
-               $output .= $context->process($name);
+               $output .= $context->process($name, $outstream);
            }
        };
        last SERVICE if ($error = $@);
diff -Naur Template-Toolkit-2.06d/lib/Template.pm 
Template-Toolkit-2.06d-flush/lib/Template.pm
--- Template-Toolkit-2.06d/lib/Template.pm      Tue Jan 22 19:09:32 2002
+++ Template-Toolkit-2.06d-flush/lib/Template.pm        Thu Mar  7 18:41:30 2002
@@ -47,29 +47,25 @@
 #------------------------------------------------------------------------
 # process($input, \%replace, $output)
 #
-# Main entry point for the Template Toolkit.  The Template module 
+# Main entry point for the Template Toolkit.  The Template module
 # delegates most of the processing effort to the underlying SERVICE
-# object, an instance of the Template::Service class.  
+# object, an instance of the Template::Service class.
 #------------------------------------------------------------------------
 
 sub process {
     my ($self, $template, $vars, $outstream) = @_;
     my ($output, $error);
 
-    $output = $self->{ SERVICE }->process($template, $vars);
-    
-    if (defined $output) {
-       $outstream ||= $self->{ OUTPUT };
-       unless (ref $outstream) {
-           my $outpath = $self->{ OUTPUT_PATH };
-           $outstream = "$outpath/$outstream" if $outpath;
-       }       
+    $outstream ||= $self->{ OUTPUT };
+    unless (ref $outstream) {
+       my $outpath = $self->{ OUTPUT_PATH };
+       $outstream = "$outpath/$outstream" if $outpath;
+    }
 
-       # send processed template to output stream, checking for error
-       return ($self->error($error))
-           if ($error = &_output($outstream, $output));
+    $output = $self->{ SERVICE }->process($template, $outstream, $vars);
 
-       return 1;
+    if (defined $output) {
+       return &output($outstream, $output);
     }
     else {
        return $self->error($self->{ SERVICE }->error);
@@ -77,6 +73,26 @@
 }
 
 
+#------------------------------------------------------------------------
+# output()
+#
+# Outputs generated content to the output stream.
+#------------------------------------------------------------------------
+
+sub output {
+    my ($outstream, $output) = @_;
+    my ($error);
+
+    if (defined $output) {
+       # send processed template to output stream, checking for error
+       return (Template::Base::error($error))
+           if ($error = &_output($outstream, $output));
+    }
+
+    return 1;
+}
+
+
 #------------------------------------------------------------------------
 # service()
 #
diff -Naur Template-Toolkit-2.06d/parser/Grammar.pm.skel 
Template-Toolkit-2.06d-flush/parser/Grammar.pm.skel
--- Template-Toolkit-2.06d/parser/Grammar.pm.skel       Thu Nov 29 17:44:36 2001
+++ Template-Toolkit-2.06d-flush/parser/Grammar.pm.skel Thu Mar  7 18:41:30 2002
@@ -52,7 +52,7 @@
        GET CALL SET DEFAULT INSERT INCLUDE PROCESS WRAPPER BLOCK END
        USE PLUGIN FILTER MACRO PERL RAWPERL TO STEP AND OR NOT DIV MOD
        IF UNLESS ELSE ELSIF FOR NEXT WHILE SWITCH CASE META
-       TRY THROW CATCH FINAL LAST RETURN STOP CLEAR VIEW
+       TRY THROW CATCH FINAL LAST RETURN STOP CLEAR VIEW FLUSH
     );
 
 # for historical reasons, != and == are converted to ne and eq to perform 
diff -Naur Template-Toolkit-2.06d/parser/Parser.yp 
Template-Toolkit-2.06d-flush/parser/Parser.yp
--- Template-Toolkit-2.06d/parser/Parser.yp     Thu Nov 29 17:44:36 2001
+++ Template-Toolkit-2.06d-flush/parser/Parser.yp       Thu Mar  7 18:41:30 2002
@@ -120,6 +120,7 @@
        |   RETURN                  { $factory->return()                  }
        |   STOP                    { $factory->stop()                    }
        |   CLEAR                   { "\$output = '';";                   }
+       |   FLUSH                   { "\$context->output(\$output); \$output = '';"; }
        |   LAST                    { $_[0]->{ INFOR } || $_[0]->{ INWHILE }
                                         ? 'last LOOP;'
                                         : 'last;'                         }

Reply via email to