17436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda/*
27436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda * Copyright (C) 2008 The Android Open Source Project
37436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda *
47436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda * Licensed under the Apache License, Version 2.0 (the "License");
57436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda * you may not use this file except in compliance with the License.
67436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda * You may obtain a copy of the License at
77436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda *
87436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda *      http://www.apache.org/licenses/LICENSE-2.0
97436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda *
107436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda * Unless required by applicable law or agreed to in writing, software
117436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda * distributed under the License is distributed on an "AS IS" BASIS,
127436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda * See the License for the specific language governing permissions and
147436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda * limitations under the License.
157436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda */
167436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda
177436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Predapackage com.android.email.mail.internet;
187436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda
197403a547384df0c3cb2cb7539d018a3b2029401dMihai Predaimport java.util.regex.Matcher;
207403a547384df0c3cb2cb7539d018a3b2029401dMihai Predaimport java.util.regex.Pattern;
217403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda
227436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Predapublic class EmailHtmlUtil {
237436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda
247403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda    // Regex that matches characters that have special meaning in HTML. '<', '>', '&' and
257403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda    // multiple continuous spaces.
267403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda    private static final Pattern PLAIN_TEXT_TO_ESCAPE = Pattern.compile("[<>&]| {2,}|\r?\n");
277403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda
287403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda    /**
297403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda     * Escape some special character as HTML escape sequence.
307403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda     *
317403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda     * @param text Text to be displayed using WebView.
327403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda     * @return Text correctly escaped.
337403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda     */
347403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda    public static String escapeCharacterToDisplay(String text) {
357403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda        Pattern pattern = PLAIN_TEXT_TO_ESCAPE;
367403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda        Matcher match = pattern.matcher(text);
377436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda
387403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda        if (match.find()) {
397403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda            StringBuilder out = new StringBuilder();
407403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda            int end = 0;
417403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda            do {
427403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                int start = match.start();
437403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                out.append(text.substring(end, start));
447403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                end = match.end();
457403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                int c = text.codePointAt(start);
467403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                if (c == ' ') {
477403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                    // Escape successive spaces into series of "&nbsp;".
487403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                    for (int i = 1, n = end - start; i < n; ++i) {
497403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                        out.append("&nbsp;");
507403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                    }
517403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                    out.append(' ');
527403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                } else if (c == '\r' || c == '\n') {
537403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                    out.append("<br>");
547403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                } else if (c == '<') {
557403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                    out.append("&lt;");
567403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                } else if (c == '>') {
577403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                    out.append("&gt;");
587403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                } else if (c == '&') {
597403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                    out.append("&amp;");
607403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda                }
617403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda            } while (match.find());
627403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda            out.append(text.substring(end));
637403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda            text = out.toString();
647403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda        }
657436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda        return text;
667436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda    }
677436601fae756e8bc1f916560a1c2d1f8ce576fcMihai Preda}
68