All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.greenpepper.shaded.com.vladsch.flexmark.internal.BlockQuoteParser Maven / Gradle / Ivy
package com.greenpepper.shaded.com.vladsch.flexmark.internal;
import com.greenpepper.shaded.com.vladsch.flexmark.ast.Block;
import com.greenpepper.shaded.com.vladsch.flexmark.ast.BlockQuote;
import com.greenpepper.shaded.com.vladsch.flexmark.ast.ListItem;
import com.greenpepper.shaded.com.vladsch.flexmark.ast.util.Parsing;
import com.greenpepper.shaded.com.vladsch.flexmark.parser.Parser;
import com.greenpepper.shaded.com.vladsch.flexmark.parser.block.*;
import com.greenpepper.shaded.com.vladsch.flexmark.util.options.DataHolder;
import com.greenpepper.shaded.com.vladsch.flexmark.util.sequence.BasedSequence;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class BlockQuoteParser extends AbstractBlockParser {
private final BlockQuote block = new BlockQuote();
private final boolean allowLeadingSpace;
private final boolean continueToBlankLine;
private final boolean ignoreBlankLine;
private final boolean interruptsParagraph;
private final boolean interruptsItemParagraph;
private final boolean withLeadSpacesInterruptsItemParagraph;
private int lastWasBlankLine = 0;
public BlockQuoteParser(DataHolder options, BasedSequence marker) {
block.setOpeningMarker(marker);
continueToBlankLine = options.get(Parser.BLOCK_QUOTE_TO_BLANK_LINE);
allowLeadingSpace = options.get(Parser.BLOCK_QUOTE_ALLOW_LEADING_SPACE);
ignoreBlankLine = options.get(Parser.BLOCK_QUOTE_IGNORE_BLANK_LINE);
interruptsParagraph = options.get(Parser.BLOCK_QUOTE_INTERRUPTS_PARAGRAPH);
interruptsItemParagraph = options.get(Parser.BLOCK_QUOTE_INTERRUPTS_ITEM_PARAGRAPH);
withLeadSpacesInterruptsItemParagraph = options.get(Parser.BLOCK_QUOTE_WITH_LEAD_SPACES_INTERRUPTS_ITEM_PARAGRAPH);
}
@Override
public boolean isContainer() {
return true;
}
@Override
public boolean isPropagatingLastBlankLine(BlockParser lastMatchedBlockParser) {
return false;
}
@Override
public boolean canContain(ParserState state, BlockParser blockParser, Block block) {
return true;
}
@Override
public BlockQuote getBlock() {
return block;
}
@Override
public void closeBlock(ParserState state) {
block.setCharsFromContent();
}
@Override
public BlockContinue tryContinue(ParserState state) {
int nextNonSpace = state.getNextNonSpaceIndex();
boolean isMarker;
if (!state.isBlank() && ((isMarker = isMarker(state, nextNonSpace, false, false, allowLeadingSpace, interruptsParagraph, interruptsItemParagraph, withLeadSpacesInterruptsItemParagraph)) || (continueToBlankLine && lastWasBlankLine == 0))) {
int newColumn = state.getColumn() + state.getIndent();
lastWasBlankLine = 0;
if (isMarker) {
newColumn++;
// optional following space or tab
if (Parsing.isSpaceOrTab(state.getLine(), nextNonSpace + 1)) {
newColumn++;
}
}
return BlockContinue.atColumn(newColumn);
} else {
if (ignoreBlankLine && state.isBlank()) {
lastWasBlankLine++;
int newColumn = state.getColumn() + state.getIndent();
return BlockContinue.atColumn(newColumn);
}
return BlockContinue.none();
}
}
static boolean isMarker(
final ParserState state,
final int index,
final boolean inParagraph,
final boolean inParagraphListItem,
final boolean allowLeadingSpace,
final boolean interruptsParagraph,
final boolean interruptsItemParagraph,
final boolean withLeadSpacesInterruptsItemParagraph
) {
CharSequence line = state.getLine();
if ((!inParagraph || interruptsParagraph) && index < line.length() && line.charAt(index) == '>') {
if ((allowLeadingSpace || state.getIndent() == 0) && (!inParagraphListItem || interruptsItemParagraph)) {
if (inParagraphListItem && !withLeadSpacesInterruptsItemParagraph) {
return state.getIndent() == 0;
} else {
return state.getIndent() < state.getParsing().CODE_BLOCK_INDENT;
}
}
}
return false;
}
public static class Factory implements CustomBlockParserFactory {
@Override
public Set> getAfterDependents() {
return Collections.emptySet();
//new HashSet>(Arrays.asList(
// //BlockQuoteParser.Factory.class,
// //HeadingParser.Factory.class,
// //FencedCodeBlockParser.Factory.class
// //HtmlBlockParser.Factory.class,
// //ThematicBreakParser.Factory.class,
// //ListBlockParser.Factory.class,
// //IndentedCodeBlockParser.Factory.class
//));
}
@Override
public Set> getBeforeDependents() {
return new HashSet>(Arrays.asList(
//BlockQuoteParser.Factory.class,
HeadingParser.Factory.class,
FencedCodeBlockParser.Factory.class,
HtmlBlockParser.Factory.class,
ThematicBreakParser.Factory.class,
ListBlockParser.Factory.class,
IndentedCodeBlockParser.Factory.class
));
}
@Override
public boolean affectsGlobalScope() {
return false;
}
@Override
public BlockParserFactory create(DataHolder options) {
return new BlockFactory(options);
}
}
private static class BlockFactory extends AbstractBlockParserFactory {
private final boolean allowLeadingSpace;
private final boolean interruptsParagraph;
private final boolean interruptsItemParagraph;
private final boolean withLeadSpacesInterruptsItemParagraph;
BlockFactory(DataHolder options) {
super(options);
allowLeadingSpace = options.get(Parser.BLOCK_QUOTE_ALLOW_LEADING_SPACE);
interruptsParagraph = options.get(Parser.BLOCK_QUOTE_INTERRUPTS_PARAGRAPH);
interruptsItemParagraph = options.get(Parser.BLOCK_QUOTE_INTERRUPTS_ITEM_PARAGRAPH);
withLeadSpacesInterruptsItemParagraph = options.get(Parser.BLOCK_QUOTE_WITH_LEAD_SPACES_INTERRUPTS_ITEM_PARAGRAPH);
}
public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockParser) {
int nextNonSpace = state.getNextNonSpaceIndex();
BlockParser matched = matchedBlockParser.getBlockParser();
boolean inParagraph = matched.isParagraphParser();
boolean inParagraphListItem = inParagraph && matched.getBlock().getParent() instanceof ListItem && matched.getBlock() == matched.getBlock().getParent().getFirstChild();
if (isMarker(state, nextNonSpace, inParagraph, inParagraphListItem, allowLeadingSpace, interruptsParagraph, interruptsItemParagraph, withLeadSpacesInterruptsItemParagraph)) {
int newColumn = state.getColumn() + state.getIndent() + 1;
// optional following space or tab
if (Parsing.isSpaceOrTab(state.getLine(), nextNonSpace + 1)) {
newColumn++;
}
return BlockStart.of(new BlockQuoteParser(state.getProperties(), state.getLine().subSequence(nextNonSpace, nextNonSpace + 1))).atColumn(newColumn);
} else {
return BlockStart.none();
}
}
}
}