Thread: [htmltmpl] (no subject)
Brought to you by:
samtregar
From: Glenn M. <Glenn@MorganConsulting.fsnet.co.uk> - 2002-06-28 05:47:17
|
Hi Had a search through the archive but can't find what I'm looking for, so here goes. I am using HTML::Template with PageKit and having a problem with <tmpl_var> substitutions in javascript quoted strings. See below: <button onclick="javascript: js_str='<tmpl_var name="tmpl_str">;"></button> If tmpl_str="It's a wonderful life" Then my resultant html is <button onclick="javascript: js_str='It's a wonderful life'";></button> This is obviously broken due to the unescaped single quote in It's. The same would apply if the js string assignment was enclosed in double quotes and I included doulble quotes in my tmp_str value. What I really need to do is: tmpl_str=It\'s a wonderful life and all would be well. Unfortunately, 1) I am working with db data and am not aware of what chars data values contain. 2) I am using the same data values in different places within the same template and do not want escaped quotes in all cases. These two cases make it very messy to filter my datasets and escape here, there and everywhere. Any ideas? Is there a simple solution or would a escape=quotes patch be the way to go? Thanks in advance Glenn |
From: Glenn M. <Glenn@MorganConsulting.fsnet.co.uk> - 2002-06-28 05:00:01
|
Hi Had a search through the archive but can't find what I'm looking for, so here goes. I am using HTML::Template with PageKit and having a problem with <tmpl_var> substitutions in javascript quoted strings. See below: <button onclick="javascript: js_str='<tmpl_var name="tmpl_str">;"></button> If tmpl_str="It's a wonderful life" Then my resultant html is <button onclick="javascript: js_str='It's a wonderful life'";></button> This is obviously broken due to the unescaped single quote in It's. The same would apply if the js string assignment was enclosed in double quotes and I included doulble quotes in my tmp_str value. What I really need to do is: tmpl_str=It\'s a wonderful life and all would be well. Unfortunately, 1) I am working with db data and am not aware of what chars data values contain. 2) I am using the same data values in different places within the same template and do not want escaped quotes in all cases. These two cases make it very messy to filter my datasets and escape here, there and everywhere. Any ideas? Is there a simple solution or would a escape=quotes patch be the way to go? Thanks in advance Glenn |
From: Zachary B. <zbu...@ho...> - 2002-07-07 04:21:57
|
Does anyone have any pointers on the best way to utilize HTML::Template = and a mail merge module? I finished my initial project http://www.securitysaint.com using = HTML::Template and CGI::Application but I want to build onto it by = sending weekly status emails to the users giving them stats for their = websites in a nice HTML table. You can see an example of what I am = trying to do here: http://www.securitysaint.com/stats_example.html I already wrote the SQL queries I want to run and have pseudo code for = the application but the actual part of sending a HTML message is what I = am focusing on now. I would like to be able to build a template just like I do for the = website, then have a perl script read the template, fill in the data and = send it off.=20 Has anyone used HTML::Template with a mail merge app? Can you provide = any pointers? Thanks zack |
From: Philip S T. <phi...@gm...> - 2002-07-07 07:16:24
|
Sometime on Jul 6, Zachary Buckholz assembled some asciibets to say: > Does anyone have any pointers on the best way to utilize > HTML::Template and a mail merge module? Well, I do this to send out birthday wishes to everyone in my department, with Cc's to everyone else: bday.tmpl: From: <dept_address> To: <tmpl_loop birthday_kids><tmpl_var address><tmpl_unless __LAST__>, </tmpl_unless></tmpl_loop> Bcc: <tmpl_loop all_kids><tmpl_var address><tmpl_unless __LAST__>, </tmpl_unless></tmpl_loop> Subject: Happy birthday <tmpl_loop birthday_kids><tmpl_var name><tmpl_unless __LAST__>, </tmpl_unless></tmpl_loop> Body of the message here.... bday.pl: #!/usr/bin/perl -w use strict; use HTML::Template; my $t = new HTML::Template(filename=>'bday.tmpl', loop_context_vars=>1); # set vars here open MAIL, "|/usr/sbin/sendmail -t" or die "$!"; print MAIL $t->output(); close MAIL or warn "$!"; __END__ Don't forget the tabs on the line after To and Bcc or sendmail will think that it's the end of that particular header line. Philip -- Michael: Hi. I'm Michael Jackson, from The Jacksons. Homer: I'm Homer Simpson, from the Simpsons. Stark Raving Dad |
From: Andrew J. <an...@li...> - 2002-07-07 09:32:40
|
Zachary Buckholz wrote: > Does anyone have any pointers on the best way to utilize HTML::Template > and a mail merge module? > > I finished my initial project http://www.securitysaint.com using > HTML::Template and CGI::Application but I want to build onto it by > sending weekly status emails to the users giving them stats for their > websites in a nice HTML table. You can see an example of what I am > trying to do here: http://www.securitysaint.com/stats_example.html > > I already wrote the SQL queries I want to run and have pseudo code for > the application but the actual part of sending a HTML message is what I > am focusing on now. > > I would like to be able to build a template just like I do for the > website, then have a perl script read the template, fill in the data and > send it off. > > Has anyone used HTML::Template with a mail merge app? Can you provide > any pointers? > I did this with MIME::Lite a while back. Filling in a text file or HTML page without images was easy, but HTML w/images was a bit tricky. But I now see that MIME::Lite::HTML has been created to handle exactly that. Both of these modules are (of course) available on CPAN. |
From: Douglas K. <dlk...@rh...> - 2002-07-07 12:32:23
|
On Thursday 27 June 2002 09:59 pm, Glenn Morgan wrote: > Hi > > Had a search through the archive but can't find what I'm looking for, so > here goes. > > I am using HTML::Template with PageKit and having a problem with > <tmpl_var> substitutions in javascript quoted strings. See below: > > <button onclick="javascript: js_str='<tmpl_var > name="tmpl_str">;"></button> > > If tmpl_str="It's a wonderful life" > > Then my resultant html is > > <button onclick="javascript: js_str='It's a wonderful life'";></button> > > This is obviously broken due to the unescaped single quote in It's. The > same would apply if the js string assignment was enclosed in double > quotes and I included doulble quotes in my tmp_str value. > > What I really need to do is: > > tmpl_str=It\'s a wonderful life > > and all would be well. > > Unfortunately, > > 1) I am working with db data and am not aware of what chars data values > contain. > > 2) I am using the same data values in different places within the same > template and do not want escaped quotes in all cases. > > These two cases make it very messy to filter my datasets and escape > here, there and everywhere. > > Any ideas? Is there a simple solution or would a escape=quotes patch be > the way to go? > You need to filter the data looking for the character in the data stream. This is what I use to take care of that problem. $data =~ s|"|\\"|g; -- Douglas Kirkland Technical Support Department Rhyton Corporation te...@rh... http://www.rhyton.com |
From: Philip S T. <phi...@gm...> - 2002-07-08 04:41:19
|
On Sun, 7 Jul 2002, Douglas Kirkland wrote: > You need to filter the data looking for the character in the data stream. > This is what I use to take care of that problem. > > $data =~ s|"|\\"|g; This won't work if you use the same var in javascript and in html. |
From: Sam T. <sa...@tr...> - 2002-07-07 17:42:43
|
On Fri, 28 Jun 2002, Glenn Morgan wrote: > I am using HTML::Template with PageKit and having a problem with > <tmpl_var> substitutions in javascript quoted strings. See below: > > <button onclick="javascript: js_str='<tmpl_var > name="tmpl_str">;"></button> > > If tmpl_str="It's a wonderful life" > > Then my resultant html is > > <button onclick="javascript: js_str='It's a wonderful life'";></button> Try <tmpl_var name="tmpl_str" escape=HTML>. -sam |
From: Philip S T. <phi...@gm...> - 2002-07-08 04:43:08
|
On Sun, 7 Jul 2002, Sam Tregar wrote: > > <button onclick="javascript: js_str='It's a wonderful life'";></button> > > Try <tmpl_var name="tmpl_str" escape=HTML>. " doesn't translate to " inside a javascsript string. Sam, I think this needs an escape=quote parameter. What do you think. Would only be a couple of lines added. Philip |
From: Sam T. <sa...@tr...> - 2002-07-08 05:46:44
|
On Mon, 8 Jul 2002, Philip S Tellis wrote: > Sam, I think this needs an escape=quote parameter. What do you think. > Would only be a couple of lines added. Mmm, maybe. Or a way to add new escapes at runtime. -sam |
From: Philip S T. <phi...@gm...> - 2002-07-08 06:12:11
|
On Sun, 7 Jul 2002, Sam Tregar wrote: > > Sam, I think this needs an escape=quote parameter. What do you think. > > Would only be a couple of lines added. > > Mmm, maybe. Or a way to add new escapes at runtime. how about this: new HTML::Template(..., escape={ name => 'quote', find => qr/(['"])/, replace => '\$1' }) |
From: Sam T. <sa...@tr...> - 2002-07-08 07:11:17
|
On Mon, 8 Jul 2002, Philip S Tellis wrote: > how about this: > > new HTML::Template(..., escape={ > name => 'quote', > find => qr/(['"])/, > replace => '\$1' > }) I think I'd prefer: escape => { quote => sub { $$_[0] =~ s/(['"])/\$1/g; } } Or possibly setting $_: escape => { quote => sub { s/(['"])/\$1/g; } } But that might be just a little too cute. -sam |
From: Philip S T. <phi...@gm...> - 2002-07-08 07:20:32
|
On Mon, 8 Jul 2002, Sam Tregar wrote: > escape => { > quote => sub { $$_[0] =~ s/(['"])/\$1/g; } > } > > Or possibly setting $_: > > escape => { > quote => sub { s/(['"])/\$1/g; } > } > > But that might be just a little too cute. Yeah, seems good enough, except you'd have to make that \\$1 |
From: Andrew Ho <an...@te...> - 2002-07-08 07:39:20
|
Hello, PT>Sam, I think this needs an escape=quote parameter. What do you think. PT>Would only be a couple of lines added. I think adding a generic escape=quote is a bad idea. That doesn't give any context, and JavaScript strings quote quotes way differently from (for example) HTML or SQL strings. Within JavaScript there are multiple quoting methods you might want as well. Even if you called it "jsstringquote" to be specific, it's still not clear that it's intended for a string inside single quotes (since JavaScript allows you to use double quotes for strings, too). I like the idea of adding a simple way to add functions to do quoting. Humbly, Andrew ---------------------------------------------------------------------- Andrew Ho http://www.tellme.com/ an...@te... Engineer in...@te... Voice 650-930-9062 Tellme Networks, Inc. 1-800-555-TELL Fax 650-930-9101 ---------------------------------------------------------------------- |
From: Philip S T. <phi...@gm...> - 2002-07-08 07:46:06
|
On Mon, 8 Jul 2002, Andrew Ho wrote: > I think adding a generic escape=quote is a bad idea. That doesn't give any > context, and JavaScript strings quote quotes way differently from (for > example) HTML or SQL strings. Within JavaScript there are multiple quoting well, for HTML quoting, you'd use escape=HTML. SQL, well, I hope you aren't using HTML::Template for SQL, but then again... escape=quote would basically do ' => \' and " => \" - quoting single and double quotes that way, you can use the same tmpl_var in your javascript and also your html without a problem. I agree that the sub may be better, especially for future extensibility |
From: Roger B. W. <ro...@fi...> - 2002-07-08 08:50:55
|
On Mon, Jul 08, 2002 at 12:39:13AM -0700, Andrew Ho wrote: >I think adding a generic escape=quote is a bad idea. That doesn't give any >context, and JavaScript strings quote quotes way differently from (for >example) HTML or SQL strings. And SQL quoting is server-specific; and, perhaps more to the point, there's already a perfectly good quoting method in DBI for SQL strings. >I like the idea of adding a simple way to add functions to do quoting. Agreed. Roger |
From: l.f.elia <l.f...@la...> - 2003-11-03 21:47:53
|
Ok, guys (and ladies) don't laugh too loudly -- it apparently helps to spell tags correctly :-) Thank you all... Lee |
From: Jochen C. <htm...@dh...> - 2005-07-08 08:22:28
Attachments:
test.tgz
|
Hi, i found a nice bug (that keeps me awake for about 3 hours...) I have the following template: <tmpl_if expr="(int(rand(2))==0"> YES <tmpl_else> NO </tmpl_if> which is not that complicated. When you run the program, and the expr is evaluated to FASLSE then there is no problem and you get NO in the outut. BUT (!) if the expr is TRUE then the document is parsed again (don't ask why) and now comes the clue. IF the expr on the second run returns the same result as on the first run, you will get YES but if the results are different on the two runs you will get YES NO ... Whoops. Any Ideas? It seems not to be a problem with the rand, it seems more to be a problem when the expr is somehow different in the two runs. So why is ist pared twice? (sometimes!) |
From: Sam T. <sa...@tr...> - 2005-07-08 17:21:21
|
On Fri, 8 Jul 2005, Jochen Cichon wrote: > Any Ideas? > > > It seems not to be a problem with the rand, it seems more to be a > problem when the expr is somehow different in the two runs. So why > is ist pared twice? (sometimes!) I think it's because HTML::Template is evaluating the condition twice - once in the "TMPL_IF" and once in the "TMPL_ELSE". This usually works fine since most boolean conditions are stable but not for rand()! If you're interested in fixing this the relevent code is in HTML::Template::output(). I think this could be quite challenging to fix! -sam |
From: Jochen C. <htm...@dh...> - 2005-07-11 07:24:34
|
Hm, was my first Idea also, but why is condition evaluated a second time ONLY if it is TRUE on the first run? I have looked into the source, but was not sure of it's a problem of the resolving ... or maybe of the parser? -- Jochen Sam Tregar schrieb: > On Fri, 8 Jul 2005, Jochen Cichon wrote: > > >>Any Ideas? >> >> >>It seems not to be a problem with the rand, it seems more to be a >>problem when the expr is somehow different in the two runs. So why >>is ist pared twice? (sometimes!) > > > I think it's because HTML::Template is evaluating the condition twice > - once in the "TMPL_IF" and once in the "TMPL_ELSE". This usually > works fine since most boolean conditions are stable but not for > rand()! If you're interested in fixing this the relevent code is in > HTML::Template::output(). I think this could be quite challenging to > fix! > > -sam > > |
From: Sam T. <sa...@tr...> - 2005-07-11 14:49:53
|
On Mon, 11 Jul 2005, Jochen Cichon wrote: > Hm, was my first Idea also, > > but why is condition evaluated a second time ONLY if it is TRUE on the first > run? HTML::Template compiles an IF/ELSE into two JUMP IF ops: JUMP to A IF false ... ... JUMP TO B IF true A: ... ... ... B: ... Thus a false condition is only tested once, but a true condition gets tested twice. The trick will be to link the two jumps so that the second one re-examines the result of the first rather than running the code again. -sam |
From: Emanuele Z. <em...@li...> - 2005-07-11 16:50:35
|
> -----Original Message----- > From: htm...@li...=20 > [mailto:htm...@li...] On=20 > Behalf Of Sam Tregar > Sent: Monday, July 11, 2005 4:50 PM > To: Jochen Cichon > Cc: htm...@li... > Subject: Re: [htmltmpl] (no subject) >=20 >=20 > On Mon, 11 Jul 2005, Jochen Cichon wrote: >=20 > > Hm, was my first Idea also, > >=20 > > but why is condition evaluated a second time ONLY if it is=20 > TRUE on the first > > run? >=20 > HTML::Template compiles an IF/ELSE into two JUMP IF ops: >=20 > JUMP to A IF false > ... > ... > JUMP TO B IF true > A: ... > ... > ... > B: ... Well, I'm probably missing something (or everything), but it seems to me that the following compiled code layout could solve the problem: JUMP to A IF false ... # first true instruction ... ... # last true instruction JUMP TO B A: ... # first false instruction ... ... # last false instruction B: ... # normal execution after the IF/ELSE, if any... Anyway I would say that, in general, re-evaluating twice the predicate for a single IF/ELSE clause execution should be avoided at all costs. Ciao, Emanuele. |
From: Sam T. <sa...@tr...> - 2005-07-11 17:59:51
|
On Mon, 11 Jul 2005, Emanuele Zeppieri wrote: > Well, I'm probably missing something (or everything), but it seems to me > that the following compiled code layout could solve the problem: > > JUMP to A IF false > ... # first true instruction > ... > ... # last true instruction > JUMP TO B > A: ... # first false instruction > ... > ... # last false instruction > B: ... # normal execution after the IF/ELSE, if any... Yup, that would do it. That's much easier than trying to store state from the first one. So, when can I see a patch? -sam |
From: Emanuele Z. <em...@li...> - 2005-07-11 18:46:23
|
> -----Original Message----- > From: htm...@li... > [mailto:htm...@li...] On > Behalf Of Sam Tregar > Sent: Monday, July 11, 2005 8:00 PM > To: Emanuele Zeppieri > Cc: htm...@li... > Subject: Re: [htmltmpl] (no subject) > > > On Mon, 11 Jul 2005, Emanuele Zeppieri wrote: > > > Well, I'm probably missing something (or everything), but > it seems to me > > that the following compiled code layout could solve the problem: > > > > JUMP to A IF false > > ... # first true instruction > > ... > > ... # last true instruction > > JUMP TO B > > A: ... # first false instruction > > ... > > ... # last false instruction > > B: ... # normal execution after the IF/ELSE, if any... > > Yup, that would do it. That's much easier than trying to store state > from the first one. So, when can I see a patch? Well, I just didn't want to steal such a privilege to the person who originally pointed out this issue ;-) Joking apart, I'll be more than happy to work on a patch, as soon as my clients give me a break and my newborn first son here will stop crying! Any further hint about it? --Emanuele. |
From: Jochen C. <htm...@dh...> - 2005-07-13 07:15:46
|
>> >>>Well, I'm probably missing something (or everything), but >>it seems to me >> >>>that the following compiled code layout could solve the problem: >>> >>> JUMP to A IF false >>> ... # first true instruction >>> ... >>> ... # last true instruction >>> JUMP TO B >>>A: ... # first false instruction >>> ... >>> ... # last false instruction >>>B: ... # normal execution after the IF/ELSE, if any... >> >>Yup, that would do it. That's much easier than trying to store state >>from the first one. So, when can I see a patch? > > > Well, I just didn't want to steal such a privilege to the person who > originally pointed out this issue ;-) > > Joking apart, I'll be more than happy to work on a patch, as soon as my > clients give me a break and my newborn first son here will stop crying! > > Any further hint about it? > > --Emanuele. Hey cool, So I just have to wait ;) right now my workaround does a regexp and replace the rand function with the value of the evaluated part... so a <tmpl_if expr="int(rand(10))"> becomes a <tmpl_if expr="int(4.3332)"> or something similar. Thats fair enought, but anyway, only usable on a few steps... so sometimes I do a fallback onto the current timestamp (milliseconds). But as I say thats only a workaround (read the file, precompile, give it to HTML::Template::Expr) Bye, |