コード例 #1
0
        public override BlockState TryContinue(BlockProcessor processor, Block block)
        {
            if (processor.IsCodeIndent)
            {
                return(BlockState.None);
            }

            var quote = (FooterBlock)block;

            // A footer
            // A Footer marker consists of 0-3 spaces of initial indent, plus (a) the characters ^^ together with a following space, or (b) a double character ^^ not followed by a space.
            var c      = processor.CurrentChar;
            var result = BlockState.Continue;

            if (c != quote.OpeningCharacter || processor.PeekChar(1) != c)
            {
                result = processor.IsBlankLine ? BlockState.BreakDiscard : BlockState.None;
            }
            else
            {
                processor.NextChar();     // Skip ^^ char (1st)
                c = processor.NextChar(); // Skip ^^ char (2nd)
                if (c.IsSpace())
                {
                    processor.NextChar(); // Skip following space
                }
                block.UpdateSpanEnd(processor.Line.End);
            }
            return(result);
        }
コード例 #2
0
        public override BlockState TryOpen(BlockProcessor processor)
        {
            if (processor.IsCodeIndent)
            {
                return(BlockState.None);
            }

            var column        = processor.Column;
            var startPosition = processor.Start;

            // A footer
            // A Footer marker consists of 0-3 spaces of initial indent, plus (a) the characters ^^ together with a following space, or (b) a double character ^^ not followed by a space.
            var openingChar = processor.CurrentChar;

            if (processor.PeekChar(1) != openingChar)
            {
                return(BlockState.None);
            }
            processor.NextChar();         // Grab 2nd^
            var c = processor.NextChar(); // grab space

            if (c.IsSpaceOrTab())
            {
                processor.NextColumn();
            }
            processor.NewBlocks.Push(new FooterBlock(this)
            {
                Span             = new SourceSpan(startPosition, processor.Line.End),
                OpeningCharacter = openingChar,
                Column           = column,
                Line             = processor.LineIndex,
            });
            return(BlockState.Continue);
        }
コード例 #3
0
        /// <summary>
        /// Parses a line.
        /// </summary>
        internal virtual BlockState ParseLine(BlockProcessor blockProcessor, FlexiAlertBlock flexiAlertBlock)
        {
            if (blockProcessor.IsCodeIndent)
            {
                return(BlockState.None);
            }

            if (blockProcessor.CurrentChar != _openingChar)
            {
                return(blockProcessor.IsBlankLine ? BlockState.BreakDiscard : BlockState.None);
            }

            if (blockProcessor.PeekChar(1) == '[') // Avoid conflicting with images
            {
                return(BlockState.None);
            }

            if (flexiAlertBlock == null)
            {
                blockProcessor.NewBlocks.Push(_flexiAlertBlockFactory.Create(blockProcessor, this));
            }
            else
            {
                flexiAlertBlock.UpdateSpanEnd(blockProcessor.Line.End);
            }

            // Skip opening char and first whitespace char following it
            if (blockProcessor.NextChar().IsSpaceOrTab())
            {
                blockProcessor.NextChar();
            }

            return(BlockState.Continue);
        }
コード例 #4
0
ファイル: CheckboxParser.cs プロジェクト: modo-lv/Forkdown
        public override Boolean TryParse(BlockProcessor state, Char pendingBulletType, out ListInfo result)
        {
            result = new ListInfo();

            if (state.PeekChar(1) != ' ')
            {
                return(false);
            }

            state.NextChar();

            return(true);
        }
コード例 #5
0
        /// <summary>
        /// Opens a <typeparamref name="TProxy"/> if a line begins with at least 3 fence characters.
        /// </summary>
        /// <param name="blockProcessor">The <see cref="BlockProcessor"/> for the document that contains a line with a fence character as its first character.</param>
        /// <returns>
        /// <see cref="BlockState.None"/> if the current line has code indent.
        /// <see cref="BlockState.None"/> if the current line does not contain an opening fence.
        /// <see cref="BlockState.ContinueDiscard"/> if the current line contains an opening fence and a <typeparamref name="TProxy"/> is opened.
        ///</returns>
        protected override BlockState TryOpenBlock(BlockProcessor blockProcessor)
        {
            if (blockProcessor.IsCodeIndent)
            {
                return(BlockState.None);
            }

            // First line of a JSONBlock must begin with <opening char>{
            if (blockProcessor.PeekChar(1) != '{')
            {
                return(BlockState.None);
            }

            // Create block
            TProxy proxyJsonBlock = _jsonBlockFactory.CreateProxyJsonBlock(blockProcessor, this);

            blockProcessor.NewBlocks.Push(proxyJsonBlock);

            // Dispose of first char (JSON starts at the curly bracket)
            blockProcessor.NextChar();

            return(ParseLine(blockProcessor.Line, proxyJsonBlock));
        }