public void TestLinkEmails() { var markdown = new MarkdownParser(); Assert.IsTrue(markdown.LinkEmails); //when transforming an email, the email address link is encoded a bit randomly to protect the email address //from simple email scanners var transform = markdown.Transform("<*****@*****.**>"); var possibleTranslationsForM = new[] { "m", "m", "m" }; var acceptableTransformationFound = false; for (var i = 0; !acceptableTransformationFound && i < possibleTranslationsForM.Length; i++) { var expected = "<p><a href=\"" + possibleTranslationsForM[i]; var actual = transform.Substring(0, expected.Length); if (string.Equals(actual, expected)) { acceptableTransformationFound = true; } } Assert.IsTrue(acceptableTransformationFound, "Transformation of email was not successful. Actual:" + transform); markdown.LinkEmails = false; Assert.AreEqual("<p><*****@*****.**></p>\n", markdown.Transform("<*****@*****.**>")); }
public void TestEmptyElementSuffix() { var markdown = new MarkdownParser(); Assert.AreEqual(" />", markdown.EmptyElementSuffix); Assert.AreEqual("<hr />\n", markdown.Transform("* * *")); markdown.EmptyElementSuffix = ">"; Assert.AreEqual("<hr>\n", markdown.Transform("* * *")); }
public void TestEncodeProblemUrlCharacters() { var markdown = new MarkdownParser(); Assert.IsFalse(markdown.EncodeProblemUrlCharacters); Assert.AreEqual("<p><a href=\"/'*_[]()/\">Foo</a></p>\n", markdown.Transform("[Foo](/'*_[]()/)")); markdown.EncodeProblemUrlCharacters = true; Assert.AreEqual("<p><a href=\"/%27%2a%5f%5b%5d%28%29/\">Foo</a></p>\n", markdown.Transform("[Foo](/'*_[]()/)")); }
public void TestAutoNewLines() { var markdown = new MarkdownParser(); Assert.IsFalse(markdown.AutoNewLines); Assert.AreEqual("<p>Line1\nLine2</p>\n", markdown.Transform("Line1\nLine2")); markdown.AutoNewLines = true; Assert.AreEqual("<p>Line1<br />\nLine2</p>\n", markdown.Transform("Line1\nLine2")); }
public void Test() { using (var parser = new MarkdownParser()) { var html = parser.Transform("H1\n=="); } }
public void Test(string markdownName) { var m = new MarkdownParser(); var markdownContent = GetResourceFileContent(markdownName); var actualContent = m.Transform(markdownContent); var actualContentWithoutWhitespace = Program.RemoveWhitespace(actualContent); var expectedName = Path.ChangeExtension(markdownName, "html"); var expectedContent = GetResourceFileContent(expectedName); if (expectedContent == null) { Console.Write(actualContent); Assert.Fail($"No expected content is defined, please specify a file named '{expectedName}'"); } else { var expectedContentWithoutWhitespace = Program.RemoveWhitespace(expectedContent); Assert.That(actualContentWithoutWhitespace, Is.EqualTo(expectedContentWithoutWhitespace), "Mismatch between '{0}' and the transformed '{1}'.", markdownName, expectedName); } }
public async Task <ActionResult> Publish(DraftEditModel model) { ModelState.Clear(); model.EntryMode = EntryMode.PublishItem; TryValidateModel(model); if (!ModelState.IsValid) { using (var parser = new MarkdownParser()) { model.Html = parser.Transform(model.Body); return(View("Edit", model)); } } var draft = await _draftDbCommand.FindAsync(model.Id, LogonUser) ?? Draft.NewDraft(LogonUser, model.ItemType); Mapper.Map(model, draft); var item = draft.ToItem(); item.PublishSince = model.PublishSince; item.PublishUntil = model.PublishUntil; await _itemDbCommand.SaveAsync(item); await _draftDbCommand.DeleteAsync(draft.Id, LogonUser); return(RedirectToAction("Index", "Item")); }
/// <summary> /// Processes markdown syntax from a source /// </summary> /// <returns>The processed source as Unity rich text</returns> /// <param name="source">Source text featuring markdown syntax</param> public string ProcessSource(string source) { _markdownParser = new MarkdownParser(); _processedText = _markdownParser.Transform(source); _hasContent = true; return(_processedText); }
private static void CreateCommentModelsMap() { Mapper.CreateMap<Comment, CommentViewModel>() .ForMember(d => d.CommentId, o => o.MapFrom(s => s.Id)) .ForMember(d => d.CommentUserName, o => o.MapFrom(s => s.User.Name)) .ForMember(d => d.CommentUserDisplayName, o => o.MapFrom(s => s.User.DisplayName)) .ForMember(d => d.CommentUserIconUrl, o => o.MapFrom(s => s.User.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.CommentCreatedDateTime, o => o.MapFrom(s => s.CreatedDateTime)) .ForMember(d => d.CommentLastModifiedDateTime, o => o.MapFrom(s => s.LastModifiedDateTime)) .AfterMap((s, d) => { using (var parser = new MarkdownParser()) { d.CommentHtmlBody = parser.Transform(s.Body); } }); Mapper.CreateMap<Comment, CommentEditModel>() .ForMember(d => d.CommentId, o => o.MapFrom(s => s.Id)) .ForMember(d => d.CommentBody, o => o.MapFrom(s => s.Body)) .AfterMap((s, d) => { using (var parser = new MarkdownParser()) { d.CommentHtmlBody = parser.Transform(s.Body); } }); Mapper.CreateMap<CommentEditModel, Comment>() .ForMember(d => d.Id, o => o.MapFrom(s => s.CommentId)) .ForMember(d => d.Body, o => o.MapFrom(s => s.CommentBody)); }
public async Task <ActionResult> Save(DraftEditModel model) { ModelState.Clear(); model.EntryMode = EntryMode.SaveDraft; TryValidateModel(model); if (!ModelState.IsValid) { using (var parser = new MarkdownParser()) { model.Html = parser.Transform(model.Body); return(View("Edit", model)); } } var draft = await _draftDbCommand.FindAsync(model.Id, LogonUser) ?? Draft.NewDraft(LogonUser, model.ItemType); Mapper.Map(model, draft); draft.LastModifiedDateTime = DateTime.Now; await _draftDbCommand.SaveAsync(draft); return(RedirectToAction("Index", "Draft")); }
private static void CreateCommentModelsMap() { Mapper.CreateMap <Comment, CommentViewModel>() .ForMember(d => d.CommentId, o => o.MapFrom(s => s.Id)) .ForMember(d => d.CommentUserName, o => o.MapFrom(s => s.User.Name)) .ForMember(d => d.CommentUserDisplayName, o => o.MapFrom(s => s.User.DisplayName)) .ForMember(d => d.CommentUserIconUrl, o => o.MapFrom(s => s.User.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.CommentCreatedDateTime, o => o.MapFrom(s => s.CreatedDateTime)) .ForMember(d => d.CommentLastModifiedDateTime, o => o.MapFrom(s => s.LastModifiedDateTime)) .AfterMap((s, d) => { using (var parser = new MarkdownParser()) { d.CommentHtmlBody = parser.Transform(s.Body); } }); Mapper.CreateMap <Comment, CommentEditModel>() .ForMember(d => d.CommentId, o => o.MapFrom(s => s.Id)) .ForMember(d => d.CommentBody, o => o.MapFrom(s => s.Body)) .AfterMap((s, d) => { using (var parser = new MarkdownParser()) { d.CommentHtmlBody = parser.Transform(s.Body); } }); Mapper.CreateMap <CommentEditModel, Comment>() .ForMember(d => d.Id, o => o.MapFrom(s => s.CommentId)) .ForMember(d => d.Body, o => o.MapFrom(s => s.CommentBody)); }
public void HeadingTest(string markdown, string expected) { using (var parser = new MarkdownParser()) { var html = parser.Transform(markdown); Assert.AreEqual(expected, html); } }
private static void CreateItemModelsMap() { const string askTitlePrefix = @"質問: "; Mapper.CreateMap <Item, ItemIndexModel>() .ForMember(d => d.AuthorName, o => o.MapFrom(s => s.Author.Name)) .ForMember(d => d.AuthorDisplayName, o => o.MapFrom(s => s.Author.DisplayName)) .ForMember(d => d.AuthorIconUrl, o => o.MapFrom(s => s.Author.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.EditorName, o => o.MapFrom(s => s.Editor.Name)) .ForMember(d => d.EditorDisplayName, o => o.MapFrom(s => s.Editor.DisplayName)) .ForMember(d => d.EditorIconUrl, o => o.MapFrom(s => s.Editor.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.Title, o => o.Ignore()) .AfterMap((s, d) => { d.Title = ((s.Type == ItemType.Ask) ? askTitlePrefix : "") + s.Title; }); Mapper.CreateMap <Item, ItemViewModel>() .ForMember(d => d.AuthorName, o => o.MapFrom(s => s.Author.Name)) .ForMember(d => d.AuthorDisplayName, o => o.MapFrom(s => s.Author.DisplayName)) .ForMember(d => d.AuthorIconUrl, o => o.MapFrom(s => s.Author.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.EditorName, o => o.MapFrom(s => s.Editor.Name)) .ForMember(d => d.EditorDisplayName, o => o.MapFrom(s => s.Editor.DisplayName)) .ForMember(d => d.EditorIconUrl, o => o.MapFrom(s => s.Editor.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .AfterMap((s, d) => { d.DisplayTitle = ((s.Type == ItemType.Ask) ? askTitlePrefix : "") + s.Title; using (var parser = new MarkdownParser()) { d.HtmlBody = parser.Transform(s.Body); } }); Mapper.CreateMap <ItemRevision, ItemRevisionDetailModel>() .ForMember(d => d.AuthorName, o => o.MapFrom(s => s.Author.Name)) .ForMember(d => d.AuthorDisplayName, o => o.MapFrom(s => s.Author.DisplayName)) .ForMember(d => d.AuthorIconUrl, o => o.MapFrom(s => s.Author.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.EditorName, o => o.MapFrom(s => s.Editor.Name)) .ForMember(d => d.EditorDisplayName, o => o.MapFrom(s => s.Editor.DisplayName)) .ForMember(d => d.EditorIconUrl, o => o.MapFrom(s => s.Editor.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.Comment, o => o.Ignore()) .AfterMap((s, d) => { if (s.IsFirst && string.IsNullOrWhiteSpace(s.Comment)) { d.Comment = "投稿"; return; } d.Comment = string.IsNullOrWhiteSpace(s.Comment) ? "(コメントなし)" : s.Comment; }); Mapper.CreateMap <Item, ItemEditCollaboratorsModel>() .ForMember(d => d.AuthorName, o => o.MapFrom(s => s.Author.Name)) .ForMember(d => d.AuthorDisplayName, o => o.MapFrom(s => s.Author.DisplayName)) .ForMember(d => d.AuthorIconUrl, o => o.MapFrom(s => s.Author.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.Collaborators, o => o.MapFrom(s => Mapper.Map <IEnumerable <CollaboratorEditModel> >(s.Collaborators))); }
private static void CreateItemModelsMap() { const string askTitlePrefix = @"質問: "; Mapper.CreateMap<Item, ItemIndexModel>() .ForMember(d => d.AuthorName, o => o.MapFrom(s => s.Author.Name)) .ForMember(d => d.AuthorDisplayName, o => o.MapFrom(s => s.Author.DisplayName)) .ForMember(d => d.AuthorIconUrl, o => o.MapFrom(s => s.Author.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.EditorName, o => o.MapFrom(s => s.Editor.Name)) .ForMember(d => d.EditorDisplayName, o => o.MapFrom(s => s.Editor.DisplayName)) .ForMember(d => d.EditorIconUrl, o => o.MapFrom(s => s.Editor.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.Title, o => o.Ignore()) .AfterMap((s, d) => { d.Title = ((s.Type == ItemType.Ask) ? askTitlePrefix : "") + s.Title; }); Mapper.CreateMap<Item, ItemViewModel>() .ForMember(d => d.AuthorName, o => o.MapFrom(s => s.Author.Name)) .ForMember(d => d.AuthorDisplayName, o => o.MapFrom(s => s.Author.DisplayName)) .ForMember(d => d.AuthorIconUrl, o => o.MapFrom(s => s.Author.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.EditorName, o => o.MapFrom(s => s.Editor.Name)) .ForMember(d => d.EditorDisplayName, o => o.MapFrom(s => s.Editor.DisplayName)) .ForMember(d => d.EditorIconUrl, o => o.MapFrom(s => s.Editor.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .AfterMap((s, d) => { d.DisplayTitle = ((s.Type == ItemType.Ask) ? askTitlePrefix : "") + s.Title; using (var parser = new MarkdownParser()) { d.HtmlBody = parser.Transform(s.Body); } }); Mapper.CreateMap<ItemRevision, ItemRevisionDetailModel>() .ForMember(d => d.AuthorName, o => o.MapFrom(s => s.Author.Name)) .ForMember(d => d.AuthorDisplayName, o => o.MapFrom(s => s.Author.DisplayName)) .ForMember(d => d.AuthorIconUrl, o => o.MapFrom(s => s.Author.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.EditorName, o => o.MapFrom(s => s.Editor.Name)) .ForMember(d => d.EditorDisplayName, o => o.MapFrom(s => s.Editor.DisplayName)) .ForMember(d => d.EditorIconUrl, o => o.MapFrom(s => s.Editor.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.Comment, o => o.Ignore()) .AfterMap((s, d) => { if (s.IsFirst && string.IsNullOrWhiteSpace(s.Comment)) { d.Comment = "投稿"; return; } d.Comment = string.IsNullOrWhiteSpace(s.Comment) ? "(コメントなし)" : s.Comment; }); Mapper.CreateMap<Item, ItemEditCollaboratorsModel>() .ForMember(d => d.AuthorName, o => o.MapFrom(s => s.Author.Name)) .ForMember(d => d.AuthorDisplayName, o => o.MapFrom(s => s.Author.DisplayName)) .ForMember(d => d.AuthorIconUrl, o => o.MapFrom(s => s.Author.IconUrl ?? GlobalSettings.NoImageUserIconUrl)) .ForMember(d => d.Collaborators, o => o.MapFrom(s => Mapper.Map<IEnumerable<CollaboratorEditModel>>(s.Collaborators))); }
public void TestStrictBoldItalic() { var markdown = new MarkdownParser(); Assert.IsFalse(markdown.StrictBoldItalic); Assert.AreEqual("<p>before<strong>bold</strong>after before<em>italic</em>after</p>\n", markdown.Transform("before**bold**after before_italic_after")); markdown.StrictBoldItalic = true; Assert.AreEqual("<p>before*bold*after before_italic_after</p>\n", markdown.Transform("before*bold*after before_italic_after")); }
public void TestAutoHyperlink() { var markdown = new MarkdownParser(); Assert.IsFalse(markdown.AutoHyperlink); Assert.AreEqual("<p>foo http://example.com bar</p>\n", markdown.Transform("foo http://example.com bar")); markdown.AutoHyperlink = true; Assert.AreEqual("<p>foo <a href=\"http://example.com\">http://example.com</a> bar</p>\n", markdown.Transform("foo http://example.com bar")); }
public ContentResult ConvertToHtml(string markdown) { using (var parser = new MarkdownParser()) { return(new ContentResult { Content = parser.Transform(markdown), ContentEncoding = Encoding.UTF8, ContentType = "text/html" }); } }
/// <summary> /// mini test harness for one-liner Markdown bug repros /// for anything larger, I recommend using the folder based approach and Test() /// </summary> private static void AdHocTest() { var m = new MarkdownParser(); //var m = new MarkdownSharp.MarkdownOld(); //string input = "<div class=\"inlinepage\">\n<div class=\"toggleableend\">\nfoo\n</div>\n</div>"; //string input = "Same thing but with paragraphs:\n\n1. First\n\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n\n3. Third\n\n"; //string input = "*\tthis\n\n\t*\tsub\n\n\tthat"; //string input = "1. one\n\n code<t>\n\n2. two\n\n code<t>\n indented-12-spaces<t>\n\n"; string input = "\n\n code<t>\n"; string output = m.Transform(input); Console.WriteLine("input:"); Console.WriteLine(input); Console.WriteLine("output:"); Console.WriteLine(output); }
public async Task<ActionResult> Save(DraftEditModel model) { model.EntryMode = EntryMode.SaveDraft; TryValidateModel(model); if (!ModelState.IsValid) { using (var parser = new MarkdownParser()) { model.Html = parser.Transform(model.Body); return View("Edit", model); } } var draft = await _draftDbCommand.FindAsync(model.Id) ?? Draft.NewDraft(LogonUser, model.ItemType); Mapper.Map(model, draft); draft.LastModifiedDateTime = DateTime.Now; await _draftDbCommand.SaveAsync(draft); return RedirectToAction("Index", "Draft"); }
/// <summary> /// performs a rough benchmark of the Markdown engine using small, medium, and large input samples /// please DO NOT MODIFY the input samples or the benchmark itself as this will invalidate previous /// benchmark runs! /// </summary> static void Benchmark(string text, int iterations) { var m = new MarkdownParser(); var sw = new Stopwatch(); sw.Start(); for (int i = 0; i < iterations; i++) { m.Transform(text); } sw.Stop(); Console.WriteLine("input string length: " + text.Length); Console.Write(iterations + " iteration" + (iterations == 1 ? "" : "s") + " in " + sw.ElapsedMilliseconds + " ms"); if (iterations == 1) { Console.WriteLine(); } else { Console.WriteLine(" (" + Convert.ToDouble(sw.ElapsedMilliseconds) / Convert.ToDouble(iterations) + " ms per iteration)"); } }
/// <summary> /// iterates through all the test files in a given folder and generates file-based output /// this is essentially the same as running the unit tests, but with diff-able results /// </summary> /// <remarks> /// two files should be present for each test: /// /// test_name.text -- input (raw markdown) /// test_name.html -- output (expected cooked html output from reference markdown engine) /// /// this file will be generated if, and ONLY IF, the expected output does not match the actual output: /// /// test_name.xxxx.actual.html -- actual output (actual cooked html output from our markdown c# engine) /// -- xxxx is the 16-bit CRC checksum of the file contents; this is included /// so you can tell if the contents of a failing test have changed /// </remarks> static void Test(string testfolder) { var m = new MarkdownParser(); Console.WriteLine(); Console.WriteLine(@"MarkdownSharp v" + m.Version + @" test run on " + Path.DirectorySeparatorChar + testfolder); Console.WriteLine(); string path = Path.Combine(ExecutingAssemblyPath, Path.Combine("testfiles", testfolder)); string output; string expected; string actualpath; int ok = 0; int okalt = 0; int err = 0; int errnew = 0; int total = 0; foreach (var file in Directory.GetFiles(path, "*.text")) { expected = FileContents(Path.ChangeExtension(file, "html")); output = m.Transform(FileContents(file)); actualpath = Path.ChangeExtension(file, GetCrc16(output) + ".actual.html"); total++; Console.Write(String.Format("{0:000} {1,-55}", total, Path.GetFileNameWithoutExtension(file))); if (output == expected) { ok++; Console.WriteLine("OK"); } else if (RemoveWhitespace(output) == RemoveWhitespace(expected)) { ok++; okalt++; Console.WriteLine("OK^"); if (!File.Exists(actualpath)) { File.WriteAllText(actualpath, output); } } else { err++; if (File.Exists(actualpath)) { Console.WriteLine("Mismatch"); } else { errnew++; Console.WriteLine("Mismatch *NEW*"); File.WriteAllText(actualpath, output); } } } Console.WriteLine(); Console.WriteLine("Tests : " + total); if (okalt > 0) { Console.WriteLine("OK : " + ok + " (^ " + okalt + " whitespace differences)"); } else { Console.WriteLine("OK : " + ok); } Console.Write("Mismatch : " + err); if (errnew > 0) { Console.WriteLine(" (" + errnew + " *NEW*)"); } else { Console.WriteLine(); } if (errnew > 0) { Console.WriteLine(); Console.WriteLine("for each mismatch, an *.actual.html file was generated in"); Console.WriteLine(path); Console.WriteLine("to troubleshoot mismatches, use a diff tool on *.html and *.actual.html"); } }
public async Task<ActionResult> Publish(DraftEditModel model) { ModelState.Clear(); model.EntryMode = EntryMode.PublishItem; TryValidateModel(model); if (!ModelState.IsValid) { using (var parser = new MarkdownParser()) { model.Html = parser.Transform(model.Body); return View("Edit", model); } } var draft = await _draftDbCommand.FindAsync(model.Id, LogonUser) ?? Draft.NewDraft(LogonUser, model.ItemType); Mapper.Map(model, draft); var item = draft.ToItem(); item.PublishSince = model.PublishSince; item.PublishUntil = model.PublishUntil; await _itemDbCommand.SaveAsync(item); await _draftDbCommand.DeleteAsync(draft.Id, LogonUser); return RedirectToAction("Index", "Item"); }
public override string BeforeParse(string markdown) { var mdParser = new MarkdownParser(); List <string> lines = new List <string>(markdown.Split('\n')); List <Table> tables = new List <Table>(); tables.Add(new Table()); for (int i = 0; i < lines.Count; i++) { string line = lines[i].Trim(); if (line.StartsWith("|") && line.EndsWith("|")) { if (tables[tables.Count - 1].Begin == -1) { tables[tables.Count - 1].Begin = i; } } else if (tables[tables.Count - 1].End == -1) { if (tables[tables.Count - 1].Begin != -1) { tables[tables.Count - 1].End = i - 1; tables.Add(new Table()); } } } if (tables[tables.Count - 1].Begin == -1) { tables.RemoveAt(tables.Count - 1); } else if (tables[tables.Count - 1].End == -1) { tables[tables.Count - 1].End = lines.Count - 1; } for (int i = tables.Count - 1; i >= 0; i--) { tables[i].Rows = lines.GetRange(tables[i].Begin, tables[i].End - tables[i].Begin + 1); lines.RemoveRange(tables[i].Begin, tables[i].End - tables[i].Begin + 1); tables[i].Html += "<table>"; List <string> aligns = new List <string>(); foreach (string cell in tables[i].Rows[1].Trim().Trim('|').Split('|')) { if (cell.StartsWith(":") && !cell.EndsWith(":")) { aligns.Add("left"); } else if (cell.StartsWith(":") && cell.EndsWith(":")) { aligns.Add("center"); } else if (!cell.StartsWith(":") && cell.EndsWith(":")) { aligns.Add("right"); } else { aligns.Add(""); } } string[] cells; tables[i].Html += "<thead>"; tables[i].Html += "<tr>"; cells = tables[i].Rows[0].Trim().Trim('|').Split('|'); for (int j = 0; j < cells.Length; j++) { tables[i].Html += (aligns[j].Length != 0 ? "<th style=\"text-align: " + aligns[j] + "\">" : "<th>") + mdParser.Transform(cells[j].Trim()) + "</th>"; } tables[i].Html += "</tr>"; tables[i].Html += "</thead>"; tables[i].Html += "<tbody>"; foreach (string row in tables[i].Rows.GetRange(2, tables[i].Rows.Count - 2)) { tables[i].Html += "<tr>"; cells = row.Trim().Trim('|').Split('|'); for (int j = 0; j < cells.Length; j++) { tables[i].Html += (aligns[j].Length != 0 ? "<td style=\"text-align: " + aligns[j] + "\">" : "<td>") + mdParser.Transform(cells[j].Trim()) + "</td>"; } tables[i].Html += "</tr>"; } tables[i].Html += "</tbody>"; tables[i].Html += "</table>"; lines.Insert(tables[i].Begin, tables[i].Html); } return(string.Join("\n", lines)); }
private static void CreateDraftModelsMap() { const string unTitled = "タイトル未設定"; Mapper.CreateMap <Draft, DraftIndexModel>() .ForMember(d => d.Title, o => o.Ignore()) .AfterMap((s, d) => { if (string.IsNullOrWhiteSpace(s.Title)) { d.Title = unTitled; d.UnTitled = true; } else { d.Title = s.Title; d.UnTitled = false; } }); Mapper.CreateMap <Draft, DraftPreviewModel>() .ForMember(d => d.Title, o => o.Ignore()) .AfterMap((s, d) => { if (string.IsNullOrWhiteSpace(s.Title)) { d.Title = unTitled; d.UnTitled = true; } else { d.Title = s.Title; d.UnTitled = false; } using (var parser = new MarkdownParser()) { d.Html = parser.Transform(s.Body); } }); Mapper.CreateMap <Draft, DraftEditModel>() .ForMember(d => d.ItemType, o => o.MapFrom(s => s.Type)) .AfterMap((s, d) => { if (s.IsContributed) { d.ItemIsPrivate = !s.ItemIsPublic; } else { d.ItemIsPrivate = false; } using (var parser = new MarkdownParser()) { d.Html = parser.Transform(s.Body); } var isFirst = true; foreach (var tag in s.Tags) { if (!isFirst) { d.TagInlineString += " "; } d.TagInlineString += tag.Name; if (tag.Version != null) { d.TagInlineString += string.Format("[{0}]", tag.Version); } isFirst = false; } }); Mapper.CreateMap <DraftEditModel, Draft>() .ForMember(d => d.Type, o => o.MapFrom(s => s.ItemType)) .ForMember(d => d.ItemIsPublic, o => o.MapFrom(s => !s.ItemIsPrivate)) .ForMember(d => d.CurrentRevisionNo, o => o.Ignore()) .AfterMap((s, d) => { d.Tags.Clear(); foreach (var tag in s.CreateTagCollectionFromInlineText()) { d.Tags.Add(tag); } }); }
private static void CreateDraftModelsMap() { const string unTitled = "タイトル未設定"; Mapper.CreateMap<Draft, DraftIndexModel>() .ForMember(d => d.Title, o => o.Ignore()) .AfterMap((s, d) => { if (string.IsNullOrWhiteSpace(s.Title)) { d.Title = unTitled; d.UnTitled = true; } else { d.Title = s.Title; d.UnTitled = false; } }); Mapper.CreateMap<Draft, DraftPreviewModel>() .ForMember(d => d.Title, o => o.Ignore()) .AfterMap((s, d) => { if (string.IsNullOrWhiteSpace(s.Title)) { d.Title = unTitled; d.UnTitled = true; } else { d.Title = s.Title; d.UnTitled = false; } using (var parser = new MarkdownParser()) { d.Html = parser.Transform(s.Body); } }); Mapper.CreateMap<Draft, DraftEditModel>() .ForMember(d => d.ItemType, o => o.MapFrom(s => s.Type)) .AfterMap((s, d) => { if (s.IsContributed) { d.ItemIsPrivate = !s.ItemIsPublic; } else { d.ItemIsPrivate = false; } using (var parser = new MarkdownParser()) { d.Html = parser.Transform(s.Body); } var isFirst = true; foreach (var tag in s.ItemTags) { if (!isFirst) d.TagInlineString += " "; d.TagInlineString += tag.Name; if (tag.Version != null) d.TagInlineString += string.Format("[{0}]", tag.Version); isFirst = false; } }); Mapper.CreateMap<DraftEditModel, Draft>() .ForMember(d => d.Type, o => o.MapFrom(s => s.ItemType)) .ForMember(d => d.ItemIsPublic, o => o.MapFrom(s => !s.ItemIsPrivate)) .ForMember(d => d.CurrentRevisionNo, o => o.Ignore()) .AfterMap((s, d) => { d.ItemTags.Clear(); foreach (var tag in s.CreateTagCollectionFromInlineText()) { d.ItemTags.Add(tag); } }); }
public void Bold() { var input = "This is **bold**. This is also __bold__."; var expected = "<p>This is <strong>bold</strong>. This is also <strong>bold</strong>.</p>\n"; var actual = m.Transform(input); Assert.AreEqual(expected, actual); }
public ContentResult ConvertToHtml(string markdown) { using (var parser = new MarkdownParser()) { return new ContentResult { Content = parser.Transform(markdown), ContentEncoding = Encoding.UTF8, ContentType = "text/html" }; } }