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