Converting colors between hex #RRGGBB and rgb()/rgba() using Velocity

SanfordWhiteman
Level 10 - Community Moderator
Level 10 - Community Moderator

As if the rules for HTML email weren’t complex enough, sometimes the exact same color needs to be represented in 2 different ways for different mail clients.

 

Rather than having 2 different variables for #A1B2C3 and rgba(161,178,195,.5) and remembering to keep them exactly in sync, you can populate just one and seamlessly convert it to the other using Velocity.

 

Here are two Velocimacros, #hexToRGB_v1 and #rgbToHex_v1:

#macro( hexToRGB_v1 $hexColor $opacity)
#set( $Integer = 0 )
#set( $hexValues = $hexColor.replaceAll("[${esc.h} ]","").split("(?<=\G..)") )
#set( $intValues = [] )
#foreach( $color in $hexValues )
#set( $void = $intValues.add( $Integer.parseInt($color,16) ) )
#end
#if( !$opacity )
#set( $rgb = "rgb(" + $display.list($intValues,",") + ")" )
${rgb}##
#else
#set( $rgba = "rgba(" + $display.list($intValues,",") + "," + $opacity + ")" )
${rgba}##
#end
#end

 

#macro( rgbToHex_v1 $rgbColor )
#set( $intValues = $rgbaColor.replaceAll("(?i)[rgba() ]","").split(",") )
#set( $hexValues = [] )
#foreach( $color in $intValues )
#if( $foreach.index > 2 )#break#end
#set( $void = $hexValues.add( $display.printf("%02X",$convert.toNumber($color).intValue()) ) )
#end
#set( $hex = $esc.h + $display.list($hexValues,"") )
${hex}##
#end

 

Sample usage:

#set( $hexColor= ${esc.h} + "A1B2C3" )
#hexToRGB_v1( $hexColor ) ## prints rgb(161,178,195)

#set( $hexColor= ${esc.h} + "A1B2C3" )
#hexToRGB_v1( $hexColor ".5" ) ## prints rgba(161,178,195,.5)

#set( $rgbaColor = "rgba(161,178,195)" )
#rgbToHex_v1( $rgbaColor ) ## prints #A1B2C3

 

Both macros expect valid input (that is, if you accidentally pass %A!B^@3 instead of #A1B2C3, that’s on you!).

 

And #rgbToHex_v1 accepts either rgb() or rgba() as input, though it only outputs #RRGGBB (support for #RRGGBBAA is nonexistent in email anyway).

 

Enjoy!

105
0