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 }, }); }
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); }