eamondaly wrote:
> 
> This is going to be a long post, so please bear with me.
> 
> I'm implementing a new site in Apache::ASP. I'd like to develop a
> framework similar to our existing mod_perl setup. The way we
> currently create a page is like so:
> 
> - Templater creates template.html
>   - Contains several tokens like __TITLE__, __HEADER__, __BODY__,
>     __LEFT_COLUMN__
>   - Some default variables are set: $var{'LEFT_COLUMN'},
>     $var{'FOOTER'}, etc.
>   - Also contains some perl logic
> 

If you want some standard templatting system other than
ASP style <%= $vars{TITLE} %>, then why not use another
templatting framework like Template Toolkit or Embperl ?
I would not invent yet another templatting language
when there are so many to choose from.  Please see:

  http://www.perl.com/pub/a/2001/08/21/templating.html

for templatting comparisons.

If you want to create an XMLSubs templatting system, you
can do that within Apache::ASP like

 <var name='TITLE' />

If you REALLY want to do __TITLE__, you could do this in
global.asa...

use vars qw(%vars);
sub Script_OnStart {
   %vars = (); # init per request
}

sub Script_OnFlush {
   my $data = $Response->{BinaryRef};
   $$data =~ s/__(\w+)__/$vars{$1}/isge;
}

> - Developer creates foo.html
>   - Sets $var{'TEMPLATE'} to template.html
>   - foo.html (optionally) contains variables like $var{'TITLE'},
>     $var{'HEADER'}, and $var{'LEFT_COLUMN'}. These append to or
>     override those set in the template
>   - Everything else in foo.html is treated as $var{'BODY'}
>   - Also contains perl logic
> 

I am not sure where you are going with $var{BODY}, but you might
be more interested in using mod_perl handlers with a templatting 
system instead like Template Toolkit or HTML::Template.

> When a request comes in for foo.html, our perl module scans it for
> the template name, reads in and executes everything in template.html,
> executes everything in foo.html, substitutes all tokens with their
> values (__TOKEN__ with $var{'TOKEN'}), and spits out the result. Can
> I mimic this behavior in Apache::ASP?
> 

Script_OnFlush handler can be used for doing any post processing
of output your heart desires.  But weight carefully the difference
between can & should in this regards.

> I've been trying things along the lines of (in foo.html):
> 
>   <my:template href="/templates/simple.inc">
>   WHEE! <% print scalar localtime %>
>   </my:template>
> 
> and then, in global.asa:
> 
>   sub my::template {
>     my($args, $html) = @_;
>     my $template = $Server->MapPath($args->{'href'});
>     my $template_ref = $Response->TrapInclude($template);
>     $$template_ref =~ s/__BODY__/$html/;
>     $main::Response->Write($$template_ref);
>   }
> 
> which works, but obviously only gets me halfway there. Can I declare
> variables like %var in foo.html that are accessible to the routine
> my::template? I can't set these as globals, because they're not.
> 

This is a pretty good use of XMLSubs to create your own
mini template system.  If $template is just an HTML template
and you don't want HTML developers adding ASP bits, then you
might just read in the file directly with 

if(-e $file) { 
  open(FILE, $file) || die("can't open file: $!");
  my $data = join('', <FILE>);
  close FILE;
}

This way your templates are safe from ASP code blocks,
and gives you greater control of the template system.
In order to allow XMLSubs tags use, but not ASP code
blocks, I have considered configs or params to 
the Include() calls like CodeBlocks => 0 as in

  PerlSetVar CodeBlocks 0

or 

  $Response->Include({ File => 1, CodeBlocks => 0 }, @args);

which could still allow for XMLSubs while disabling <% %>
in a script/template.  One of the complaints of ASP is 
that is allows too much to be put into templates, and while
I see the above would be nice to have, no one has yet NEEDED
it, thus is has never been done.

> I really don't want our developers coding pages like:
> 
>   <!--#include file="everything_up_to_the_title.inc">
>   This is my title!
>   <!--#include file="everything_from_title_to_left_column.inc">
>   This is my left column
>   <!--#include file="everything_from_left_column_to_header.inc">
>   ...

I agree, this is not so good these days, but Apache::ASP supports
it for SSI backwards compatibility.

> I'm open to any and all suggestions!

I have long wanted to build support for easier variables substitution
where one could do this:

  PerlSetVar QuickVars 1

sub Script_OnStart { 
   $Vars->{DATA} = 1;
}

Then in the ASP script, PHP quick variables would be supported like:

<% for(1..10) { %>
  $DATA
<% } %>

$DATA would be pulled from $Vars->{DATA} automatically at runtime.
I think this would be a worthwhile extension to Apache::ASP since
<%= $Vars->{DATA} %> type templates can be unwieldy for HTML developers.

I would adopt a standard of $\w+ for regexp matching for QuickVars
since this is the kind of thing supported in PHP & is therefore
a widely used practice.  As a PerlSetVar QuickVars 1 config, this would
have the added benefit of not affecting those Apache::ASP users until
they explicitly want this feature.

--Josh
_________________________________________________________________
Joshua Chamas                           Chamas Enterprises Inc.
NodeWorks Founder                       Huntington Beach, CA  USA 
http://www.nodeworks.com                1-714-625-4051

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to