You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@velocity.apache.org by "Geir Magnusson Jr." <ge...@optonline.net> on 2000/12/19 22:34:23 UTC

Re: EncodeXXX context tools [was Re: Rendering Velocity Templateswith Texen]

Jose Alberto Fernandez wrote:
> 
> It looks to me that this is related to interpolation.
> But I am not debugging it.
> 
> For what I saw in the code, Any literal containing "$" or "#" will get
> parsed if interpolation is ON. Did you tried turning interpolation OFF?

It will happen there, but it will happen other places.  It's a general
bug, not only in stringlits

> Jose Alberto
> 
> > -----Original Message-----
> > From: Christoph Reck [mailto:Christoph.Reck@dlr.de]
> > Sent: Tuesday, December 19, 2000 6:59 AM
> > To: velocity-user@jakarta.apache.org
> > Subject: EncodeXXX context tools [was Re: Rendering Velocity Templates
> > with Texen]
> >
> >
> > "Geir Magnusson Jr." wrote:
> > >
> > > Christoph Reck wrote:
> > > >
> > > > Yep, it does not work with Vel.
> > > > It does with WM (round instead of curlies).
> > > >
> > > > Well, this seems to be a devlish candidate for the parser tests...
> > > >
> > > > #set $D = "$"
> > > > is \$D == ${D}D OK?
> > >
> > > If you can type it, Vel should parse it!  That's the rule. :)
> >
> > Well it currently throuws a TokenMgrError: Lexical error at line 1,
> > column 2.  Encountered: <EOF> after : "".
> >
> > I saw you posted that you'll fix it.
> >
> > >
> > > Hey!  Where are your ( and ) in your #set() ?  Don't fill
> > your logs with
> > > deprecation messages! ;->
> >
> > Well; I've not yet moved to Vel, due to shortcomings/bugs...
> > Has the #set($foo = $somethingReturningNull) been fixed to
> > clear/remove
> > foo? Shall we allow #set($hashtable.KEY = "value") Shall I
> > provide the
> > patches? No votes to my proposals yet...
> >
> > >
> > > > :P Christoph
> > > >
> > > > P.S. I have a ContextTool with formEncode, formDecode,
> > encodeMarkup,
> > > >      and URLEncode. So I can do: #set $D =
> > $Context.formDecode("%24")
> > > >      :)
> > >
> > > That would be cool to have.  Wanna contribute it?
> >
> > Code is below, could/should be added to the VelocityFormatter.
> >
> > >
> > > (The parser will be fixed though :)
> >
> > Good
> >
> > >[snip]
> >
> > Some other methods are also included which go in the line of the
> > alternator...
> > --------------------------- cut here --------------------------
> >     /**
> >      * Translates a string into
> > <code>x-www-form-urlencoded</code> format.
> >      * This method is just a wrapper to java.net.URLEncoder.encode().
> >      *
> >      * @param str The string to encode.
> >      * @return The URL-encoded string.
> >      * @see java.net.URLEncoder
> >      */
> >     public static String URLEncode(String str)
> >     {
> >         if (str == null)
> >             return  null;
> >         return URLEncoder.encode(str);
> >     }
> >
> >     /**
> >      * Encode the characters &lt;, &gt;, &quot; and &amp to
> >      * &amp;lt;, &amp;gt;, &amp;quot, &amp;amp; respectively.
> >      * <code>&lt;input type="text"
> > value="$formater.encodeMarkup($anyText)"&gt;</code>
> >      *
> >      * @param text The string to encode.
> >      * @return The HTML encoded string.
> >      */
> >     public static String encodeMarkup(String text)
> >     {
> >         char[] array = text.toCharArray();
> >         StringBuffer buffer = new StringBuffer();
> >
> >         for (int i = 0; i < array.length; i++) {
> >             switch (array[i]) {
> >               case '<':
> >                 buffer.append("&lt;");
> >                 break;
> >               case'>':
> >                 buffer.append("&gt;");
> >                 break;
> >               case '&':
> >                 buffer.append("&amp;");
> >                 break;
> >               case '"':
> >                 buffer.append("&quot;");
> >                 break;
> >               default:
> >                 buffer.append(array[i]);
> >                 break;
> >             }
> >         }
> >
> >         return buffer.toString();
> >     }
> >
> >     /**
> >      * Encode space to + and any non alphanumeric character to %XX.
> >      * Taken from Apache Cocoon XSPUtil.
> >      *
> >      * @param text The string to encode.
> >      * @return The form encoded string.
> >      */
> >     public static String formEncode(String text) throws Exception
> >     {
> >         StringBuffer buffer = new StringBuffer();
> >
> >         char[] c = text.toCharArray();
> >         for (int i = 0; i < c.length; i++)
> >         {
> >             if (isAlphaNumeric(c[i]))
> >             {
> >                 buffer.append(c[i]);
> >             }
> >             else if (c[i] == ' ')
> >             {
> >                 buffer.append('+');
> >             }
> >             else
> >             {
> >                 buffer.append('%');
> >                 String hex = Integer.toHexString((byte)
> > c[i]).toUpperCase();
> >
> >                 if (hex.length() < 2)
> >                     buffer.append('0');
> >
> >                 buffer.append(hex);
> >             }
> >         }
> >
> >         return buffer.toString();
> >     }
> >
> >     /**
> >      * Decode space from + and %XX to its character from.
> >      * Taken from Apache Cocoon XSPUtil.
> >      *
> >      * @param text The string to decode.
> >      * @return The decoded string.
> >      */
> >     public static String formDecode(String s) throws Exception
> >     {
> >         StringBuffer sb = new StringBuffer();
> >         for(int i=0; i<s.length(); i++)
> >         {
> >             char c = s.charAt(i);
> >             switch (c)
> >             {
> >                 case '+':
> >                     sb.append(' ');
> >                     break;
> >                 case '%':
> >                     try
> >                     {
> >                         sb.append((char)Integer.parseInt(
> >                         s.substring(i+1,i+3),16));
> >                     }
> >                     catch (NumberFormatException e)
> >                     {
> >                         throw new IllegalArgumentException();
> >                     }
> >                     i += 2;
> >                     break;
> >                 default:
> >                     sb.append(c);
> >                 }
> >             }
> >
> >             // Undo conversion to external encoding
> >             String result = sb.toString();
> >             byte[] inputBytes = result.getBytes("8859_1");
> >             return new String(inputBytes);
> >     }
> >
> >     /**
> >      * Convenience function to check for alphanumeric characters.
> >      * Taken from Apache Cocoon XSPUtil.
> >      *
> >      * @param c The character to check.
> >      * @return true if it is [_A-Za-z0-9].
> >      */
> >     public static boolean isAlphaNumeric(char c)
> >     {
> >         return  c == '_' ||
> >                (c >= 'a' && c <= 'z') ||
> >                (c >= 'A' && c <= 'Z') ||
> >                (c >= '0' && c <= '9');
> >     }
> >
> >     /**
> >      * Encodes any non alphanumeric character from a string to make
> >      * it usable as a form variable. Any non alphanumeric is deleted
> >      * from the string and the following character is uppercased.
> >      * A following second non alphanumerics is changed to a '_'.
> >      * A string starting with a numeric is prefixed with a '_'. <p>
> >      * Example <code>1abc.def*.ghI.JKL</code> gets converted to
> >      * <code>_1abcDef_GhI_JKL</code>.
> >      *
> >      * @param text String to encode.
> >      * @return Filtered string.
> >      */
> >     public static String encodeToName(String text)
> >     {
> >         StringBuffer buffer = new StringBuffer( text.length() );
> >
> >         // ensure the string starts with and alpha character
> >         char c = text.charAt(0);
> >         if ( (c >= '0') && (c <= '9') )
> >             buffer.append('_');
> >
> >         boolean makeUppercase = false;
> >         for (int i = 0; i < text.length(); ++i)
> >         {
> >             c = text.charAt(i);
> >             if (isAlphaNumeric(c))
> >             {
> >                 if (makeUppercase)
> >                     buffer.append( text.substring(i,
> > i+1).toUpperCase() );
> >                 else
> >                     buffer.append(c);
> >                 makeUppercase = (c < 'A') || (c > 'Z');
> >             }
> >             else
> >             {
> >                 if (makeUppercase)
> >                     buffer.append('_');
> >                 // else deleted
> >                 makeUppercase = true;
> >             }
> >         }
> >
> >         return buffer.toString();
> >     }
> >
> >     /**
> >      * Convenience function to create an <code>java.lang.Vector</code>
> >      * within a template.
> >      *
> >      * @param size
> >      * @return An empty Vector.
> >      * @see java.lang.Vector
> >      */
> >     public static Vector newVector(int size)
> >     {
> >         return new Vector(size);
> >     }
> >
> >     /**
> >      * Convenience function to create an
> > <code>java.lang.Hashtable</code>
> >      * within a template.
> >      *
> >      * @param size The default hashsize (avoids the original
> > default of 101).
> >      * @return An empty Hashtable.
> >      * @see java.lang.Hashtable
> >      */
> >     public static Hashtable newHashtable(int size)
> >     {
> >         return new Hashtable(size);
> >     }
> >
> >     /**
> >      * Convenience function to create an array within a template.<br>
> >      * This can be used as a for-loop replacement:<code>
> >      * #foreach ($index in $formatter.newArray(10))
> >      *   ## do something N times or use $index
> >      * #end</code>
> >      *
> >      * @param size
> >      * @return An object array contining the numbers 0 till (size-1).
> >      */
> >     public static Object newArray(int size)
> >     {
> >         Object[] array = new Object[size];
> >         for (int i = 0; i < size; ++i)
> >         {
> >             array[i] = new Integer(i);
> >         }
> >     }
> >
> >     /**
> >      * Convenience function to access an element of an array
> >      *
> >      * @param index
> >      * @param array
> >      * @return Element at the specified array index.
> >      */
> >     public static Object getElement(int index, Object[] array)
> >     {
> >         return array[index];
> >     }
> >
> >     /**
> >      * Convenience function sort the elements of an array.
> >      * Needs JDK 1.2.
> >      *
> >      * @param array
> >      * @return The sorted array.
> >      */
> >     public static Object[] sort(Object[] array)
> >     {
> >         if ((array == null) || (array.length == 0))
> >           return array;
> >
> >         Object[] sorted = new Object[array.length];
> >         System.arraycopy(array, 0, sorted, 0, array.length);
> >         Arrays.sort(sorted);
> >
> >         return sorted;
> >     }
> >
> > --------------------------- cut here --------------------------
> >
> > :) Christoph
> >

-- 
Geir Magnusson Jr.                               geirm@optonline.com
Velocity : it's not just a good idea. It should be the law.
http://jakarta.apache.org/velocity