package org.intellij.plugins.markdown.lang.parser;
import org.intellij.markdown.MarkdownElementTypes;
import org.intellij.markdown.ast.ASTNode;
import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor;
import org.intellij.markdown.parser.MarkdownParser;
import org.jetbrains.annotations.NotNull;
public class MarkdownParserManager {
public static final GFMFlavourDescriptor FLAVOUR = new GFMFlavourDescriptor();
private static final ThreadLocal<ParsingInfo> ourLastParsingResult = new ThreadLocal<>();
public static ASTNode parseContent(@NotNull CharSequence buffer) {
final ParsingInfo info = ourLastParsingResult.get();
if (info != null && info.myBufferHash == buffer.hashCode() && info.myBuffer.equals(buffer)) {
return info.myParseResult;
}
final ASTNode parseResult = new MarkdownParser(FLAVOUR)
.parse(MarkdownElementTypes.MARKDOWN_FILE, buffer.toString(), false);
ourLastParsingResult.set(new ParsingInfo(buffer, parseResult));
return parseResult;
}
private static class ParsingInfo {
@NotNull
final CharSequence myBuffer;
final int myBufferHash;
@NotNull
final ASTNode myParseResult;
public ParsingInfo(@NotNull CharSequence buffer, @NotNull ASTNode parseResult) {
myBuffer = buffer;
myBufferHash = myBuffer.hashCode();
myParseResult = parseResult;
}
}
}