Esempio n. 1
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure <MarkdownConfigurationModel>(Configuration.GetSection("Markdown"));
            services.Configure <JarvisConfigurationModel>(Configuration.GetSection("Jarvis"));

            var markdownConfiguration = new MarkdownConfigurationModel();

            Configuration.GetSection("Markdown").Bind(markdownConfiguration);

            services.AddMarkdown(config =>
            {
                config.HtmlTagBlackList = "iframe|object|embed|form";
                if (markdownConfiguration.MarkdownDirectories != null && markdownConfiguration.MarkdownDirectories.Count > 0)
                {
                    var folderConfig = new MarkdownProcessingFolder();
                    foreach (string folderName in markdownConfiguration.MarkdownDirectories)
                    {
                        config.AddMarkdownProcessingFolder(
                            string.Format("{0}/", folderName),
                            "~/Views/Shared/MarkdownPageTemplate.cshtml");
                    }
                    folderConfig.SanitizeHtml             = true;
                    folderConfig.ProcessExtensionlessUrls = true;
                }

                config.ConfigureMarkdigPipeline = builder =>
                {
                    builder.UseEmphasisExtras(Markdig.Extensions.EmphasisExtras.EmphasisExtraOptions.Default)
                    .UsePipeTables()
                    .UseGridTables()
                    .UseAutoIdentifiers(AutoIdentifierOptions.GitHub) // Headers get id="name"
                    .UseAutoLinks()                                   // URLs are parsed into anchors
                    .UseAbbreviations()
                    .UseYamlFrontMatter()
                    .UseEmojiAndSmiley(true)
                    .UseListExtras()
                    .UseFigures()
                    .UseTaskLists()
                    .UseCustomContainers()
                    .UseGenericAttributes();
                };
            });

            services.AddMvc()
            .AddApplicationPart(typeof(MarkdownPageProcessorMiddleware).Assembly);
        }
        private MarkdownModel ParseMarkdownToModel(string markdown, MarkdownProcessingFolder folderConfig = null)
        {
            var model = new MarkdownModel();

            if (folderConfig == null)
            {
                folderConfig = new MarkdownProcessingFolder();
            }

            if (folderConfig.ExtractTitle)
            {
                var firstLines     = StringUtils.GetLines(markdown, 30);
                var firstLinesText = String.Join("\n", firstLines);

                // Assume YAML
                if (markdown.StartsWith("---"))
                {
                    var yaml = StringUtils.ExtractString(firstLinesText, "---", "---", returnDelimiters: true);
                    if (yaml != null)
                    {
                        model.Title      = StringUtils.ExtractString(yaml, "title: ", "\n");
                        model.YamlHeader = yaml.Replace("---", "").Trim();
                    }
                }

                if (model.Title == null)
                {
                    foreach (var line in firstLines.Take(10))
                    {
                        if (line.TrimStart().StartsWith("# "))
                        {
                            model.Title = line.TrimStart(new char[] { ' ', '\t', '#' });
                            break;
                        }
                    }
                }
            }

            model.RawMarkdown      = markdown;
            model.RenderedMarkdown = Markdown.ParseHtmlString(markdown);

            return(model);
        }