Helma Logo
main list history
previous version  overview  next version

Version 5 by michi on 07. December 2005, 11:11


* follow february-proposal, starting with andreas <a href="http://helma.org/pipermail/helma-dev/2005-February/001714.html">code snippet</a> from back then
* allow walking through object-structure (not really necessary, since this could be implemented by passing along a parameter to the macro, but a 'this.topics.count' is definitely prefered to 'this.count collection="topics"'
* either use <code><% .. %></code> or <h:macro .. />, but dont allow both
* XHTML conformance of the templates is an absolut non-goal for me. i just dont see a reason for that. Additionally macros are inserted not just outside of tags, but also within e.g. a style-attribute of a tag. The <h:macro .. />-syntax there breaks xml-conformance anyways.
* <h:macro call="param.i" /> just seems to be an overkill for what has been <code><% param.i %></code> before

[Still thinking; code snippets will follow]

  # HopObject/macros.js
  function count_macro(param) {
    var cnt = this.count();
    if (param[cnt.toString()]) {
    } else if (param["n"]) {
    } else {

  function loop_macro(param) {
    if (param["default"]) param["default"] = this.renderSkinAsString(createSkin(param["default"]));
    if (param["prefix"]) param["prefix"] = this.renderSkinAsString(createSkin(param["prefix"]));
    if (param["suffix"]) param["suffix"] = this.renderSkinAsString(createSkin(param["suffix"]));
    for (var i=0; i<this.count(); i++) {
      var obj = this.get(i);
      var skinParam = {};
      skinParam.cnt = i;
      if (param.alternate) skinParam.alternateCnt = i % param.alternate;
      if (param["body"]) {
        obj.renderSkinAsString(createSkin(param["body"]), skinParam);
      } else {
        // render separate skin
        obj.renderSkin(param["skin"] || "listitem", skinParam);

  function msg_macro(param) {

  # Global/functions.js
  function getText(id) {
    return str;

  <h1><hc:this.msg id="site.topics.header">All topics</hc:this.msg></h1>
    <ha:0><hc:this.msg id="site.topics.noTopics">No topics to display.</hc:this.msg></ha:0>
    <ha:1><hc:this.msg id="site.topics.oneTopic">This site has just one topic.</hc:this.msg></ha:1>
    <ha:n><hc:this.msg id="site.topics.moreTopics">This site has <hc:this.count /> topics.</hc:this.msg></ha:n>
  <hc:site.loop alternate="2">
        <th><hc:this.msg id="site.topics.tableHead.topic">Topic</hc:this.msg></th>
        <th><hc:this.msg id="site.topics.tableHead.numberOfStories">Number of Stories</hc:this.msg></th>
      <tr class="row<hc:param.alternateCnt />">
        <td><hc:topic.name /></td>
        <td><hc:topic.count /></td>