add test to check all installed templates for validity
authorTony Cook <tony@develop-help.com>
Fri, 9 Mar 2012 05:32:18 +0000 (16:32 +1100)
committerTony Cook <tony@develop-help.com>
Fri, 9 Mar 2012 05:32:18 +0000 (16:32 +1100)
also removed some old, no longer used templates, and
bse_template_check.pl can now test more than one template at a time.

12 files changed:
MANIFEST
site/cgi-bin/modules/Squirrel/Template.pm
site/templates/admin/edit_catalog.tmpl
site/templates/article_edit.tmpl [deleted file]
site/templates/checkoutfinal_base.tmpl
site/templates/checkoutnew_base.tmpl
site/templates/checkoutpay_base.tmpl
site/templates/section_edit.tmpl [deleted file]
site/templates/shop_help.tmpl [deleted file]
site/templates/user/orderdetaillow.tmpl
site/util/bse_template_check.pl
t/t020checktemplates.t [new file with mode: 0644]

index ddb2939..35463e5 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -643,7 +643,6 @@ site/templates/admin/users/view_activity.tmpl
 site/templates/admin/users/view_bookings.tmpl
 site/templates/admin/users/view_confirm.tmpl
 site/templates/affiliate.tmpl
-site/templates/article_edit.tmpl
 site/templates/base.tmpl
 site/templates/cart_base.tmpl
 site/templates/catalog.tmpl
@@ -712,9 +711,7 @@ site/templates/noartbase.tmpl
 site/templates/printable/printable.tmpl
 site/templates/printable/wap.tmpl
 site/templates/search_base.tmpl
-site/templates/section_edit.tmpl
 site/templates/seminars/seminar.tmpl
-site/templates/shop_help.tmpl
 site/templates/shop_sect.tmpl
 site/templates/shopitem.tmpl
 site/templates/sidebar/afflink.tmpl
@@ -824,6 +821,7 @@ t/t011dhdates.t                     Tests DevHelp::Date
 t/t012validate.t
 t/t013country.t
 t/t014bsesort.t
+t/t020checktemplates.t
 t/t050format.t                 DevHelp::Formatter tests
 t/t060parms.t
 t/t070sqldates.t               Test SQL date tools
@@ -859,6 +857,7 @@ t/templater/20parse.t
 t/templates/included.include   Used by t010template.t
 t/templates/included.recursive
 t/templates/wrapinner.tmpl
+t/templates/wrapself.tmpl
 t/templates/wraptest.tmpl      Used by t010template.t
 test.cfg-dist
 test.cfg.base
index 4f7112f..df16ae2 100644 (file)
@@ -15,7 +15,7 @@ BEGIN {
 
 use constant DEBUG_GET_PARMS => 0;
 
-our $VERSION = "1.010";
+our $VERSION = "1.011";
 
 my $tag_head = qr/(?:\s+<:-|<:-?)/;
 my $tag_tail = qr/(?:-:>\s*|:>)/;
@@ -26,6 +26,7 @@ sub new {
   $opts{errout} = \*STDOUT;
   $opts{param} = [];
   $opts{wraps} = [];
+  $opts{errors} = [];
 
   return bless \%opts, $class;
 }
@@ -291,6 +292,12 @@ sub errors {
   return @{$self->{errors}};
 }
 
+sub clear_errors {
+  my ($self) = @_;
+
+  $self->{errors} = [];
+}
+
 sub start_wrap {
   my ($self, $args) = @_;
 
index 900e3ad..b3ea359 100644 (file)
      <: or :>
     <:if UserCan edit_save:article:><input type="submit" name="save" value="Update Catalog" /><:or UserCan:><:eif UserCan:><:eif:></p>
   </form>
-<:if children:>
+<:if Children:>
 <h2>Products / Sub-catalogs</h2>
 <a name="children"></a> 
       <table class="editform children">
           <td class="col_modify"> <: edit child Edit :> <:if UserCan edit_delete_article:child:><a href="/cgi-bin/admin/add.pl?id=<:child id:>&amp;remove=1&amp;_csrfp=<:csrfp admin_remove_article:>" onClick="return window.confirm('Are you sure you want to delete this <:ifMatch [child generator] "Product":>Product<:or:>Sub-catalog<:eif:>')">Delete</a><:or UserCan:><:eif UserCan:></td>
              <td class="col_move"><:movechild:></td>
         </tr>
-        <:iterator separator children:> <:iterator end children:> 
+        <:iterator end children:> 
       </table>
-<:or children:>
-<:eif children:>
+<:eif Children:>
 <:if HaveChildType:>
 <:if New:>
 <:or New:>
diff --git a/site/templates/article_edit.tmpl b/site/templates/article_edit.tmpl
deleted file mode 100755 (executable)
index 95936e4..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-<html>
-<head>
-
-  <title>
-    Administration - <: ifnew :>New<: or :>Edit<: eif :> <:articleType:>
-  </title>
-
-  <link rel="stylesheet" type="text/css" href="/css/admin.css">
-
-</head>
-
-<body>
-
-  <input type="button" onclick="history.go(0);" value="  Refresh  ">
-
-  <h1>Administration Page</h1>
-
-  <h2>Select Images First</h2>
-
-  <p><form method="POST" action="<:script:>">
-
-  <!--input type="hidden" name="return_url" value="<:script:>?level=<: level :>&id=<:article id:>" -->
-
-  <p>
-  <input type="submit" name="artimg" value="<:articleType:> Image Wizard">
-  </p>
-
-
-  <h2><:articleType:> Details</h2>
-
-  <p><:message:> | <a href="/admin/">Admin menu</a> | <:ifnew:><:or:><a href="<:article admin:>">See article</a> | <:eif:>
-    <input type="hidden" name="level" value="<: level :>">
-    <input type="hidden" name="id" value="<: article id :>">
-  </p>
-  <table border="0" cellspacing="0" cellpadding="0" bgcolor="#000000">
-    <tr>
-      <td>
-
-        <table cellpadding="6" border="0" cellspacing="1">
-          <tr> 
-            <th> <:parentType:>: </th>
-            <td bgcolor="#FFFFFF"> 
-              <select name="parentid">
-                <option value="">Please Select a <: parentType :> <: ifart :><: 
-                list subsections :><:or:><:list sections:><:eif:> 
-              </select>
-            </td>
-          </tr>
-          <tr> 
-            <th> <:articleType:> Title: </th>
-            <td bgcolor="#FFFFFF"> 
-              <input type="text" name="title" maxlength="64" size="64" value="<: article title :>">
-            </td>
-          </tr>
-          <tr> 
-            <th valign="top"> Body: </th>
-            <td bgcolor="#FFFFFF"> 
-              <textarea name="body" rows="10" cols="60" wrap="virtual"><: article body :></textarea>
-            </td>
-          </tr>
-          <tr> 
-            <th> Release Date: </th>
-            <td bgcolor="#FFFFFF"> 
-              <input type="text" name="release" value="<: article release :>" size="10" maxlength="10">
-              (dd/mm/yyyy<: ifnew :> - default is today<: or :><: eif :>)</td>
-          </tr>
-          
-          
-          <tr> 
-            <th> Expire Date: </th>
-            <td bgcolor="#FFFFFF"> 
-              <input type="text" name="expire" value="<: article expire :>" size="10" maxlength="10">
-              (dd/mm/yyyy - <: ifnew :>default is two weeks from now, <: or :><: eif :>blank 
-              for never expires)</td>
-          </tr>
-          <tr> 
-            <th> Summary Length: </th>
-            <td bgcolor="#FFFFFF"> 
-              <input type="text" name="summaryLength" size="10" maxlength="10" value="<: article summaryLength :>">
-              (in characters - <: ifnew :>default inherited from section<: if art :> or sub-section<: 
-              or art :><: eif art :>, <: or :><: eif :>zero for no 
-              summary)</td>
-          </tr>
-          
-          <tr> 
-            <th> Display threshold: </th>
-            <td bgcolor="#FFFFFF"> 
-              <input type="text" name="threshold" size="10" maxlength="10" value="<: article threshold :>">
-            </td>
-          </tr>
-          <tr> 
-            <th> Keywords: </th>
-            <td bgcolor="#FFFFFF"> 
-              <input type="text" name="keyword" maxlength="255" size="60" value="<: article keyword :>">
-               (comma separated)
-            </td>
-          </tr>
-          
-          
-          
-          
-          
-          <tr> 
-            <th>List article:</th>
-            <td bgcolor="#FFFFFF"> <!-- input type="checkbox" name="listed" value=1 <:checked article listed 1:> --> 
-              <:list listed:> </td>
-          </tr>
-          <tr> 
-            <th valign="top"> Uploaded files: </th>
-            <td align="center" bgcolor="#FFFFFF"> <: iterator begin images :> <img src="/images/<: image image :>" alt="<:image alt :>" width=              <:image width:> height=<:image height:>> <: iterator separator images 
-              :> 
-              <hr noshade size="1">
-              <: iterator end images :> &nbsp; <br>
-        </table>
-</td>
-</tr>
-</table>
-
-  <p>
-    <input type="submit" name="save"
-           value="  <: ifnew :>Add New<: or :>Update<: eif :> <: articleType:>  "></p>
-  </form>
-<:if children:> <a name="children"></a> 
-<table border="0" cellspacing="0" cellpadding="0" bgcolor="#000000">
-    <tr>
-      <td>
-      <table border=0 cellpadding="6" cellspacing="1">
-        <tr><th>Title</th><th>Summary</th><th>Listed</th><th>&nbsp;</th></tr>
-<:iterator begin children:>
-        <tr bgcolor="#FFFFFF"> 
-          <td><a href="<:child admin:>"><:child title:></a></td>
-          <td><: summary child body :></td>
-          <td align="center"><: is child listed :></td>
-          <td nowrap> <a href="/cgi-bin/admin/add.pl?id=<:child id:>">Edit</a> 
-            <:if NextChild:> <a href="/cgi-bin/admin/move.pl?id=<:child id:>&d=down&edit=1&all=1"> 
-            <img src="/images/admin/move_down.gif" width="17" height="13" alt="Move Down" border="0"></a> 
-            <:or NextChild:> <:eif NextChild:> <:if PrevChild:> <a href="/cgi-bin/admin/move.pl?id=<:child id:>&d=up&edit=1&all=1"> 
-            <img src="/images/admin/move_up.gif" width="17" height="13" alt="Move Up" border="0"></a> 
-            <:or PrevChild:> <:eif PrevChild:> 
-            <form action="<:script:>"><input type=hidden name="id" value="<:child id:>"><input type=submit name=remove value="Delete"></form>
-</td>
-</tr>
-<:iterator separator children:>
-<:iterator end children:>
-</table>
-</td>
-</tr>
-</table>
-<:or children:>
-<:eif children:>
-<:if HaveChildType:>
-<:if new:>
-<:or new:>
-<form action="/cgi-bin/admin/add.pl" method="POST">
-<input type=hidden name="parentid" value="<:article id:>">
-<p><input type=submit value="Add <:childtype:>"></p>
-</form>
-<p><:eif new:> <:or HaveChildType:> <:eif HaveChildType:> </p>
-<p><a href="/admin/">Admin menu</a></p>
-</body
-></html>
index bafd708..e4ad215 100644 (file)
             money item price :></b></font></td>
         </tr>
         <:iterator end items:> 
-        <:if shipping_cost:>
+        <:if Shipping_cost:>
         <tr valign="middle" align="center" bgcolor="#FFFFFF"> 
-          <td colspan=2 width="100%" align="left">&nbsp;<font face="Verdana, Arial, Helvetica, sans-serif" size="-2">Shipping charges (for <:shipping_method:><:if delivery_in:>, delivery in <:delivery_in:> days<:or delivery_in:><:eif delivery_in:>)</font></td>
+          <td colspan=2 width="100%" align="left">&nbsp;<font face="Verdana, Arial, Helvetica, sans-serif" size="-2">Shipping charges (for <:shipping_method:><:if Delivery_in:>, delivery in <:delivery_in:> days<:eif:>)</font></td>
           <td align="right"> <font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><b>$<:money shipping_cost:></b></font></td>
         </tr>
-        <:or shipping_cost:><:eif shipping_cost:>
+        <:or Shipping_cost:><:eif Shipping_cost:>
       </table>
     </td>
   </tr>
index 6ef8826..4522285 100644 (file)
@@ -95,7 +95,7 @@ function BSE_validateForm {
         <:iterator end items:> 
         <:if Shipping_cost:>
         <tr valign="middle" align="center" bgcolor="#FFFFFF"> 
-          <td colspan=2 width="100%" align="left">&nbsp;<font face="Verdana, Arial, Helvetica, sans-serif" size="-2">Shipping charges (for <:shipping_method:><:if delivery_in:>, delivery in <:delivery_in:> days<:or delivery_in:><:eif delivery_in:>)</font></td>
+          <td colspan=2 width="100%" align="left">&nbsp;<font face="Verdana, Arial, Helvetica, sans-serif" size="-2">Shipping charges (for <:shipping_method:><:if Delivery_in:>, delivery in <:delivery_in:> days<:or Delivery_in:><:eif Delivery_in:>)</font></td>
           <td align="right"> <font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><b>$<:money shipping_cost:></b></font></td>
         </tr>
         <:or Shipping_cost:><:eif Shipping_cost:>
index 7305309..2c8878e 100644 (file)
             money item price :></b></font></td>
         </tr>
         <:iterator end items:> 
-        <:if shipping_cost:>
+        <:if Shipping_cost:>
         <tr valign="middle" align="center" bgcolor="#FFFFFF"> 
-          <td colspan=2 width="100%" align="left">&nbsp;<font face="Verdana, Arial, Helvetica, sans-serif" size="-2">Shipping charges (for <:shipping_method:><:if delivery_in:>, delivery in <:delivery_in:> days<:or delivery_in:><:eif delivery_in:>)</font></td>
+          <td colspan=2 width="100%" align="left">&nbsp;<font face="Verdana, Arial, Helvetica, sans-serif" size="-2">Shipping charges (for <:shipping_method:><:if Delivery_in:>, delivery in <:delivery_in:> days<:or Delivery_in:><:eif Delivery_in:>)</font></td>
           <td align="right"> <font face="Verdana, Arial, Helvetica, sans-serif" size="-2"><b>$<:money shipping_cost:></b></font></td>
         </tr>
-        <:or shipping_cost:><:eif shipping_cost:>
+        <:or Shipping_cost:><:eif Shipping_cost:>
       </table>
     </td>
   </tr>
diff --git a/site/templates/section_edit.tmpl b/site/templates/section_edit.tmpl
deleted file mode 100644 (file)
index da090fd..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<html>
-<head>
-
-  <title>Administration - Edit <:articleType:></title>
-
-  <link rel="stylesheet" type="text/css" href="/css/admin.css">
-
-</head>
-
-<body>
-<p><input type="button" onclick="history.go(0);" value="  Refresh  "></p>
-
-  <h1>Administration Page</h1>
-
-<p>| <a href="/admin/">Admin menu</a> |</p>
-<:if children:>
-<a name="children"></a>
-<table border="0" cellspacing="0" cellpadding="0" bgcolor="#000000">
-    <tr>
-      <td>
-<table border=0 cellpadding="6" cellspacing="1">
-  <tr><th>Title</th><th>Summary</th><th>Listed</th><th>&nbsp;</th></tr>
-<:iterator begin children:>
-  <tr bgcolor="#FFFFFF"> 
-    <td><a href="<:child admin:>"><:child title:></a></td>
-    <td><: summary child body :></td>
-    <td bgcolor="#FFFFFF" align="center"><: is child listed :></td>
-    <td bgcolor="#FFFFFF" nowrap> <a href="/cgi-bin/admin/add.pl?id=<:child id:>">Edit</a> 
-      <:if listed child:> <:if NextChild:> <a href="/cgi-bin/admin/move.pl?id=<:child id:>&d=down&edit=1"><img src="/images/admin/move_down.gif" width="17" height="13" border="0" alt="Move Down" align="absbottom"> 
-      </a> <:or NextChild:> <:eif NextChild:> <:if PrevChild:> <a href="/cgi-bin/admin/move.pl?id=<:child id:>&d=up&edit=1"><img src="/images/admin/move_up.gif" width="17" height="13" border="0" alt="Move Up" align="absbottom"></a> 
-      <:or PrevChild:> <:eif PrevChild:> <:or listed:> <:eif listed:> </td>
-</tr>
-<:iterator separator children:>
-<:iterator end children:>
-</table>
-</td>
-</tr>
-</table>
-<:or children:>
-<:eif children:>
-<:if HaveChildType:>
-<:if new:>
-<:or new:>
-<form action="/cgi-bin/admin/add.pl" method="POST">
-<input type=hidden name="parentid" value="<:article id:>">
-<p><input type=submit value="Add <:childtype:>"></p>
-</form>
-<p><:eif new:> <:or HaveChildType:> <:eif HaveChildType:> </p>
-</body
-></html>
diff --git a/site/templates/shop_help.tmpl b/site/templates/shop_help.tmpl
deleted file mode 100644 (file)
index d1de4d8..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-<html>
-<head>
-<title>APP Store</title>
-<meta name="ROBOTS" content="ALL">
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<meta http-equiv="Expires" content="Thu, 01 Jan 1970 00:00:00 GMT">
-<link rel="stylesheet" href="/css/style-main.css">
-
-</head>
-
-<body bgcolor="#FFFFFF" text="#000000" link="#333399" vlink="#333399" alink="#CC0033" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
-<table width="100%" border="0" cellspacing="0" cellpadding="0">
-  <tr valign="top"> 
-    <td width="150"><!-- #BeginLibraryItem "/Library/search.lbi" --><table width="100%" border="0" cellspacing="0" cellpadding="5" name="search">
-              <tr align="center"> 
-                <td> 
-                  <form name="search" method="GET" action="/cgi-bin/search.pl">
-                    <input type="hidden" name="s" value="">
-                    <input type="hidden" name="d" value="ar">
-                    <input type="hidden" name="m" value="0">
-                    <br>
-                    <nobr> 
-                    <input type="text" name="q" size="14">
-                    <input type="submit" value="Go" name="submit">
-                    <br>
-                    <font face="Verdana, Arial, Helvetica, sans-serif" size="-2"> 
-                    Try our <a href="/cgi-bin/search.pl">advanced search</a></font></nobr> 
-                  </form></td></tr>
-            </table><!-- #EndLibraryItem --> <!-- #BeginLibraryItem "/Library/nav.lbi" --><table width="150" border="0" cellspacing="0" cellpadding="0" name="nav">
-        <tr> 
-          <td> <:iterator begin level1:> <:if Level2:> 
-            <table width="100%" border="0" cellspacing="0" cellpadding="0">
-              <tr> 
-                <td> 
-                  <table width="100%" border="0" cellspacing="0" cellpadding="0">
-                    <tr bgcolor="#CCCCFF"> 
-                      <td height="20" width="100%" nowrap><font class="nav_head" face="Verdana, Arial, Helvetica, sans-serif" size="-2"><b>&nbsp;<a href="<:url level1:>"><:level1 
-                        title:></a></b></font></td></tr>
-                  </table></td></tr>
-              <tr> 
-                <td> 
-                  <table width="100%" border="0" cellspacing="0" cellpadding="5">
-                    <tr> 
-                      <td> <font class="nav_link" face="Verdana, Arial, Helvetica, sans-serif" size="-2"><:iterator 
-                        begin level2:><a href="<:url level2:>"><:level2 title:></a> 
-                        <:iterator separator level2:><br>
-                        <img src="/images/trans_pixel.gif" width="2" height="4" border="0"><br>
-                        <:iterator end level2:> </font></td></tr>
-                  </table></td></tr>
-            </table><:or Level2:> 
-            <table width="100%" border="0" cellspacing="0" cellpadding="0">
-              <tr> 
-                <td> 
-                  <table width="100%" border="0" cellspacing="0" cellpadding="0">
-                    <tr bgcolor="#CCCCFF"> 
-                      <td height="20" width="100%" nowrap><font class="nav_head" face="Verdana, Arial, Helvetica, sans-serif" size="-2"><b>&nbsp;<a href="<:url level1:>"><:level1 
-                        title:></a></b></font></td></tr>
-                  </table></td></tr>
-            </table><br>
-            <:eif Level2:><:iterator separator level1:><:iterator end level1:> 
-          </td></tr>
-      </table><!-- #EndLibraryItem --></td>
-    <td width="100%">APP Store 
-      <hr noshade width="100%" size="1">
-      <p><font face="Arial, Helvetica, sans-serif" size="3" color="#660033"><span class="article_body_heads"><b><a name="security"></a>Security</b></span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text"><a href="http://www.thawte.com"><img src="/images/stamp.gif" width="150" height="101" align="RIGHT" border="0"></a>We 
-        want to ensure you shop with confidence. That&#146;s why transactions 
-        at our website take place in a safe and secure environment. All the information 
-        you provide us with is ecrypted using SSL (Secure Sockets Layer) technology.</span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text">Simply, 
-        this means no one else is able to see or read the information you send 
-        on-line. You can tell your browser is operating in a secure environment 
-        when you see the padlock icon in the bottom corner of your browser window. 
-        We decode your information and process your payment with the bank, just 
-        as it would be done if you were providing your credit card details in 
-        person or by telephone. For further details, visit, <a href="http://www.thawte.com">http://www.thawte.com</a>.</span></font></p>
-      <p><font face="Arial, Helvetica, sans-serif" size="3" color="#660033"><b class="article_body_heads"><a name="ordering"></a>Ordering</b> 
-        </font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text"><b>Step 
-        1</b> &#150; Browse our catalogue: The store lists books, resources and 
-        event tickets. Click on an item for more information. Click &#145;Add 
-        to cart&#146; if you&#146;d like to buy this item. If it&#146;s the only 
-        item you want buy, click &#145;Checkout&#146;. If you wish to keep browsing 
-        click&nbsp;&#145;browse&nbsp;more items&#146;. The shipping cost shown 
-        for each item is included in the item cost. You can remove items from 
-        your shopping cart or cancel your order at any time. </span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text"><b>Step 
-        2</b> &#150; Your shopping cart: Click on &#145;View cart&#146; at any 
-        time to see what&#146;s in your cart. To change the order quantity of 
-        any item, simply change the number in the quantity column and click &#145;Recalculate&#146; 
-        to update the Grand Total. Click &#145;Remove&#146; if you change your 
-        mind and want to remove an item from your cart. If you&#146;re ready to 
-        place your order, click &#145;Checkout&#146;. </span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text"><b>Step 
-        3</b> &#150; Checkout: Fill in your name, shipping address and credit 
-        card information. Click &#145;Purchase Now&#146; to finalise your order. 
-        Information sent to us is encrypted using SSL (Secure Sockets Layer) technology, 
-        so no prying eyes can see your details.</span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text">If 
-        you don&#146;t feel comfortable making an on-line payment you can post 
-        a cheque made payable to &#145;bodyscoop.com&#146; to: body Scoop Store, 
-        38 West Street, Petersham NSW 2049.</span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text">We&#146;ll 
-        process your order and ship your purchase within 24 hours (out of stock 
-        items may take longer, but we&#146;ll let you know in the store). You 
-        can check the status of your order at any time by contacting us at <a href="mailto:thestore@bodyscoop.com.au">thestore@bodyscoop.com.au</a> 
-        </span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text"><b>Step 
-        4</b> &#150; Receipt After you&#146;ve made your payment we&#146;ll give 
-        you a receipt number. You can print this as your body Scoop receipt. We&#146;ll 
-        also email it to you. Please quote this number if making any inquiries. 
-        </span></font></p>
-      <p><font face="Arial, Helvetica, sans-serif" size="3" color="#660033"><span class="article_body_heads"><b><a name="returns"></a>Returns</b></span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text">You 
-        can return items in their original within 30 days &#150; no questions 
-        asked. All we need is your receipt. </span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text">If 
-        goods are damaged when you receive them we&#146;ll send an undamaged replacement 
-        at no charge. You┬╣ll need to return the damaged item so we can check it. 
-        </span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text">Refunds 
-        for credit card purchases will be credited directly to the card number 
-        supplied. All other refunds will be made by cheque. </span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text">If 
-        you wish to cancel an order, please do so quickly as we always try to 
-        dispatch items within 24 hours. You can call us on 61 2 9590 4464 or email 
-        us at <a href="mailto:thestore@bodyscoop.com.au">thestore@bodyscoop.com.au</a> 
-        You can&#146;t cancel an order after it has been dispatched, but you can 
-        return it. </span></font></p>
-      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><span class="article_body_text">Make 
-        sure you let us know how to improve our customer service, if you have 
-        any ideas. </span></font></p>
-    </td>
-  </tr>
-</table>
-</body>
-</html>
-
index 6ce6d81..b92df61 100644 (file)
@@ -57,6 +57,7 @@
 <:ifOrder freight_tracking:>, tracking code <:order freight_tracking:><:or:><:eif:>
          </td>
        </tr>
+<:eif Order:>
 <:eif Cfg:>
         </table>
         <:if Orderfiles:> <table width="100%" cellpadding="3" cellspacing="1">
index 0adef41..afdb401 100644 (file)
@@ -29,8 +29,30 @@ my $templater = Squirrel::Template->new
    template_dir => \@includes,
   );
 
-my $file = shift
+@ARGV
   or usage("No filename supplied");
-my $p = $templater->parse_file($file);
-print $_->[3], ":", $_->[2], ": ", $_->[4], "\n" for $templater->errors;
+my $errors;
+for my $file (@ARGV) {
+  print "$file:\n" if $verbose || @ARGV > 1;
+  my $p = $templater->parse_file($file);
+  my @errors = $templater->errors;
+  if (@errors) {
+    $errors = 1;
+    print "  ", $_->[3], ":", $_->[2], ": ", $_->[4], "\n" for @errors;
+    $templater->clear_errors;
+  }
+  else {
+    print "  No errors\n" if $verbose;
+  }
+}
+
+exit 1 if $errors;
+
+sub usage {
+  die <<EOS;
+Usage: $0 [ -I directory ] file...
+
+Check each file specified for correct template syntax, reporting any errors.
+EOS
+}
 
diff --git a/t/t020checktemplates.t b/t/t020checktemplates.t
new file mode 100644 (file)
index 0000000..4eee7f2
--- /dev/null
@@ -0,0 +1,33 @@
+#!perl
+use strict;
+use Test::More;
+use ExtUtils::Manifest qw(maniread);
+use Squirrel::Template;
+
+my $mani = maniread();
+
+$| = 1;
+my @templates = map m(^site/templates/(.*)$),
+  sort grep m(^site/templates/.*\.tmpl$), keys %$mani;
+
+plan tests => scalar @templates;
+
+my $templater = Squirrel::Template->new
+   (
+    charset => "utf-8",
+    utf8 => 1,
+    template_dir => "site/templates",
+   );
+for my $file (@templates) {
+  my ($p, $message) = $templater->parse_file($file);
+  if ($p) {
+    my @errors = $templater->errors;
+    ok(!@errors, "check $file for template errors");
+    diag("$_->[3]:$_->[2]: $_->[4]") for @errors;
+    $templater->clear_errors;
+  }
+  else {
+    fail("check $file for template errors");
+    diag($message);
+  }
+}