/*=============================================================================# # Copyright (c) 2015-2016 David Green and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # # Contributors: # David Green - initial API and implementation in Mylyn # Stephan Wahlbrink (WalWare.de) - revised API and implementation #=============================================================================*/ package de.walware.docmlet.wikitext.internal.commonmark.core; import static com.google.common.base.Preconditions.checkNotNull; import org.eclipse.mylyn.wikitext.core.parser.Locator; import de.walware.jcommons.collections.ImList; import de.walware.docmlet.wikitext.internal.commonmark.core.inlines.Inline; public class CommonmarkLocator implements Locator { private int lineNumber; private int lineOffset; private int lineLength; private int lineSegmentStartOffset; private int lineSegmentEndOffset; public CommonmarkLocator() { } public void setLine(final Line line) { checkNotNull(line); this.lineNumber= line.getLineNumber() + 1; this.lineOffset= line.getOffset(); this.lineLength= line.getLength(); this.lineSegmentStartOffset= 0; this.lineSegmentEndOffset= this.lineLength; } public void setBlockBegin(final SourceBlockItem<?> blockItem) { final ImList<Line> lines= blockItem.getLines(); setLine(lines.get(0)); } public void setBlockEnd(final SourceBlockItem<?> blockItem) { final ImList<Line> lines= blockItem.getLines(); final Line lastLine= lines.get(lines.size() - 1); this.lineNumber= lastLine.getLineNumber(); this.lineOffset= lastLine.getOffset() + lastLine.getLength(); this.lineLength= 0; this.lineSegmentStartOffset= 0; this.lineSegmentEndOffset= 0; } public void setInline(final Inline inline) { final Line line= inline.getLine(); this.lineNumber= line.getLineNumber() + 1; this.lineOffset= line.getOffset(); this.lineLength= line.getText().length(); this.lineSegmentStartOffset= inline.getOffset() - this.lineOffset; this.lineSegmentEndOffset= this.lineSegmentStartOffset + inline.getLength(); } @Override public int getLineNumber() { return this.lineNumber; } @Override public int getLineDocumentOffset() { return this.lineOffset; } @Override public int getDocumentOffset() { return getLineDocumentOffset() + getLineCharacterOffset(); } @Override public int getLineLength() { return this.lineLength; } @Override public int getLineCharacterOffset() { return this.lineSegmentStartOffset; } @Override public int getLineSegmentEndOffset() { return this.lineSegmentEndOffset; } @Override public String toString() { return com.google.common.base.Objects.toStringHelper(Locator.class) .add("lineNumber", this.lineNumber) .add("lineDocumentOffset", this.lineOffset) .add("lineLength", this.lineLength) .add("lineCharacterOffset", this.lineSegmentStartOffset) .add("lineSegmentEndOffset", this.lineSegmentEndOffset) .toString(); } }