1 package com.jme3.font; 2 3 import com.jme3.math.ColorRGBA; 4 import java.util.LinkedList; 5 import java.util.regex.Matcher; 6 import java.util.regex.Pattern; 7 8 /** 9 * Contains the color information tagged in a text string 10 * Format: \#rgb# 11 * \#rgba# 12 * \#rrggbb# 13 * \#rrggbbaa# 14 * @author YongHoon 15 */ 16 class ColorTags { 17 private static final Pattern colorPattern = Pattern.compile("\\\\#([0-9a-fA-F]{8})#|\\\\#([0-9a-fA-F]{6})#|" + 18 "\\\\#([0-9a-fA-F]{4})#|\\\\#([0-9a-fA-F]{3})#"); 19 private LinkedList<Range> colors = new LinkedList<Range>(); 20 private String text; 21 ColorTags()22 ColorTags() { } 23 ColorTags(String seq)24 ColorTags(String seq) { 25 setText(seq); 26 } 27 28 /** 29 * @return text without color tags 30 */ getPlainText()31 String getPlainText() { 32 return text; 33 } 34 getTags()35 LinkedList<Range> getTags() { 36 return colors; 37 } 38 setText(final String charSeq)39 void setText(final String charSeq) { 40 colors.clear(); 41 if (charSeq == null) { 42 return; 43 } 44 Matcher m = colorPattern.matcher(charSeq); 45 if (m.find()) { 46 StringBuilder builder = new StringBuilder(charSeq.length()-7); 47 int startIndex = 0; 48 do { 49 String colorStr = null; 50 for (int i = 1; i <= 4 && colorStr==null; i++) { 51 colorStr = m.group(i); 52 } 53 builder.append(charSeq.subSequence(startIndex, m.start())); 54 Range range = new Range(builder.length(), colorStr); 55 startIndex = m.end(); 56 colors.add(range); 57 } while (m.find()); 58 builder.append(charSeq.subSequence(startIndex, charSeq.length())); 59 text = builder.toString(); 60 } else { 61 text = charSeq; 62 } 63 } 64 65 class Range { 66 int start; 67 ColorRGBA color; Range(int start, String colorStr)68 Range(int start, String colorStr) { 69 this.start = start; 70 this.color = new ColorRGBA(); 71 if (colorStr.length() >= 6) { 72 color.set(Integer.parseInt(colorStr.subSequence(0,2).toString(), 16) / 255f, 73 Integer.parseInt(colorStr.subSequence(2,4).toString(), 16) / 255f, 74 Integer.parseInt(colorStr.subSequence(4,6).toString(), 16) / 255f, 75 1); 76 if (colorStr.length() == 8) { 77 color.a = Integer.parseInt(colorStr.subSequence(6,8).toString(), 16) / 255f; 78 } 79 } else { 80 color.set(Integer.parseInt(Character.toString(colorStr.charAt(0)), 16) / 15f, 81 Integer.parseInt(Character.toString(colorStr.charAt(1)), 16) / 15f, 82 Integer.parseInt(Character.toString(colorStr.charAt(2)), 16) / 15f, 83 1); 84 if (colorStr.length() == 4) { 85 color.a = Integer.parseInt(Character.toString(colorStr.charAt(3)), 16) / 15f; 86 } 87 } 88 89 } 90 } 91 } 92