1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under
4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution,
5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html
6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: Strings.java,v 1.1.1.1 2004/05/09 16:57:55 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.util;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.File;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException;
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.ArrayList;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.HashSet;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.List;
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Set;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.StringTokenizer;
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectabstract class Strings
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static final String WHITE_SPACE = " \t\r\n";
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    //TODO: add duplicate removal
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String toListForm (final String [] strings, final char delimiter)
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (strings == null) return null;
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (strings.length == 0) return "";
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final StringBuffer s = new StringBuffer ();
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0, iLimit = strings.length; i < iLimit; ++ i)
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (i != 0) s.append (delimiter);
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            s.append (strings [i]);
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return s.toString ();
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String [] removeDuplicates (final String [] strings, final boolean removeNull)
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (strings == null) return strings;
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int length = strings.length;
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (length == 0) return strings;
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final Set /* String */ _strings = new HashSet (length);
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final List /* String */ _result = new ArrayList (length);
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < length; ++ i)
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String s = strings [i];
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (removeNull && (s == null)) continue;
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (_strings.add (s)) _result.add (s);
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int resultLength = _result.size ();
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (resultLength == length)
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return strings;
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String [] result = new String [resultLength];
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            _result.toArray (result);
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return result;
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Also removes duplicates.
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param strings
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param delimiters
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param removeNull
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @return
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String [] merge (final String [] strings, final String delimiters, final boolean removeNull)
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (strings == null) return strings;
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int length = strings.length;
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (length == 0) return strings;
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((delimiters == null) || (delimiters.length () == 0))
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new IllegalArgumentException ("null/empty input: delimiters");
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final Set /* String */ _strings = new HashSet (length);
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final List /* String */ _result = new ArrayList (length);
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < length; ++ i)
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String s = strings [i];
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (removeNull && (s == null)) continue;
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final StringTokenizer tokenizer = new StringTokenizer (s, delimiters);
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            while (tokenizer.hasMoreTokens ())
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final String ss = tokenizer.nextToken ();
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (_strings.add (ss)) _result.add (ss);
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final String [] result = new String [_result.size ()];
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        _result.toArray (result);
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return result;
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Removes duplicates.
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param delimiters
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param processAtFiles
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @return
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @throws IOException
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String [] mergeAT (final String [] strings, final String delimiters, final boolean processAtFiles)
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (! processAtFiles)
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return merge (strings, delimiters, true);
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (strings == null) return strings;
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final int length = strings.length;
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (length == 0) return strings;
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if ((delimiters == null) || (delimiters.length () == 0))
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                throw new IllegalArgumentException ("null/empty input: delimiters");
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final Set /* String */ _strings = new HashSet (length);
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final List /* String */ _result = new ArrayList (length);
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (int i = 0; i < length; ++ i)
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final String s = strings [i];
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (s == null) continue;
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final StringTokenizer tokenizer = new StringTokenizer (s, delimiters);
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                while (tokenizer.hasMoreTokens ())
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final String ss = tokenizer.nextToken ();
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (ss.startsWith ("@"))
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final String [] fileList = Files.readFileList (new File (ss.substring (1)));
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        for (int j = 0; j < fileList.length; ++ j)
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        {
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            final String sss = fileList [j];
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            if (_strings.add (sss)) _result.add (sss);
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        }
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    else if (_strings.add (ss)) _result.add (ss);
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String [] result = new String [_result.size ()];
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            _result.toArray (result);
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return result;
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * HTML attribute values can be quoted using either double or single quotes.
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Depending on the type of quote used, the other kind can be used unescaped
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * within the attribute value. This method assumes that only double quotes
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * are used for delimiting, hence this is the only kind that is escaped.
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static void HTMLEscape (final String s, final StringBuffer append)
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (s == null) throw new IllegalArgumentException ("null input: s");
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (append == null) throw new IllegalArgumentException ("null input: append");
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final char [] chars;
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (USE_GET_CHARS) chars = s.toCharArray ();
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0, iLimit = s.length (); i < iLimit; ++ i)
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final char c = USE_GET_CHARS ? chars [i] : s.charAt (i);
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            switch (c)
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case '<':
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append ("&lt;");
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case '>':
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append ("&gt;");
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case '"':
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append ("&#34;");
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case '&':
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append ("&amp;");
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                default:
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append (c);
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            } // end of switch
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Same as {@link #HTMLEscape(String, StringBuffer)} but also replaces spaces
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * with "&nbsp;"'s, which is handy for escaping code.
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static void HTMLEscapeNB (final String s, final StringBuffer append)
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (s == null) throw new IllegalArgumentException ("null input: s");
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (append == null) throw new IllegalArgumentException ("null input: append");
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final char [] chars;
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (USE_GET_CHARS) chars = s.toCharArray ();
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0, iLimit = s.length (); i < iLimit; ++ i)
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final char c = USE_GET_CHARS ? chars [i] : s.charAt (i);
232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            switch (c)
234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case ' ':
236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append ('\u00A0'); // don't use "&#160;": a waste of space
237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case '\t':
240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append ("\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0"); // TODO: define a prop for this
241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//                case '-':
244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//                    append.append ((char) 0x8209);
245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//                    break;
246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case '<':
248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append ("&lt;");
249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case '>':
252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append ("&gt;");
253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case '"':
256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append ("&#34;");
257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                case '&':
260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append ("&amp;");
261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    break;
262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                default:
264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    append.append (c);
265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            } // end of switch
267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String HTMLEscape (final String s)
271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final StringBuffer buf = new StringBuffer ();
273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        HTMLEscape (s, buf);
274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return buf.toString ();
276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static String HTMLEscapeSP (final String s)
279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final StringBuffer buf = new StringBuffer ();
281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        HTMLEscapeNB (s, buf);
282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return buf.toString ();
284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private Strings () {} // prevent subclassing
294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static final boolean USE_GET_CHARS = true;
297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------