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 " ". 487403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda for (int i = 1, n = end - start; i < n; ++i) { 497403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda out.append(" "); 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("<"); 567403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda } else if (c == '>') { 577403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda out.append(">"); 587403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda } else if (c == '&') { 597403a547384df0c3cb2cb7539d018a3b2029401dMihai Preda out.append("&"); 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