Date of release: 2006-06-23

This release, compared to 2.3.7 RC1, contains new operators for handling null/missing variables, , the substring built-in, and some more bugfixes. Note that 2.3.7 RC1 has a long change log, so you may want to read that too.

Changes on the Java side

  • The seq_contains built-in now handles TemplateCollectionModel-s as well.

  • Bug fixed: In 2.3.7 RC1 FreemarkerServlet has always died with NullPointerException during initialization.

Changes on the FTL side

  • 3 new operators were added for terser missing variable handling. These operators make the default, exists and if_exists built-ins deprecated. (The parser doesn't issue any warning messages when you use deprecated built-ins, and they are still working.):

    • exp1!exp2 is near equivalent with exp1?default(exp2), also (exp1)!exp2 is near equivalent with (exp1)?default(exp2). The only difference is that this new operator doesn't evaluate the exp2 when the default value is not needed.

    • exp1! is similar to exp1?if_exists, also (exp1)! is similar to (exp1)?if_exists. The difference is that with this new operator the default value is an empty string and an empty list and empty hash at the same time (multi-type variable), while with if_exists the default value was an empty string and an empty list and empty hash and boolean false and a transform that does nothing and ignores all parameters at the same time.

    • exp1?? is equivalent with exp1?exists, also (exp1)?? is equivalent with with (exp1)?exists.

  • New built-in: exp?substring(from, toExclusive), also callable as exp?substring(from). Getting substrings was possible for a long time like myString[from..toInclusive] and myString[from..], but myString?substring(from, toExclusive) and myString?substring(from) has the advantage that it has an exclusive end, which is more practical. (Edit: Since 2.3.21 ranges are the preferred way again, as it has myString[from..<toExclusive].) Sequence (list) slices still has to be get with the old syntax, since substring only applies to strings. Please note that the "to" parameter is 1 greater with this new builtin, as it is an exclusive index. Further difference is that the substring built-in requires that the "from" index is less than or equal to the "to" index. So 0 length substrings are possible now, but not reversed substrings.

  • Bug fixed: [1487694] malfunction when the recover directive has no nested content