/// <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 }); }
/// <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 "<<paramref name="blockName"/>>_size_<<paramref name="cardSize"/>>" 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(); }
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); }