I have a chunk of template HTML in a structure suitable for HTML::Element to use, but it contains place holder text in a number of places that I want to replace with appropriate values at run time. I can manualy access each string that needs to be fixed by navigating the template structure, but that is somewhat fragile. Is there a better way of doing this?
use warnings; use strict; use HTML::TreeBuilder; use Clone qw(clone); my $newHTML = ['div', {class => 'ourobject'}, ['script', {language => 'JavaScript', type => 'text/JavaScript'}, 'embedLabTutorClient("VIEW", "URL", WWW, HHH)', ], ['noscript', ['object', {classid=>"CLSID:ReleaseCLSID", width=>'WWW', height=>'HHH', v +iewastext=>'1'}, ['param', {name=>'ViewSettingsUrl', value=>'URL'}], ['param', {name=>'ViewName', value=>'VIEW'}], ] ] ]; my $objUrl = 'somewhere/object.obj'; my $objView = 'erewhon'; my $objWidth = 255; my $objHeight = 127; my $copy = clone ($newHTML); # Perform 'global' ssubstitutions on $copy here #s/WWW/$objWidth/; #s/HHH/$objHeight/; #s/VIEW/$objView/; #s/URL/$objUrl/; my $element = HTML::Element->new ('root'); $element->push_content ($copy); print $element->as_HTML(undef, ' ', {});
Prints:
<root><div class="ourobject"> <script language="JavaScript" type="text/JavaScript">embedLabTut +orClient("VIEW", "URL", WWW, HHH)</script> <noscript> <object classid="CLSID:ReleaseCLSID" height="HHH" viewastext= +1 width="WWW"> <param name="ViewSettingsUrl" value="URL"> <param name="ViewName" value="VIEW"> </object> </noscript> </div></root>
and I would like:
<root><div class="ourobject"> <script language="JavaScript" type="text/JavaScript">embedLabTut +orClient("erewhon", "somewhere/object.obj", 255, 127)</script> <noscript> <object classid="CLSID:ReleaseCLSID" height="127" viewastext= +1 width="255"> <param name="ViewSettingsUrl" value="somewhere/object.obj" +> <param name="ViewName" value="erewhon"> </object> </noscript> </div></root>
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |