use of com.vladsch.flexmark.util.sequence.BasedSequence in project flexmark-java by vsch.
the class EscapedCharacterNodePostProcessor method process.
@Override
public void process(NodeTracker state, Node node) {
BasedSequence original = node.getChars();
ReplacedTextMapper textMapper = new ReplacedTextMapper(original);
BasedSequence literal = Escaping.unescape(original, textMapper);
int lastEscaped = 0;
boolean wrapInTextBase = !(node.getParent() instanceof TextBase);
TextBase textBase = wrapInTextBase ? null : (TextBase) node.getParent();
ArrayList<ReplacedTextRegion> replacedRegions = textMapper.getRegions();
for (ReplacedTextRegion region : replacedRegions) {
int startOffset = region.getOriginalRange().getStart();
int endOffset = region.getOriginalRange().getEnd();
if (original.charAt(startOffset) == '\\' && region.getReplacedRange().length() == 1 && // fix for #19, ArrayIndexOutOfBounds while parsing markdown with backslash as last character of text block
startOffset + 1 < original.length()) {
if (wrapInTextBase) {
wrapInTextBase = false;
textBase = new TextBase(original);
node.insertBefore(textBase);
state.nodeAdded(textBase);
}
if (startOffset != lastEscaped) {
if (startOffset > original.length() || lastEscaped > original.length()) {
int tmp = 0;
}
BasedSequence escapedChars = original.subSequence(lastEscaped, startOffset);
Node node1 = new Text(escapedChars);
textBase.appendChild(node1);
state.nodeAdded(node1);
}
BasedSequence origToDecorateText = original.subSequence(startOffset, endOffset);
BasedSequence text = origToDecorateText.subSequence(1);
EscapedCharacter decorationNode = new EscapedCharacter(origToDecorateText.subSequence(0, 1), text);
textBase.appendChild(decorationNode);
// Text undecoratedTextNode = new Text(origToDecorateText);
// decorationNode.appendChild(undecoratedTextNode);
// state.nodeAddedWithChildren(decorationNode);
state.nodeAdded(decorationNode);
lastEscaped = endOffset;
}
}
if (lastEscaped > 0) {
if (lastEscaped != original.length()) {
BasedSequence escapedChars = original.subSequence(lastEscaped, original.length());
Node node1 = new Text(escapedChars);
textBase.appendChild(node1);
state.nodeAdded(node1);
}
node.unlink();
state.nodeRemoved(node);
}
}
use of com.vladsch.flexmark.util.sequence.BasedSequence in project flexmark-java by vsch.
the class IParseBase method parseReader.
@Override
public Node parseReader(Reader input) throws IOException {
BufferedReader bufferedReader;
if (input instanceof BufferedReader) {
bufferedReader = (BufferedReader) input;
} else {
bufferedReader = new BufferedReader(input);
}
StringBuilder file = new StringBuilder();
char[] buffer = new char[16384];
while (true) {
int charsRead = bufferedReader.read(buffer);
file.append(buffer, 0, charsRead);
if (charsRead < buffer.length)
break;
}
BasedSequence source = CharSubSequence.of(file.toString());
return parse(source);
}
use of com.vladsch.flexmark.util.sequence.BasedSequence in project flexmark-java by vsch.
the class Document method getLineNumber.
public int getLineNumber(int offset) {
if (lineSegments == EMPTY_LIST) {
BasedSequence preText = getChars().baseSubSequence(0, Utils.maxLimit(offset, getChars().length()));
if (preText.isEmpty())
return 0;
int lineNumber = 0;
int nextLineEnd = preText.endOfLineAnyEOL(0);
final int length = preText.length();
while (nextLineEnd < length) {
lineNumber++;
nextLineEnd = preText.endOfLineAnyEOL(nextLineEnd + 1);
}
return lineNumber;
} else {
final int iMax = lineSegments.size();
for (int i = 0; i < iMax; i++) {
if (offset < lineSegments.get(i).getEndOffset()) {
return i;
}
}
return iMax;
}
}
use of com.vladsch.flexmark.util.sequence.BasedSequence in project flexmark-java by vsch.
the class Node method setCharsFromContent.
public void setCharsFromContent() {
BasedSequence[] segments = getSegments();
BasedSequence spanningChars = null;
if (segments.length > 0) {
BasedSequence leadSegment = getLeadSegment(segments);
BasedSequence trailSegment = getTrailSegment(segments);
if (firstChild == null || lastChild == null) {
BasedSequence[] sequences = new BasedSequence[] { leadSegment, trailSegment };
spanningChars = spanningChars(sequences);
} else {
BasedSequence[] sequences = new BasedSequence[] { leadSegment, trailSegment, firstChild.chars, lastChild.chars };
spanningChars = spanningChars(sequences);
}
} else if (firstChild != null && lastChild != null) {
BasedSequence[] sequences = new BasedSequence[] { firstChild.chars, lastChild.chars };
spanningChars = spanningChars(sequences);
}
if (spanningChars != null) {
// see if these are greater than already assigned chars
if (chars.isNull()) {
setChars(spanningChars);
} else {
int start = Utils.min(chars.getStartOffset(), spanningChars.getStartOffset());
int end = Utils.max(chars.getEndOffset(), spanningChars.getEndOffset());
setChars(chars.baseSubSequence(start, end));
}
}
}
use of com.vladsch.flexmark.util.sequence.BasedSequence in project flexmark-java by vsch.
the class Node method spanningChars.
public static BasedSequence spanningChars(BasedSequence... segments) {
int startOffset = Integer.MAX_VALUE;
int endOffset = -1;
BasedSequence firstSequence = null;
BasedSequence lastSequence = null;
for (BasedSequence segment : segments) {
if (segment != null && segment != BasedSequence.NULL) {
if (startOffset > segment.getStartOffset()) {
startOffset = segment.getStartOffset();
firstSequence = segment;
}
if (endOffset <= segment.getEndOffset()) {
endOffset = segment.getEndOffset();
lastSequence = segment;
}
}
}
if (firstSequence != null && lastSequence != null) {
return firstSequence.baseSubSequence(firstSequence.getStartOffset(), lastSequence.getEndOffset());
} else {
return BasedSequence.NULL;
}
}
Aggregations