Пример #1
0
        private MarkdownPipeline CreatePipeline(string path)
        {
            string basePath       = _parameters.BasePath;
            string mediaDirectory = Path.Combine(basePath, "src/resources");

            var includeBlocksExtensionOptions      = new FlexiIncludeBlocksExtensionOptions(baseUri: Path.Combine(basePath, path));
            var flexiPictureBlocksExtensionOptions = new FlexiPictureBlocksExtensionOptions(localMediaDirectory: mediaDirectory);
            var flexiVideoBlocksExtensionOptions   = new FlexiVideoBlocksExtensionOptions(localMediaDirectory: mediaDirectory);

            var builder = new MarkdownPipelineBuilder().
                          UseEmphasisExtras().
                          UseDefinitionLists().
                          UseFootnotes().
                          UseAutoLinks().
                          UseTaskLists().
                          UseListExtras().
                          UseMediaLinks().
                          UseAbbreviations().
                          UseFooters().
                          UseFigures().
                          UseCitations().
                          UseCustomContainers().
                          UseGenericAttributes().
                          UseMathematics().
                          UseSmartyPants().
                          UseDiagrams().
                          UseFlexiBlocks(includeBlocksExtensionOptions,
                                         flexiPictureBlocksExtensionOptions: flexiPictureBlocksExtensionOptions,
                                         flexiVideoBlocksExtensionOptions: flexiVideoBlocksExtensionOptions);

            builder.Extensions.Add(new CustomYamlHeaderExtension(new MarkdownContext()));

            return(builder.Build());
        }
        public static IEnumerable <object[]> ResolveType_ResolvesType_Data()
        {
            const string dummyType = "dummyType";
            ReadOnlyDictionary <string, string> dummyMimeTypes = new FlexiVideoBlocksExtensionOptions().MimeTypes;

            return(new object[][]
            {
                // Returns type if it isn't null, whitespace or an empty string
                new object[] { null, dummyType, null, dummyType },
                // Returns MIME type from MimeTypes if type is null, whitespace or an empty string and MimeTypes contains file's extension
                new object[] { "dummyFileName.mp4", null, dummyMimeTypes, "video/mp4" },
                new object[] { "dummyFileName.webm", null, dummyMimeTypes, "video/webm" },
                new object[] { "dummyFileName.ogg", null, dummyMimeTypes, "video/ogg" },
                // Returns null if type is null, whitespace or an empty string and MimeTypes does not contain file's extension
                new object[] { null, " ", new ReadOnlyDictionary <string, string>(new Dictionary <string, string>()), null },
                new object[] { null, string.Empty, new ReadOnlyDictionary <string, string>(new Dictionary <string, string>()), null },
            });
        }
Пример #3
0
        public void FlexiVideoBlocks_SpecifiedMetadataAndPosterTakePrecedence()
        {
            // Arrange
            const int    dummyWidth    = 300;
            const int    dummyHeight   = 200;
            const double dummyDuration = 1234.34;
            const string dummyPoster   = "dummyPoster";
            string       dummySrc      = $"/url/{_dummyVideoFileName}";
            var          flexiVideoBlocksExtensionOptions = new FlexiVideoBlocksExtensionOptions(localMediaDirectory: _fixture.TempDirectory);
            var          markdownPipelineBuilder          = new MarkdownPipelineBuilder();

            markdownPipelineBuilder.
            UseFlexiOptionsBlocks().
            UseFlexiVideoBlocks(flexiVideoBlocksExtensionOptions);
            MarkdownPipeline markdownPipeline = markdownPipelineBuilder.Build();

            // Act
            string result = Markdown.ToHtml($@"v{{
    ""src"": ""{dummySrc}"",
    ""width"": {dummyWidth},
    ""height"": {dummyHeight},
    ""duration"": {dummyDuration},
    ""poster"": ""{dummyPoster}"",
    ""generatePoster"": true
}}", markdownPipeline);

            // Assert
            Assert.Equal($@"<div class=""flexi-video flexi-video_has-poster flexi-video_has-width flexi-video_has-aspect-ratio flexi-video_has-duration flexi-video_has-type flexi-video_has-spinner flexi-video_has-play-icon flexi-video_has-pause-icon flexi-video_has-fullscreen-icon flexi-video_has-exit-fullscreen-icon flexi-video_has-error-icon"">
<div class=""flexi-video__container"" tabindex=""-1"" style=""width:{dummyWidth}px"">
<div class=""flexi-video__video-outer-container"" style=""width:{dummyWidth}px"">
<div class=""flexi-video__video-inner-container"" style=""padding-bottom:{dummyHeight / (double)dummyWidth * 100}%"">
<video class=""flexi-video__video"" preload=""auto"" poster=""{dummyPoster}"" muted playsInline disablePictureInPicture loop>
<source class=""flexi-video__source"" data-src=""{dummySrc}"" type=""video/mp4"">
</video>
</div>
</div>
<div class=""flexi-video__controls"">
<button class=""flexi-video__play-pause-button"" aria-label=""Pause/play"">
<svg class=""flexi-video__play-icon"" xmlns=""http://www.w3.org/2000/svg"" width=""24"" height=""24"" viewBox=""0 0 24 24""><path d=""M8 5v14l11-7z""/><path d=""M0 0h24v24H0z"" fill=""none""/></svg>
<svg class=""flexi-video__pause-icon"" xmlns=""http://www.w3.org/2000/svg"" width=""24"" height=""24"" viewBox=""0 0 24 24""><path shape-rendering=""crispEdges"" d=""M6 19h4V5H6v14zm8-14v14h4V5h-4z""/></svg>
</button>
<div class=""flexi-video__elapsed-time"">
<span class=""flexi-video__current-time"">0:00</span>
/<span class=""flexi-video__duration"">{TimeSpan.FromSeconds(Math.Round(dummyDuration)).ToString("m\\:ss")}</span>
</div>
<div class=""flexi-video__progress"">
<div class=""flexi-video__progress-track"">
<div class=""flexi-video__progress-played""></div>
<div class=""flexi-video__progress-buffered""></div>
</div>
</div>
<button class=""flexi-video__fullscreen-button"" aria-label=""Toggle fullscreen"">
<svg class=""flexi-video__fullscreen-icon"" xmlns=""http://www.w3.org/2000/svg"" width=""24"" height=""24"" viewBox=""0 0 24 24""><path shape-rendering=""crispEdges"" d=""M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z""/></svg>
<svg class=""flexi-video__exit-fullscreen-icon"" xmlns=""http://www.w3.org/2000/svg"" width=""24"" height=""24"" viewBox=""0 0 24 24""><path shape-rendering=""crispEdges"" d=""M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z""/></svg>
</button>
</div>
<div class=""flexi-video__error-notice"">
<svg class=""flexi-video__error-icon"" xmlns=""http://www.w3.org/2000/svg"" width=""24"" height=""24"" viewBox=""0 0 24 24""><path d=""M0 0h24v24H0z"" fill=""none""/><path d=""M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z""/></svg>
</div>
<div class=""flexi-video__spinner spinner"">
    <div class=""spinner__rects"">
        <div class=""spinner__rect-1""></div>
        <div class=""spinner__rect-2""></div>
        <div class=""spinner__rect-3""></div>
    </div>
</div>
</div>
</div>
", result, ignoreLineEndingDifferences: true);
        }