/** * If we need to split a range for annotation, we want to keep the map of offset ranges usable. * Note that the caller has to revalidate or maintain any indices it has grabbed for ranges after * the one we are splitting. Note that this does not insert the new text node into the parent * contents, the caller does that. * * @param range * @param splitPoint * @return */ public TextNode splitText(int rangePoint, int splitPoint) { assert splitPoint > 0; OffsetRange range = offsetRanges.get(rangePoint); assert splitPoint < range.getText().text().length(); TextNode newText = new TextNode(range.getText().text().substring(splitPoint), null); range.getText().text(range.getText().text().substring(0, splitPoint)); OffsetRange newRange = new OffsetRange(range.getStart() + splitPoint, range.getEnd(), newText); offsetRanges.add(rangePoint + 1, newRange); range.setEnd(splitPoint + range.getStart()); assert range.getText().text().length() == range.getEnd() - range.getStart(); return newText; }
public OffsetRange findOffsetRangeForOffset(int offset) { if (optimizedRangeListElement.offsetInRange(offset)) { return optimizedRangeListElement; } else if (offset > optimizedRangeListElement.getStart()) { while (optimizedRangeListElement.getStart() < offset && optimizedListPointer.hasNext()) { optimizedRangeListElement = optimizedListPointer.next(); if (optimizedRangeListElement.offsetInRange(offset)) { return optimizedRangeListElement; } } throw new RuntimeException("Offset " + offset + " beyond last range"); } else { // we don't expect to exercise this case. // has to be smaller, no? while (offset < optimizedRangeListElement.getStart() && optimizedListPointer.hasPrevious()) { optimizedRangeListElement = optimizedListPointer.previous(); if (optimizedRangeListElement.offsetInRange(offset)) { return optimizedRangeListElement; } } throw new RuntimeException("Offset " + offset + " before the first offset"); } }