class BlockFactory extends AbstractBlockParserFactory {
        final private JekyllTagParsing parsing;
        final private boolean listIncludesOnly;

        BlockFactory(DataHolder options) {
            super(options);
            this.parsing = new JekyllTagParsing(new Parsing(options));
            listIncludesOnly = JekyllTagExtension.LIST_INCLUDES_ONLY.get(options);
        }

        @Override
        public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockParser) {<FILL_FUNCTION_BODY>}
    }

            BasedSequence line = state.getLine();
            int currentIndent = state.getIndent();
            if (currentIndent == 0 && !(matchedBlockParser.getBlockParser().getBlock() instanceof Paragraph)) {
                final BasedSequence tryLine = line.subSequence(state.getIndex());
                Matcher matcher = parsing.MACRO_OPEN.matcher(tryLine);

                if (matcher.find()) {
                    // see if it closes on the same line, then we create a block and close it
                    BasedSequence tag = tryLine.subSequence(0, matcher.end());
                    BasedSequence tagName = line.subSequence(matcher.start(1), matcher.end(1));
                    BasedSequence parameters = tryLine.subSequence(matcher.end(1), matcher.end() - 2).trim();

                    JekyllTag tagNode = new JekyllTag(tag.subSequence(0, 2), tagName, parameters, tag.endSequence(2));
                    tagNode.setCharsFromContent();

                    final JekyllTagBlockParser parser = new JekyllTagBlockParser(state.getProperties());
                    parser.block.appendChild(tagNode);

                    //noinspection EqualsBetweenInconvertibleTypes
                    if (!listIncludesOnly || tagName.equals(INCLUDE_TAG)) {
                        List<JekyllTag> tagList = JekyllTagExtension.TAG_LIST.get(state.getProperties());
                        tagList.add(tagNode);
                    }

                    return BlockStart.of(parser)
                            .atIndex(state.getLineEndIndex())
                            ;
                }
            }
            return BlockStart.none();
        
<methods>public non-sealed void <init>() ,public void addLine(com.vladsch.flexmark.parser.block.ParserState, com.vladsch.flexmark.util.sequence.BasedSequence) ,public boolean breakOutOnDoubleBlankLine() ,public boolean canContain(com.vladsch.flexmark.parser.block.ParserState, com.vladsch.flexmark.parser.block.BlockParser, com.vladsch.flexmark.util.ast.Block) ,public boolean canInterruptBy(com.vladsch.flexmark.parser.block.BlockParserFactory) ,public final void finalizeClosedBlock() ,public com.vladsch.flexmark.util.ast.BlockContent getBlockContent() ,public com.vladsch.flexmark.util.data.MutableDataHolder getDataHolder() ,public boolean isClosed() ,public boolean isContainer() ,public boolean isInterruptible() ,public boolean isParagraphParser() ,public boolean isPropagatingLastBlankLine(com.vladsch.flexmark.parser.block.BlockParser) ,public boolean isRawText() ,public void parseInlines(com.vladsch.flexmark.parser.InlineParser) ,public void removeBlankLines() <variables>private boolean isClosed,private com.vladsch.flexmark.util.data.MutableDataSet mutableData