예제 #1
0
        public void Dispose()
        {
            if (Control != null)
                Control.Dispose();

            _htmlDocument = null;
            _pipeline = null;
        }
예제 #2
0
        public BlogController(IFileSystemService fileSystem, IConfiguration configuration)
        {
            _fileSystem = fileSystem;
            Configuration = configuration;

            MarkdownPipeline = new MarkdownPipelineBuilder()
                 .UseSoftlineBreakAsHardlineBreak()
                 .UseAdvancedExtensions()
                 .Build();
        }
예제 #3
0
        public Browser(string file)
        {
            var builder = new MarkdownPipelineBuilder()
                .UsePragmaLines()
                .UseAdvancedExtensions();

            _pipeline = builder.Build();
            _zoomFactor = GetZoomFactor();
            _file = file;
            _htmlTemplate = GetHtmlTemplate();
            _currentViewLine = -1;

            InitBrowser();
        }
예제 #4
0
 public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
 {
     ReceivedSetup = true;
 }
예제 #5
0
 public HtmlInclusionInlineRenderer(MarkdownContext context, MarkdownPipeline inlinePipeline)
 {
     _context        = context;
     _inlinePipeline = inlinePipeline;
 }
예제 #6
0
 public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
 {
     // Nothing to setup, JiraLinks used a normal LinkInlineRenderer
 }
예제 #7
0
 public DocumentationService(ILogger <DocumentationService> logger, IOptions <LiveDocsOptions> options, IWebHostEnvironment hostingEnvironment, MarkdownPipeline markdownPipeline)
 {
     _Logger             = logger;
     _Options            = options.Value;
     _HostingEnvironment = hostingEnvironment;
     _MarkdownPipeline   = markdownPipeline;
 }
예제 #8
0
 public static MarkdownPipeline GetMarkdownPipeline()
 {
     // .UseAutoIdentifiers()
     return(_sMarkdownPipeline ?? (_sMarkdownPipeline = new MarkdownPipelineBuilder().UsePipeTables().UseCustomContainers().UseEmphasisExtras().UseAutoLinks().UseGenericAttributes().Build()));
 }
        /// <summary>
        /// Start the preview on the Control.
        /// </summary>
        /// <param name="dataSource">Path to the file.</param>
        public override void DoPreview <T>(T dataSource)
        {
            this.infoBarDisplayed = false;

            try
            {
                if (!(dataSource is string filePath))
                {
                    throw new ArgumentException($"{nameof(dataSource)} for {nameof(MarkdownPreviewHandler)} must be a string but was a '{typeof(T)}'");
                }

                string fileText      = File.ReadAllText(filePath);
                Regex  imageTagRegex = new Regex(@"<[ ]*img.*>");
                if (imageTagRegex.IsMatch(fileText))
                {
                    this.infoBarDisplayed = true;
                }

                this.extension.BaseUrl = Path.GetDirectoryName(filePath);
                MarkdownPipeline pipeline       = this.pipelineBuilder.Build();
                string           parsedMarkdown = Markdown.ToHtml(fileText, pipeline);
                string           markdownHTML   = $"{this.htmlHeader}{parsedMarkdown}{this.htmlFooter}";

                this.InvokeOnControlThread(() =>
                {
                    this.browser = new WebBrowserExt
                    {
                        DocumentText = markdownHTML,
                        Dock         = DockStyle.Fill,
                        IsWebBrowserContextMenuEnabled = false,
                        ScriptErrorsSuppressed         = true,
                        ScrollBarsEnabled = true,
                        AllowNavigation   = false,
                    };
                    this.Controls.Add(this.browser);

                    if (this.infoBarDisplayed)
                    {
                        this.infoBar = this.GetTextBoxControl(Resources.BlockedImageInfoText);
                        this.Resize += this.FormResized;
                        this.Controls.Add(this.infoBar);
                    }
                });

                MarkdownTelemetry.Log.MarkdownFilePreviewed();
            }
            catch (Exception e)
            {
                MarkdownTelemetry.Log.MarkdownFilePreviewError(e.Message);

                this.InvokeOnControlThread(() =>
                {
                    this.Controls.Clear();
                    this.infoBarDisplayed = true;
                    this.infoBar          = this.GetTextBoxControl(Resources.MarkdownNotPreviewedError);
                    this.Resize          += this.FormResized;
                    this.Controls.Add(this.infoBar);
                });
            }
            finally
            {
                base.DoPreview(dataSource);
            }
        }
예제 #10
0
 public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
 {
     renderer.ObjectRenderers.Replace <CodeBlockRenderer>(new HighlightCodeBlockRenderer());
 }
예제 #11
0
        public static void AssertNormalize(string input, string expected = null, bool trim = true, NormalizeOptions options = null, MarkdownPipeline pipeline = null)
        {
            expected = expected ?? input;
            input    = NormText(input, trim);
            expected = NormText(expected, trim);

            pipeline = pipeline ?? new MarkdownPipelineBuilder()
                       .UseAutoLinks()
                       .UseJiraLinks(new Extensions.JiraLinks.JiraLinkOptions("https://jira.example.com"))
                       .UseTaskLists()
                       .Build();

            var result = Markdown.Normalize(input, options, pipeline: pipeline);

            result = NormText(result, trim);

            TestParser.PrintAssertExpected(input, result, expected);
        }
예제 #12
0
 public ScriptCsRenderer(ScriptExecutor scriptExecutor, MarkdownPipeline pipeline, ScriptCsOptions options)
 {
     this.scriptExecutor = scriptExecutor;
     this.pipeline       = pipeline;
     this.options        = options;
 }
예제 #13
0
 public MdContentParser()
 {
     // Configure the pipeline with all advanced extensions active
     //except (except Emoji, SoftLine as HarLine and SmartyPants)
     this.pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
 }
예제 #14
0
 public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
 {
 }
예제 #15
0
        private static void File(string fullFilePath, Container container, RenderSettings settings)
        {
            string body         = null;
            string summaries    = null;
            string cssHeader    = null;
            string jsHeader     = null;
            var    sourceFolder = new AbsoluteFolder(Path.GetDirectoryName(fullFilePath));

            if (settings == null)
            {
                settings = RenderSettings.DefaultWiki(sourceFolder);
            }

            using (var scope = ThreadScopedLifestyle.BeginScope(container))
                using (var writer = new StringWriter())
                {
                    MarkdownPipeline pipeline = CreatePipeline(container);
                    var markdown         = System.IO.File.ReadAllText(fullFilePath);
                    var markdownDocument = Markdown.Parse(markdown, pipeline);
                    var renderer         = new ExtensionHtmlRenderer(writer, markdownDocument, settings, pipeline);
                    renderer.RegisterDynamicCss(new Code("markdown-extensions", "0.0.1", () =>
                                                         Assembly.GetExecutingAssembly().GetFileContent("vscode-markdown.css")));

                    pipeline.Setup(renderer);
                    RegisterBlocks(renderer);

                    renderer.Parse(container);
                    renderer.Validate(container);
                    renderer.Transform();
                    renderer.Render(markdownDocument);
                    var fileName = Path.GetFileName(fullFilePath);
                    renderer.RenderMarkdown(fileName, markdownDocument);
                    writer.Flush();
                    body = writer.ToString();

                    using (var summaryWriter = new StringWriter())
                    {
                        // a bit of a hack to use different writer for summaries
                        renderer.Writer = summaryWriter;
                        renderer.RenderSummaries(markdownDocument);
                        summaryWriter.Flush();
                        summaries = summaryWriter.ToString();
                    }

                    cssHeader = renderer.RenderCssHeader();
                    jsHeader  = renderer.RenderJavascriptHeader();
                }
            var    document = $@"
				<html>
					<head>
						{jsHeader}
						{cssHeader}
					</head>
					<body>
						{summaries}
						<main>
						{body}
						</main>
					</body>
				</html>"                ;
            string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fullFilePath);
            var    file = new File(settings.OutputFolder, fileNameWithoutExtension + ".html");

            System.IO.File.WriteAllText(file.AbsolutePath, document);
        }
예제 #16
0
파일: MD2PPTX.cs 프로젝트: ayumax/MDToPPTX
        protected static PPTXDocument ToPPTxDocument(string markdown, PPTXSetting options = null, MarkdownPipeline pipeline = null)
        {
            options = options ?? new PPTXSetting()
            {
                SlideSize = EPPTXSlideSizeValues.Screen4x3
            };

            pipeline = pipeline ?? new MarkdownPipelineBuilder()
                       .UsePipeTables()
                       .UseEmphasisExtras()
                       .Build();

            var document = Markdig.Markdown.Parse(markdown, pipeline);

            var pptx = new PPTXDocument();

            var slide = new SlideManager(pptx, options);

            var renderer = new PPTXRenderer(slide, options);

            pipeline.Setup(renderer);

            renderer.Render(document);

            slide.EndSheet();

            return(pptx);
        }
예제 #17
0
 /// <summary>
 /// Initializes a new instance of the <see cref="JupyterParser" /> class.
 /// </summary>
 /// <param name="text">The reader.</param
 /// <param name="pipeline">The pipeline.</param>
 /// <exception cref="ArgumentNullException">
 /// </exception>
 public JupyterParser(string text, MarkdownPipeline pipeline)
 {
     _text             = text;
     _markdownPipeline = pipeline;
 }
예제 #18
0
 public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer) => renderer.ObjectRenderers.AddIfNotAlready(new LinkerRenderAdapter(LinkRenderers));
예제 #19
0
 public MarkdownService()
 {
     pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions()
                .Use <TargetLinkExtension>()
                .Build();
 }
 public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer) =>
 renderer.ObjectRenderers.Insert(0, Renderer);
예제 #21
0
 public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
 {
     renderer.ObjectRenderers.InsertBefore <ListRenderer>(new TableOfContentsHtmlRenderer());
 }
예제 #22
0
        internal void Process()
        {
            navs = ParseDirectory(Nav.RootPath + src);
            p    = new MarkdownPipelineBuilder().UsePipeTables(new PipeTableOptions {
                RequireHeaderSeparator = true
            })
                   .UseBootstrap()
                   .UseYamlFrontMatter()
                   .UseGenericAttributes()
                   .UseAutoIdentifiers(AutoIdentifierOptions.GitHub)
                   .Build();

            for (int i = 0; i < MDs.Count; i++)
            {
                StringBuilder nhtml = new StringBuilder();
                StringBuilder ohtml = new StringBuilder();

                foreach (NavItem item in navs.Items)
                {
                    ActiveState active = ActiveState.None;
                    string      uid    = Nav.GetNavItem(MDs[i]).UID;
                    string      nid    = Nav.SanitizeFilename(item.Title).Replace(" ", string.Empty);

                    if (item.Items.Any(t => t.UID == uid))
                    {
                        active = ActiveState.Child;
                        nhtml.AppendLine("<li class=\"panel expanded active\">" +
                                         $"<a class=\"area\" href=\"#{nid}\" data-parent=\"#main-nav\" data-toggle=\"collapse\">{item.Title}</a>");
                        nhtml.AppendLine($"<ul id=\"{nid}\" class=\"collapse in\">");
                    }
                    else
                    {
                        nhtml.AppendLine("<li class=\"panel collapsed\">" +
                                         $"<a class=\"area\" href=\"#{nid}\" data-parent=\"#main-nav\" data-toggle=\"collapse\">{item.Title}</a>");
                        nhtml.AppendLine($"<ul id=\"{nid}\" class=\"collapse\">");
                    }

                    ohtml.AppendLine($"<optgroup label=\"{item.Title}\">");

                    foreach (NavItem navItem in item.Items)
                    {
                        if (active == ActiveState.Child && uid == navItem.UID)
                        {
                            nhtml.AppendLine(ProcessNav(navItem, active, uid));
                            ohtml.AppendLine($"<option selected=\"selected\" value=\"{navItem.Link}\">{navItem.Title}</option>");
                        }
                        else
                        {
                            nhtml.AppendLine(ProcessNav(navItem, ActiveState.None, uid));
                            ohtml.AppendLine($"<option value=\"{navItem.Link}\">{navItem.Title}</option>");
                        }
                    }

                    nhtml.AppendLine("</ul></li></div>");
                    ohtml.AppendLine("</optgroup>");
                }


                navHtml = minifier.Minify(nhtml.ToString()).MinifiedContent;
                optHtml = "<select id=\"small-nav-dropdown\">" + minifier.Minify(ohtml.ToString()).MinifiedContent + "</select>";

                ProcessMD(MDs[i]);
            }//);

            //! Uncomment to use parallel processing. Useful when you have hundreds of files.
            // Parallel.For(0, MDs.Count, i => ProcessMD(MDs[i]));
        }
예제 #23
0
 public NotificationBuilder(NotifyQueue notifiyQueue)
 {
     markdown          = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
     this.notifiyQueue = notifiyQueue;
 }
 public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
 {
     throw new System.NotImplementedException();
 }
 public MarkdownContentLoader(MarkdownPipeline markdownPipeline)
 {
     _markdownPipeline = markdownPipeline;
 }
예제 #26
0
        /// <summary>
        /// Start the preview on the Control.
        /// </summary>
        /// <param name="dataSource">Path to the file.</param>
        public override void DoPreview <T>(T dataSource)
        {
            CleanupWebView2UserDataFolder();

            _infoBarDisplayed = false;

            try
            {
                if (!(dataSource is string filePath))
                {
                    throw new ArgumentException($"{nameof(dataSource)} for {nameof(MarkdownPreviewHandler)} must be a string but was a '{typeof(T)}'");
                }

                string fileText      = File.ReadAllText(filePath);
                Regex  imageTagRegex = new Regex(@"<[ ]*img.*>");
                if (imageTagRegex.IsMatch(fileText))
                {
                    _infoBarDisplayed = true;
                }

                var htmlHeader = Common.UI.ThemeManager.GetWindowsBaseColor().ToLowerInvariant() == "dark" ? htmlDarkHeader : htmlLightHeader;
                _extension.FilePath = Path.GetDirectoryName(filePath);
                MarkdownPipeline pipeline       = _pipelineBuilder.Build();
                string           parsedMarkdown = Markdig.Markdown.ToHtml(fileText, pipeline);
                string           markdownHTML   = $"{htmlHeader}{parsedMarkdown}{htmlFooter}";

                _browser = new WebView2()
                {
                    Dock = DockStyle.Fill,
                };

                InvokeOnControlThread(() =>
                {
                    ConfiguredTaskAwaitable <CoreWebView2Environment> .ConfiguredTaskAwaiter
                    webView2EnvironmentAwaiter = CoreWebView2Environment
                                                 .CreateAsync(userDataFolder: _webView2UserDataFolder)
                                                 .ConfigureAwait(true).GetAwaiter();
                    webView2EnvironmentAwaiter.OnCompleted(() =>
                    {
                        InvokeOnControlThread(async() =>
                        {
                            try
                            {
                                _webView2Environment = webView2EnvironmentAwaiter.GetResult();
                                await _browser.EnsureCoreWebView2Async(_webView2Environment).ConfigureAwait(true);
                                await _browser.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("window.addEventListener('contextmenu', window => {window.preventDefault();});");
                                _browser.CoreWebView2.SetVirtualHostNameToFolderMapping(VirtualHostName, AssemblyDirectory, CoreWebView2HostResourceAccessKind.Allow);

                                // WebView2.NavigateToString() limitation
                                // See https://docs.microsoft.com/en-us/dotnet/api/microsoft.web.webview2.core.corewebview2.navigatetostring?view=webview2-dotnet-1.0.864.35#remarks
                                // While testing the limit, it turned out it is ~1.5MB, so to be on a safe side we go for 1.5m bytes
                                Uri filenameUri = null;
                                if (markdownHTML.Length > 1_500_000)
                                {
                                    string filename = _webView2UserDataFolder + "\\" + Guid.NewGuid().ToString() + ".html";
                                    File.WriteAllText(filename, markdownHTML);
                                    filenameUri     = new Uri(filename);
                                    _browser.Source = filenameUri;
                                }
                                else
                                {
                                    _browser.NavigateToString(markdownHTML);
                                }

                                Controls.Add(_browser);

                                _browser.NavigationStarting += async(object sender, CoreWebView2NavigationStartingEventArgs args) =>
                                {
                                    if (args.Uri != null && args.Uri != filenameUri?.ToString() && args.IsUserInitiated)
                                    {
                                        args.Cancel = true;
                                        await Launcher.LaunchUriAsync(new Uri(args.Uri));
                                    }
                                };

                                if (_infoBarDisplayed)
                                {
                                    _infoBar = GetTextBoxControl(Resources.BlockedImageInfoText);
                                    Resize  += FormResized;
                                    Controls.Add(_infoBar);
                                }
                            }
                            catch (NullReferenceException)
                            {
                            }
                        });
                    });
                });

                PowerToysTelemetry.Log.WriteEvent(new MarkdownFilePreviewed());
            }
            catch (Exception ex)
            {
                PowerToysTelemetry.Log.WriteEvent(new MarkdownFilePreviewError {
                    Message = ex.Message
                });

                InvokeOnControlThread(() =>
                {
                    Controls.Clear();
                    _infoBarDisplayed = true;
                    _infoBar          = GetTextBoxControl(Resources.MarkdownNotPreviewedError);
                    Resize           += FormResized;
                    Controls.Add(_infoBar);
                });
            }
            finally
            {
                base.DoPreview(dataSource);
            }
        }
예제 #27
0
        internal static (MediaPost MediaPost, Guid Id) CreateMediaPost(String fileContents, MarkdownPipeline markdownPipeline)
        {
            var(frontMatter, content) = fileContents.SplitYamlFile();

            var deserializer = new DeserializerBuilder()
                               .WithNamingConvention(LowerCaseNamingConvention.Instance)
                               .Build();

            var yamlMediaPost = deserializer.Deserialize <YamlMediaPost>(frontMatter);

            Guid id        = yamlMediaPost.Id;
            var  mediaPost = new MediaPost()
            {
                Author      = yamlMediaPost.Author,
                Description = content.ToHtml(markdownPipeline),
                Media       = CreateMediaItem(yamlMediaPost.MediaType, yamlMediaPost.MediaItem),
                MediaType   = yamlMediaPost.MediaType,
                Posted      = yamlMediaPost.Posted,
                Tags        = yamlMediaPost.Tags,
                Title       = yamlMediaPost.Title,
                IsPublished = yamlMediaPost.IsPublished
            };

            return(mediaPost, id);
        }
예제 #28
0
 public MarkdownWrapper()
 {
     _pipeline = new MarkdownPipelineBuilder()
                 .UseAdvancedExtensions()
                 .Build();
 }
예제 #29
0
 public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
 {
     PipelineHelpers.SetupSyntaxRender(renderer);
 }
예제 #30
0
        public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
        {
            var index = renderer.ObjectRenderers.FindIndex(r => r.GetType() == typeof(LinkInlineRenderer));

            renderer.ObjectRenderers[index] = new EmbeddedImageLinkInlineRenderer(this.BaseDirectory);
        }
예제 #31
0
        /// <summary>
        /// Start the preview on the Control.
        /// </summary>
        /// <param name="dataSource">Path to the file.</param>
        public override void DoPreview <T>(T dataSource)
        {
            _infoBarDisplayed = false;

            try
            {
                if (!(dataSource is string filePath))
                {
                    throw new ArgumentException($"{nameof(dataSource)} for {nameof(MarkdownPreviewHandler)} must be a string but was a '{typeof(T)}'");
                }

                string fileText      = File.ReadAllText(filePath);
                Regex  imageTagRegex = new Regex(@"<[ ]*img.*>");
                if (imageTagRegex.IsMatch(fileText))
                {
                    _infoBarDisplayed = true;
                }

                _extension.FilePath = Path.GetDirectoryName(filePath);
                MarkdownPipeline pipeline       = _pipelineBuilder.Build();
                string           parsedMarkdown = Markdig.Markdown.ToHtml(fileText, pipeline);
                string           markdownHTML   = $"{htmlHeader}{parsedMarkdown}{htmlFooter}";

                InvokeOnControlThread(() =>
                {
                    _browser = new WebBrowserExt
                    {
                        DocumentText = markdownHTML,
                        Dock         = DockStyle.Fill,
                        IsWebBrowserContextMenuEnabled = false,
                        ScriptErrorsSuppressed         = true,
                        ScrollBarsEnabled = true,
                        AllowNavigation   = false,
                    };
                    Controls.Add(_browser);

                    if (_infoBarDisplayed)
                    {
                        _infoBar = GetTextBoxControl(Resources.BlockedImageInfoText);
                        Resize  += FormResized;
                        Controls.Add(_infoBar);
                    }
                });

                PowerToysTelemetry.Log.WriteEvent(new MarkdownFilePreviewed());
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception ex)
#pragma warning restore CA1031 // Do not catch general exception types
            {
                PowerToysTelemetry.Log.WriteEvent(new MarkdownFilePreviewError {
                    Message = ex.Message
                });

                InvokeOnControlThread(() =>
                {
                    Controls.Clear();
                    _infoBarDisplayed = true;
                    _infoBar          = GetTextBoxControl(Resources.MarkdownNotPreviewedError);
                    Resize           += FormResized;
                    Controls.Add(_infoBar);
                });
            }
            finally
            {
                base.DoPreview(dataSource);
            }
        }
예제 #32
0
 static CatalogConverter()
 {
     _markdownPipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
 }
예제 #33
0
파일: MD2PPTX.cs 프로젝트: ayumax/MDToPPTX
        protected static void ToPPTX(string markdown, string pptxFilePath, PPTXSetting options = null, MarkdownPipeline pipeline = null)
        {
            options = options ?? new PPTXSetting()
            {
                SlideSize = EPPTXSlideSizeValues.Screen4x3
            };

            var pptx = ToPPTxDocument(markdown, options, pipeline);

            pptx.SaveAs(pptxFilePath, options);
        }