package flow.netbeans.markdown.utils;
import flow.netbeans.markdown.highlighter.MarkdownTokenId;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.StyledDocument;
import org.netbeans.api.lexer.TokenHierarchy;
import org.netbeans.api.lexer.TokenSequence;
import org.openide.text.NbDocument;
import org.openide.util.Exceptions;
/**
*
* @author junichi11
*/
public final class MarkdownDocUtil {
private MarkdownDocUtil() {
}
/**
* Get TokenSequence.
*
* @param document
* @return TokenSequence
*/
public static TokenSequence<MarkdownTokenId> getTokenSequence(Document document) {
TokenHierarchy<Document> tokenHierarchy = TokenHierarchy.get(document);
AbstractDocument ad = (AbstractDocument) document;
ad.readLock();
TokenSequence<MarkdownTokenId> ts;
try {
ts = tokenHierarchy.tokenSequence(MarkdownTokenId.language());
} finally {
ad.readUnlock();
}
return ts;
}
/**
* Get indent string for caret offset position.
*
* @param document document
* @param caretOffset caret offset
* @return indent string if indent exists, empty string otherwise
*/
public static String getIndentString(Document document, int caretOffset) {
String indentString = ""; // NOI18N
if (document instanceof StyledDocument) {
StyledDocument sd = (StyledDocument) document;
int lineNumber = NbDocument.findLineNumber(sd, caretOffset);
int lineOffset = NbDocument.findLineOffset(sd, lineNumber);
try {
String currentLine = document.getText(lineOffset, caretOffset - lineOffset);
for (int i = 0; i < currentLine.length(); i++) {
char ch = currentLine.charAt(i);
if (ch != ' ' && ch != '\t') { // NOI18N
break;
}
indentString = indentString + ch;
}
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}
return indentString;
}
}