예제 #1
0
        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", "&#x6d;", "&#109;" };
            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("<*****@*****.**>"));
        }
예제 #2
0
        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("* * *"));
        }
예제 #3
0
        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](/'*_[]()/)"));
        }
예제 #4
0
        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"));
        }
예제 #5
0
 public void Test()
 {
     using (var parser = new MarkdownParser())
     {
         var html = parser.Transform("H1\n==");
     }
 }
예제 #6
0
        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);
            }
        }
예제 #7
0
        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"));
        }
예제 #8
0
        /// <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));
        }
예제 #10
0
        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"));
        }
예제 #11
0
        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));
        }
예제 #12
0
 public void HeadingTest(string markdown, string expected)
 {
     using (var parser = new MarkdownParser())
     {
         var html = parser.Transform(markdown);
         Assert.AreEqual(expected, html);
     }
 }
예제 #13
0
        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)));
        }
예제 #14
0
        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)));
        }
예제 #15
0
        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"));
        }
예제 #16
0
        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"));
        }
예제 #17
0
 public ContentResult ConvertToHtml(string markdown)
 {
     using (var parser = new MarkdownParser())
     {
         return(new ContentResult
         {
             Content = parser.Transform(markdown),
             ContentEncoding = Encoding.UTF8,
             ContentType = "text/html"
         });
     }
 }
예제 #18
0
        /// <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);
        }
예제 #19
0
        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");
        }
예제 #20
0
        /// <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)");
            }
        }
예제 #21
0
        /// <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");
            }
        }
예제 #22
0
        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");
        }
예제 #23
0
        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));
        }
예제 #24
0
        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);
                    }
                });
        }
예제 #26
0
        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);
        }
예제 #27
0
 public ContentResult ConvertToHtml(string markdown)
 {
     using (var parser = new MarkdownParser())
     {
         return new ContentResult
         {
             Content = parser.Transform(markdown),
             ContentEncoding = Encoding.UTF8,
             ContentType = "text/html"
         };
     }
 }