/// <summary>
        /// Creates a <see cref="FlexiCardBlock"/>.
        /// </summary>
        /// <param name="blockProcessor">The <see cref="BlockProcessor"/> processing the <see cref="FlexiCardBlock"/>.</param>
        /// <param name="blockParser">The <see cref="BlockParser"/> parsing the <see cref="FlexiCardBlock"/>.</param>
        /// <exception cref="BlockException">Thrown if <paramref name="blockProcessor"/>'s <see cref="BlockProcessor.CurrentContainer"/> is not
        /// a <see cref="ProxyFlexiCardsBlock"/>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="blockProcessor"/> is <c>null</c>.</exception>
        public override FlexiCardBlock Create(BlockProcessor blockProcessor, BlockParser blockParser)
        {
            if (!(blockProcessor.CurrentContainer is ProxyFlexiCardsBlock proxyFlexiCardsBlock))
            {
                throw new BlockException(nameof(FlexiCardBlock),
                                         blockProcessor.LineIndex,
                                         blockProcessor.Column,
                                         string.Format(Strings.BlockException_Shared_BlockCanOnlyExistWithinASpecificTypeOfBlock,
                                                       nameof(FlexiCardBlock),
                                                       nameof(FlexiCardsBlock)));
            }

            IFlexiCardBlockOptions flexiCardBlockOptions = _flexiCardBlockOptionsFactory.
                                                           Create(proxyFlexiCardsBlock.FlexiCardsBlockOptions.DefaultCardOptions, blockProcessor);

            // Create block
            return(new FlexiCardBlock(flexiCardBlockOptions.Url,
                                      flexiCardBlockOptions.BackgroundIcon,
                                      flexiCardBlockOptions.Attributes,
                                      blockParser)
            {
                Column = blockProcessor.Column,
                Span = new SourceSpan(blockProcessor.Start, 0) // MultipartBlockParser will update end
                       // Line is assigned by BlockProcessor
            });
        }
Esempio n. 2
0
 /// <summary>
 /// Creates a <see cref="FlexiCardBlockOptions"/>.
 /// </summary>
 /// <param name="blockName">
 /// <para>The <see cref="FlexiCardsBlock"/>'s <a href="https://en.bem.info/methodology/naming-convention/#block-name">BEM block name</a>.</para>
 /// <para>In compliance with <a href="https://en.bem.info">BEM methodology</a>, this value is the <see cref="FlexiCardsBlock"/>'s root element's class as well as the prefix for all other classes in the block.</para>
 /// <para>This value should contain only valid <a href="https://www.w3.org/TR/CSS21/syndata.html#characters">CSS class characters</a>.</para>
 /// <para>If this value is <c>null</c>, whitespace or an empty string, the <see cref="FlexiCardsBlock"/>'s block name is "flexi-cards".</para>
 /// <para>Defaults to "flexi-cards".</para>
 /// </param>
 /// <param name="cardSize">
 /// <para>The display size of contained <see cref="FlexiCardBlock"/>s.</para>
 /// <para>A class attribute with value "&lt;<paramref name="blockName"/>&gt;_size_&lt;<paramref name="cardSize"/>&gt;" is added to the <see cref="FlexiCardsBlock"/>'s root element.</para>
 /// <para>Defaults to <see cref="FlexiCardBlockSize.Small"/>.</para>
 /// </param>
 /// <param name="defaultCardOptions">
 /// <para>The default <see cref="IFlexiCardBlockOptions"/> for contained <see cref="FlexiCardBlock"/>s.</para>
 /// <para>If this value is <c>null</c>, a <see cref="FlexiCardBlockOptions"/> with default values is used.</para>
 /// <para>Defaults to <c>null</c>.</para>
 /// </param>
 /// <param name="attributes">
 /// <para>The HTML attributes for the <see cref="FlexiCardsBlock"/>'s root element.</para>
 /// <para>Attribute names must be lowercase.</para>
 /// <para>If the class attribute is specified, its value is appended to default classes. This facilitates <a href="https://en.bem.info/methodology/quick-start/#mix">BEM mixes</a>.</para>
 /// <para>If this value is <c>null</c>, default classes are still assigned to the root element.</para>
 /// <para>Defaults to <c>null</c>.</para>
 /// </param>
 public FlexiCardsBlockOptions(
     string blockName            = "flexi-cards",
     FlexiCardBlockSize cardSize = FlexiCardBlockSize.Small,
     IFlexiCardBlockOptions defaultCardOptions = default,
     IDictionary <string, string> attributes   = default) : base(blockName, attributes)
 {
     CardSize           = cardSize;
     DefaultCardOptions = defaultCardOptions ?? new FlexiCardBlockOptions();
 }
Esempio n. 3
0
        public void Create_CreatesFlexiCardBlock()
        {
            // Arrange
            const int                      dummyColumn                = 2;
            var                            dummyLine                  = new StringSlice("dummyText", 3, 8);
            const string                   dummyUrl                   = "dummyUrl";
            const string                   dummyBackgroundIcon        = "dummyBackgroundIcon";
            IFlexiCardBlockOptions         dummyDefaultCardOptions    = _mockRepository.Create <IFlexiCardBlockOptions>().Object;
            Mock <IFlexiCardsBlockOptions> mockFlexiCardsBlockOptions = _mockRepository.Create <IFlexiCardsBlockOptions>();

            mockFlexiCardsBlockOptions.Setup(f => f.DefaultCardOptions).Returns(dummyDefaultCardOptions);
            Mock <BlockParser>   dummyBlockParser          = _mockRepository.Create <BlockParser>();
            ProxyFlexiCardsBlock dummyProxyFlexiCardsBlock = CreateProxyFlexiCardsBlock(mockFlexiCardsBlockOptions.Object, blockParser: dummyBlockParser.Object);
            BlockProcessor       dummyBlockProcessor       = MarkdigTypesFactory.CreateBlockProcessor();

            // Following 3 lines set dummyBlockProcessor.CurrentContainer
            dummyBlockParser.Setup(b => b.TryContinue(dummyBlockProcessor, dummyProxyFlexiCardsBlock)).Returns(BlockState.ContinueDiscard);
            dummyBlockProcessor.Open(dummyProxyFlexiCardsBlock);
            dummyBlockProcessor.ProcessLine(new StringSlice(string.Empty));
            dummyBlockProcessor.Column = dummyColumn;
            dummyBlockProcessor.Line   = dummyLine;
            var dummyAttributes = new ReadOnlyDictionary <string, string>(new Dictionary <string, string>());
            Mock <IFlexiCardBlockOptions> mockFlexiCardBlockOptions = _mockRepository.Create <IFlexiCardBlockOptions>();

            mockFlexiCardBlockOptions.Setup(f => f.Url).Returns(dummyUrl);
            mockFlexiCardBlockOptions.Setup(f => f.BackgroundIcon).Returns(dummyBackgroundIcon);
            mockFlexiCardBlockOptions.Setup(f => f.Attributes).Returns(dummyAttributes);
            Mock <IBlockOptionsFactory <IFlexiCardBlockOptions> > mockFlexiCardBlockOptionsFactory = _mockRepository.
                                                                                                     Create <IBlockOptionsFactory <IFlexiCardBlockOptions> >();

            mockFlexiCardBlockOptionsFactory.Setup(f => f.Create(dummyDefaultCardOptions, dummyBlockProcessor)).Returns(mockFlexiCardBlockOptions.Object);
            FlexiCardBlockFactory testSubject = CreateFlexiCardBlockFactory(mockFlexiCardBlockOptionsFactory.Object);

            // Act
            FlexiCardBlock result = testSubject.Create(dummyBlockProcessor, dummyBlockParser.Object);

            // Assert
            _mockRepository.VerifyAll();
            Assert.Equal(dummyUrl, result.Url);
            Assert.Equal(dummyBackgroundIcon, result.BackgroundIcon);
            Assert.Same(dummyAttributes, result.Attributes);
            Assert.Same(dummyBlockParser.Object, result.Parser);
            Assert.Equal(dummyColumn, result.Column);
            Assert.Equal(dummyLine.Start, result.Span.Start);
            Assert.Equal(0, result.Span.End);
        }