public void add(PatternBasedElement element) { elementPattern = null; elements.add(element); if (groups.peek().count++ > 0) { patternBuffer.append('|'); } ++patternGroup; patternBuffer.append('('); patternBuffer.append(element.getPattern(patternGroup)); patternBuffer.append(')'); elementGroup.add(patternGroup); patternGroup += element.getPatternGroupCount(); }
public PatternBasedElementProcessor findPatternBasedElement(String lineText, int offset) { Matcher matcher = getPattern().matcher(lineText); if (offset > 0) { matcher.region(offset, lineText.length()); } if (matcher.find()) { int size = elementGroup.size(); for (int x = 0; x < size; ++x) { int group = elementGroup.get(x); String value = matcher.group(group); if (value != null) { PatternBasedElement element = elements.get(x); PatternBasedElementProcessor processor = element.newProcessor(); processor.setLineStartOffset(matcher.start()); processor.setLineEndOffset(matcher.end()); processor.setGroup(0, matcher.group(0), matcher.start(0), matcher.end(0)); for (int y = 0; y < element.getPatternGroupCount(); ++y) { final int groupIndex = group + y + 1; processor.setGroup(y + 1, matcher.group(groupIndex), matcher.start(groupIndex), matcher.end(groupIndex)); } return processor; } } throw new IllegalStateException(); } else { return null; } }
@Override public MarkupLanguageConfiguration clone() { try { MarkupLanguageConfiguration copy = (MarkupLanguageConfiguration) super.clone(); copy.blocks = new ArrayList<Block>(blocks.size()); for (Block block : blocks) { copy.blocks.add(block.clone()); } copy.phraseModifiers = new ArrayList<PatternBasedElement>(phraseModifiers.size()); for (PatternBasedElement element : phraseModifiers) { copy.phraseModifiers.add(element.clone()); } copy.tokens = new ArrayList<PatternBasedElement>(tokens.size()); for (PatternBasedElement element : tokens) { copy.tokens.add(element.clone()); } return copy; } catch (CloneNotSupportedException e) { throw new IllegalStateException(e); } }