2005/5/10

     
 

The CfgScript Templates

artefaktur

| Introduction | Start | acdkcfgscript | Language | Library | Embedding | CfgScript IDE | Debugging | Templates | Samples | Wish List |

CfgScript provides a template language, quite similar to JSP.


Content of this chapter:

   Introduction
     Merge strings literals with variables
     Using backtick string evaluation
   CfgScript Templates
     Sample
     More details



 Introduction

In scripting language often text files are build with static parts (which are not changed) and dynamic parts.

In CfgScript are multiple options to merge this static and dynamic parts.

 Merge strings literals with variables


String head = "<html><header><title>Hello</title></header><body>";
String footer = "</body></html>";
StringArray hellos = [ "First", "Second", "Third" ];
StringBuffer sb = new StringBuffer();
sb.append(head);
sb.append("<table>");
foreach (String s in hellos)
{
  sb.append("<tr><td>").append(s).append("</td></tr>");
}
sb.append("</table>");
sb.append(footer);
out.println(sb.toString());
This results in:

<html><header><title>Hello</title></header><body><table><tr><td>First</td></tr><tr><td>Second</td></tr><tr><td>Third</td></tr></table></body></html>
Of course this is very simple example. In normal cases the static part of the text is much more complex:

 Using backtick string evaluation

A second posibility is to use  Backtick Expressions.

StringArray hellos = [ "First", "Second", "Third" ];
String s =
`"<html>
  <header>
    <title>Hello</title>
  </header>
  <body>
    <table>
  !{ foreach (String s in hellos) out.println(\"<tr><td>\" + s \"</td></tr>\"); }!
  </table>
 </body>
</html>"`;
out.println(s);
Output:

<html><header><title>Hello</title></header><body><table><tr><td>First</td></tr><tr><td>Second</td></tr><tr><td>Third</td></tr></table></body></html>
<html>
  <header>
    <title>Hello</title>
  </header>
  <body>
    <table>
  <tr><td>First</td></tr>
<tr><td>Second</td></tr>
<tr><td>Third</td></tr>

  </table>
 </body>
</html>

But for more complex cases this is not always available. Quoting inside the loop is quite complex.

 CfgScript Templates


CfgScript Templates are textfiles, in which CfgScript code can be embedded.

 Sample



<html>
<header>
  <title>Hello 3</title>
</header>
<body> 
<table>
<@ foreach (String s in sa) { 
@>  <tr><td><@= s @></td></tr>
<@  } @></table>
</body>
</html>


To evalute this such a template you can use following code (CfgScript or C++):


// get name of current script, get parent directory
File dir = (new File(__script.getFileName())).getParentFile();
// look for all files ends with .cst in this directory
foreach (File f in dir.listFiles(new GlobFilenameFilter("*.cst")))
{
  // create a new script instance
  Script s = new Script(f.getPath());
  // execute template.
  
  /*
    Because in __props (which represends all variables the current scope)
    out is defined, the template writes to out.
  */
  StringArray sa = [ "First", "Second", "Third" ];
  s.evalTemplate(f, __props);
}

 More details


The Script::evalTemplate() function read the given file and write it to the writer defined in the variable out of the given Props.

The regions marked with <% %> will be evaluated as Script Code.
The variables defined in Props given to evalTemplate are also available in this Script Code. All text written to out in these section also written to out.

There is no limitation in CfgScript code in the <% %> section.
It can also contains includes, class definitions, etc.

The regions marked with <%= %> will be evaluated as CfgScript expression.
To the result of the expession toString() will applied and written to out
The regions marked with <!= %> are comments and will not appear in the output.

As shown in the sample the CfgScript loops can also contains template text. It will be written to out every time the loop will be executed.