Markup.java
上传用户:szyujian
上传日期:2016-09-20
资源大小:320k
文件大小:4k
源码类别:

android开发

开发平台:

C/C++

  1. /*
  2.  * Copyright (C) 2008 Esmertec AG.
  3.  * Copyright (C) 2008 The Android Open Source Project
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *      http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package com.android.im.app;
  18. import com.android.im.plugin.BrandingResourceIDs;
  19. import android.graphics.drawable.Drawable;
  20. import android.text.Spannable;
  21. import android.text.SpannableString;
  22. import android.text.style.ImageSpan;
  23. import android.text.util.Linkify;
  24. public class Markup {
  25.     private BrandingResources mRes;
  26.     private IntTrie mSmileys;
  27.     public Markup(BrandingResources res) {
  28.         mRes = res;
  29.         mSmileys = new IntTrie(
  30.                 res.getStringArray(BrandingResourceIDs.STRING_ARRAY_SMILEY_TEXTS), res.getSmileyIcons());
  31.     }
  32.     public final CharSequence markup(CharSequence text) {
  33.         SpannableString result;
  34.         if (text instanceof SpannableString) {
  35.             result = (SpannableString) text;
  36.         } else {
  37.             result = new SpannableString(text);
  38.         }
  39.         Linkify.addLinks(result, Linkify.ALL);
  40.         applyEmoticons(result);
  41.         return result;
  42.     }
  43.     public final CharSequence applyEmoticons(CharSequence text) {
  44.         int offset = 0;
  45.         final int len = text.length();
  46.         SpannableString result = null;
  47.         while (offset < len) {
  48.             int index = offset;
  49.             IntTrie.Node n = mSmileys.getNode(text.charAt(index++));
  50.             int candidate = 0;
  51.             int lastMatchEnd = -1;
  52.             //  Search the trie until we stop matching
  53.             while (n != null) {
  54.                 //  Record the value and position of the longest match
  55.                 if (n.mValue != 0) {
  56.                     candidate = n.mValue;
  57.                     lastMatchEnd = index;
  58.                 }
  59.                 //  Let's not run off the end of the input
  60.                 if (index >= len) {
  61.                     break;
  62.                 }
  63.                 n = n.getNode(text.charAt(index++));
  64.             }
  65.             //  If we matched a smiley, apply its image over the text
  66.             if (candidate != 0) {
  67.                 //  Lazy-convert the result text to a SpannableString if we have to
  68.                 if (result == null) {
  69.                     if (text instanceof SpannableString) {
  70.                         result = (SpannableString) text;
  71.                     } else {
  72.                         result = new SpannableString(text);
  73.                         text = result;
  74.                     }
  75.                 }
  76.                 Drawable smiley = mRes.getSmileyIcon(candidate);
  77.                 smiley.setBounds(0, 0, smiley.getIntrinsicWidth(), smiley.getIntrinsicHeight());
  78.                 result.setSpan(new ImageSpan(smiley),
  79.                     offset, lastMatchEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  80.                 candidate = 0;
  81.             }
  82.             //  if there was a match, start searching for the next one after it
  83.             //  if no match, start at the next character
  84.             if (lastMatchEnd != -1) {
  85.                 offset = lastMatchEnd;
  86.                 lastMatchEnd = -1;
  87.             } else {
  88.                 offset++;
  89.             }
  90.         }
  91.         //  If there were no modifications, return the original string
  92.         if (result == null) {
  93.             return text;
  94.         }
  95.         return result;
  96.     }
  97. }