Just today I had a client -- who had just tested a fairly complex GSP -- ask to have text in a table data element wrap. He had tested it with a long string of characters with no spaces. He wanted:
asldfjas;fjasodfsaodjfsaodfdsadfa;ljlj
To show as:
asldfjas;fj
asodfsaod
jfsaodfdsa
dfa;ljlj
And not just the first 12 characters that fit in the td.
Quick solution: Hey buddy, use spaces and the browser will wrap for you.
Groovy solution: Insert thespaces for them.
I took the Groovy option. What I did was extend the String class in BootStrap to have a wrapAt method:
class BootStrap {
def init = { servletContext ->
String.metaClass.wrapAt = {width ->
matcher = (delegate =~ /\w{1,$width}/);
def that = ''
matcher.each {
that += "${it.trim()} "
}
return that
}
}
def destroy = {
}
}
Then, in my GSP (where the em width was 12) I added:
<td>${option.value.wrapAt(12)}</td>
I tested the code with the following:
String.metaClass.wrapAt = {width ->
println delegate
matcher = (delegate =~ /\w{1,$width}/);
def that = ''
matcher.each {
that += "${it.trim()} "
}
return that
}
def str = 'one two thetimehascomeforalgoodmentocometotheaidoftheircountry'
assert "one two thetimehas comeforalg oodmentoco metotheaid oftheircou ntry " == str.wrapAt(10)
Sure, not a perfect solution, but all the text the user keyed is viewable on the page (and the optional PDF that is generated from that page.) It looks like this:
one two
thetimehasco
meforalgoodm
entocometoth
eaidoftheirc
ountry
Also, it gave me a use for Groovy meta programming