001 // Copyright 2008 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry5;
016
017 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
018
019 import java.util.Collections;
020 import java.util.List;
021
022 /**
023 * Utility methods related to generating markup.
024 */
025 public class MarkupUtils
026 {
027 static final char APOS = '\'';
028 static final char QUOTE = '"';
029 static final char SLASH = '\\';
030
031 /**
032 * Quotes the provided value as a JavaScript string literal. The input value is surrounded by single quotes and any
033 * interior backslash, single or double quotes are escaped (a preceding backslash is added).
034 *
035 * @param text
036 * @return quoted text
037 */
038 public static String quote(String text)
039 {
040 StringBuilder result = new StringBuilder(text.length() * 2);
041
042 result.append(APOS);
043
044 for (char ch : text.toCharArray())
045 {
046 switch (ch)
047 {
048 case APOS:
049 case QUOTE:
050 case SLASH:
051
052 result.append(SLASH);
053
054 default:
055 result.append(ch);
056 break;
057 }
058 }
059
060 result.append(APOS);
061
062 return result.toString();
063 }
064
065 /**
066 * Joins together several strings, sorting them alphabetically and separating them with spaces. This is often used
067 * when setting the CSS class attribute of an element.
068 */
069 public static String join(String... values)
070 {
071 List<String> list = CollectionFactory.newList(values);
072
073 return sortAndJoin(list);
074 }
075
076 /**
077 * Joins together several strings, sorting them alphabetically and separating them with spaces. This is often used
078 * when setting the CSS class attribute of an element.
079 */
080 public static String join(List<String> values)
081 {
082 List<String> copy = CollectionFactory.newList(values);
083
084 return sortAndJoin(copy);
085 }
086
087 static String sortAndJoin(List<String> list)
088 {
089 Collections.sort(list);
090
091 StringBuilder builder = new StringBuilder(10 * list.size());
092
093 String sep = "";
094
095 for (String name : list)
096 {
097 builder.append(sep);
098 builder.append(name);
099
100 sep = " ";
101 }
102
103 return builder.toString();
104 }
105 }