FreeMarker only parse Camel format to Underline format - freemarker

When I receive some data from the back end, for example the data string 'AbcDef', does freemarker have some build-in function to parse the string to 'ABC_DEF'?? How can I do with the freemarker template language?

Like this:
<#function camelToDashed(s)>
<#return s
<#-- "fooBar" to "foo_bar": -->
?replace('([a-z])([A-Z])', '$1_$2', 'r')
<#-- "FOOBar" to "FOO_Bar": -->
?replace('([A-Z])([A-Z][a-z])', '$1_$2', 'r')
<#-- All of those to "FOO_BAR": -->
?upper_case
>
</#function>
${camelToDashed('AbcDef')}
Of course it can done without #function too, it's just easier to reuse it this way.

Related

Trying to generate a string that becomes a variable name in Freemarker or a "derived variable name"

I'm using a data-directive or list to pull in several values, of which, I don't know how many there will be, and I want to try and list through them, and create several variables in the list if you will.
<#list 1..10 as x>
<#-- the next line doesn't work, but what i'm trying to fix -->
<#assign .vars['VAR'+x?string] = rand(100) />
</#list>
But I can list them back out that way.
<#list 1..10 as x>
${.vars['VAR'+x?string]}
</#list>
The documentation for assign, says:
name: name of the variable. It is not expression. However, it can be
written as a string literal, which is useful if the variable name
contains reserved characters, for example <#assign "foo-bar" = 1>.
Note that this string literal does not expand interpolations (as
"${foo}").
Is there no way around this? Am I trying to do the impossible? Is there some way I can insert a derived name into the .vars... Hash is it?
A little more research that was close, but didn't get me there:
This prevoius question gives how to READ the derived variable, but I need to WRITE/CREATE the derived variable.
FreeMarker get variable value by concatenating another variable value
This prevoius question shows that I can use a string to assign a variable and re-iterates what we saw in the first link.
Variable name in Freemarker Template Language
As FreeMarker can't assign to elements of collections (but you can ?map(it -> ...) a collection to another), the only way is via ?interpret:
<#list 1..10 as x>
<#-- the next line doesn't work, but what i'm trying to fix -->
<#'<#assign VAR${x?c} = rand(100)>'?interpret />
</#list>
I wonder why do you need to assign to a dynamically named variables though, since reading dynamically named variables is also a pain, even if a lesser one.
Ultimately, I believe the correct way to phrase my solution was a sequence of hashes:
<#list 1..z_Coupon_Pet.NUM_COUPONS as x>
<#assign INSTORE_COUPON=call_coupon_from_table1() />
<#assign ONLINE_COUPON=call_coupon_from_table2() />
<#assign coupon_string_row= '{
"COUPON_NUM" : ${x},
"INSTORE" : "${INSTORE_COUPON?js_string}",
"ONLINE" : "${ONLINE_COUPON?js_string}"
}' />
<#if x==1>
<#assign coupon_hash_string = coupon_string_row />
<#else>
<#assign coupon_hash_string = coupon_hash_string + ',' + coupon_string_row />
</#if>
</#list>
</#if>
<#if coupon_hash_string?has_content>
<#assign coupon_hash=parsejson('[' + coupon_hash_string + ']') />
</#if>
We specifically avoid <#assign my_hash = my_hash + element /> because of this note in the documentation:
Note that hash concatenation is not to be used for many repeated concatenations, like for adding items to a hash inside a loop. While adding together hashes is fast and is constant time (independent of the size of the hashes added), the resulting hash is a bit slower to read than the hashes added together. Thus after tens... of additions the result can be impractically slow to read.

How do you call a function within a FreeMarker macro?

Is there a way to call a function within a Freemarker macro?
Example of what I am trying to do:
<#function foo>
<return "hello">
</#function>
<#macro fooMacro>
${foo()}
</#macro>
<#fooMacro> <#-- This doesn't work for me
"The "foo()" has evaluated to null or missing" -->
Similarly, is there a way to pass the output of a function into a param of a macro? Like:
<#macro fooMacro p1>
${p1}
</#macro>
<#fooMacro p1=foo()/> <!-- Also doesn't seem to work for me -->
Answer: both are possible, just change
<return "hello"> ==> <#return "hello">

Freemarker template string util that can create n number of characters or from a string?

is there a string util can can do something like this
<#assign junk="repeatMe"/>
${string.utils.repeat(junk,2)}
OUTPUT:
repeatMerepeatMe
You can do something like this:
<#assign junk = "repeatMe" />
<#list 0..1 as x>${junk}</#list>

Freemarker nested macros

How can I call nested macros as such?
<#replaceA-sToB-s>
<#replaceB-sToC-s Text/>
</#replaceA-sToB-s>
replaceB-sToC-s simply replaces any "B" with "C"
replaceA-sToB-s simply replaces any "A" with "B"
If you want to pass the result of replaceB-sToC-s macro to the replaceA-sToB-s then you have to use something like this:
<#assign str><#replaceB-sToC-s "abc" /></#assign>
<#replaceA-sToB-s str />
Like this:
<#macro replaceAsToBs>
<#local captured><#nested></#local>
${captured?replace('a', 'b')}<#t>
</#macro>
<#macro replaceBsToCs text>
${text?replace('b', 'c')}<#t>
</#macro>
(The #t-s are only there to remove the extra whitespace around the ${...} parts.) And then you call it like:
<#replaceAsToBs>
<#replaceBsToCs "abcd"/>
</#replaceAsToBs>

freemarker how to use split in string which is readed with include

<#assign reasonValue="xxx.ftl">
and I call it like:
<#include "${reasonValue}">
and I get output like:
Rejected - Something
how can I now use split on this ouput because I would like to get just Something as output
I tried:
<#list "${reasonValue}"?split("-") as sValue>
${sValue}
</#list>
but problem is that instead of real value i get name of ftl file...
Assign output of include to some variable and then use split on this variable.
<#assign xx>
<#include reasonValue>
</#assign>
<#list xx?split("-") as sValue>
${sValue}
</#list>
If you need to show only part of the string after "-" then use substring and index_of.
${xx?substring(xx?index_of("-") + 2)}

Resources