/// <summary> /// Renders to string. /// </summary> /// <param name="markdownPage">The markdown page.</param> /// <param name="scopeArgs">The scope arguments.</param> /// <param name="renderHtml">if set to <c>true</c> [render HTML].</param> /// <returns></returns> public static string RenderToString(this MarkdownPage markdownPage, Dictionary<string, object> scopeArgs, bool renderHtml) { var sb = new StringBuilder(); using (var writer = new StringWriter(sb)) { var pageContext = new PageContext(markdownPage, scopeArgs, renderHtml); markdownPage.Write(writer, pageContext); } return sb.ToString(); }
/// <summary> /// Writes the specified text writer. /// </summary> /// <param name="textWriter">The text writer.</param> /// <param name="pageContext">The page context.</param> /// <exception cref="System.ArgumentNullException">textWriter</exception> public void Write(TextWriter textWriter, PageContext pageContext) { if (textWriter == null) throw new ArgumentNullException("textWriter"); if (pageContext == null) pageContext = new PageContext(this, new Dictionary<string, object>(), true); var blocks = pageContext.RenderHtml ? this.HtmlBlocks : this.MarkdownBlocks; if (Interlocked.Increment(ref timesRun) == 1) { lock (readWriteLock) { try { isBusy = true; this.ExecutionContext.BaseType = Markdown.MarkdownBaseType; this.ExecutionContext.TypeProperties = Markdown.MarkdownGlobalHelpers; pageContext.MarkdownPage = this; var initHtmlContext = pageContext.Create(this, true); var initMarkdownContext = pageContext.Create(this, false); foreach (var block in this.HtmlBlocks) { block.DoFirstRun(initHtmlContext); } foreach (var block in this.MarkdownBlocks) { block.DoFirstRun(initMarkdownContext); } this.evaluator = this.ExecutionContext.Build(); foreach (var block in this.HtmlBlocks) { block.AfterFirstRun(evaluator); } foreach (var block in this.MarkdownBlocks) { block.AfterFirstRun(evaluator); } AddDependentPages(blocks); initException = null; hasCompletedFirstRun = true; } catch (Exception ex) { initException = ex; throw; } finally { isBusy = false; } } } lock (readWriteLock) { while (isBusy) Monitor.Wait(readWriteLock); } if (initException != null) { timesRun = 0; throw initException; } MarkdownViewBase instance = null; if (this.evaluator != null) { instance = (MarkdownViewBase)this.evaluator.CreateInstance(); object model; pageContext.ScopeArgs.TryGetValue(ModelName, out model); instance.Init(Markdown.AppHost, this, pageContext.ScopeArgs, model, pageContext.RenderHtml); instance.ViewEngine = Markdown; } foreach (var block in blocks) { block.Write(instance, textWriter, pageContext.ScopeArgs); } if (instance != null) { instance.OnLoad(); } }