20 package net.sf.gridarta.textedit.textarea.tokenmarker;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.HashMap;
25 import java.util.Iterator;
27 import java.util.Map.Entry;
28 import java.util.regex.Pattern;
29 import javax.swing.text.Segment;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
46 private static final Map<String, Spec>
FIXED_SPECS =
new HashMap<>();
53 private static final Map<Pattern, Spec>
REGEX_SPECS =
new HashMap<>();
62 FIXED_SPECS.put(
"friendship",
new Spec(
Token.
KEYWORD1,
new Parameter(
"group",
Token.
KEYWORD2,
ParameterType.
STRING_INTEGER),
new Parameter(
"name",
Token.
KEYWORD2,
ParameterType.
STRING_INTEGER),
new Parameter(
"player",
Token.
KEYWORD2,
ParameterType.
INTEGER),
new Parameter(
"race",
Token.
KEYWORD2,
ParameterType.
STRING_INTEGER)));
82 final char[] array = line.array;
83 int offset = line.offset;
84 final int end = line.count + offset;
87 }
else if (array[offset] ==
'#') {
90 }
else if (array[offset] ==
' ') {
100 final Collection<Integer> segments =
new ArrayList<>();
102 while (offset < end) {
103 final int commandStart = offset;
104 while (offset < end && array[offset] !=
' ') {
107 segments.add(offset - commandStart);
109 final int spacesStart = offset;
110 while (offset < end && array[offset] ==
' ') {
113 segments.add(offset - spacesStart);
117 final Iterator<Integer> it = segments.iterator();
118 int offset2 = line.offset;
120 final int commandLength = it.next();
121 final String command =
new String(array, offset2, commandLength);
124 offset2 += commandLength;
126 final int spacesLength1 = it.next();
128 offset2 += spacesLength1;
130 while (it.hasNext()) {
131 final int parameterLength = it.next();
133 if (tmp.length == 2) {
134 final String parameterString = tmp[0];
135 final String valueString = tmp[1];
138 final boolean parameterValid = parameter !=
null;
147 offset2 += parameterLength;
149 final int spacesLength2 = it.next();
151 offset2 += spacesLength2;
167 if (fixedSpec !=
null) {
171 for (
final Entry<Pattern, Spec> entry :
REGEX_SPECS.entrySet()) {
172 if (entry.getKey().matcher(command).matches()) {
173 return entry.getValue();