public void ProcessMarkdownResultWithEncodedUrlShouldSucceed()
        {
            var markdownResult = new MarkupResult
            {
                Html = @"<p><a href=""%7E/docs/csharp/language-reference/keywords/select-clause.md""></p>"
            };

            markdownResult = MarkupUtility.Parse(markdownResult, "docs/framework/data/wcf/how-to-project-query-results-wcf-data-services.md", ImmutableDictionary.Create <string, FileAndType>());
            Assert.Equal("~/docs/csharp/language-reference/keywords/select-clause.md", markdownResult.LinkToFiles.First());
        }
        public void ProcessMarkdownResultWithEncodedUrlShouldSucceed(string htmlContent, string expectedFileLink)
        {
            var markdownResult = new MarkupResult
            {
                Html = htmlContent
            };

            markdownResult = MarkupUtility.Parse(markdownResult, "docs/framework/data/wcf/how-to-project-query-results-wcf-data-services.md", ImmutableDictionary.Create <string, FileAndType>());
            Assert.Equal(expectedFileLink, markdownResult.LinkToFiles.First());
        }
示例#3
0
 public MarkupResult Parse(MarkupResult markupResult, FileAndType ft)
 {
     if (markupResult == null)
     {
         throw new ArgumentNullException(nameof(markupResult));
     }
     if (ft == null)
     {
         throw new ArgumentNullException(nameof(ft));
     }
     return(ParseCore(markupResult, ft));
 }
示例#4
0
        public static IList <YamlHtmlPart> SplitYamlHtml(MarkupResult origin)
        {
            var doc = new HtmlDocument();

            doc.LoadHtml(origin.Html);
            var parts = new List <YamlHtmlPart>();

            var nodes = doc.DocumentNode.SelectNodes("//yamlheader");

            if (nodes == null)
            {
                return(parts);
            }

            foreach (var node in nodes)
            {
                var sourceFile = node.GetAttributeValue("sourceFile", "NotFound");
                var startLine  = node.GetAttributeValue("start", -1);
                var endLine    = node.GetAttributeValue("end", -1);

                parts.Add(new YamlHtmlPart
                {
                    Origin     = origin,
                    SourceFile = sourceFile,
                    StartLine  = startLine,
                    EndLine    = endLine
                });
            }

            var startIndexes = nodes.Select(node => node.StreamPosition).Skip(1).ToList();

            startIndexes.Add(origin.Html.Length);
            var endIndexes = nodes.Select(node => node.StreamPosition + node.OuterHtml.Length - 1).ToList();

            for (var i = 0; i < parts.Count; i++)
            {
                if (i == 0)
                {
                    parts[i].Html = origin.Html.Substring(0, startIndexes[0]);
                }
                else
                {
                    parts[i].Html = origin.Html.Substring(startIndexes[i - 1], startIndexes[i] - startIndexes[i - 1]);
                }
                parts[i].Conceptual = origin.Html.Substring(endIndexes[i] + 1, startIndexes[i] - endIndexes[i] - 1);
            }

            return(parts);
        }
示例#5
0
            public MarkupResult Markup(string src, string path)
            {
                var dependency = new HashSet <string>();
                var html       = Builder.CreateDfmEngine(Renderer).Markup(src, path, dependency);
                var result     = new MarkupResult
                {
                    Html = html,
                };

                if (dependency.Count > 0)
                {
                    result.Dependency = dependency.ToImmutableArray();
                }
                return(result);
            }
示例#6
0
 public static MarkupResult Parse(MarkupResult markupResult, string file, ImmutableDictionary <string, FileAndType> sourceFiles)
 {
     if (markupResult == null)
     {
         throw new ArgumentNullException(nameof(markupResult));
     }
     if (file == null)
     {
         throw new ArgumentNullException(nameof(file));
     }
     if (sourceFiles == null)
     {
         throw new ArgumentNullException(nameof(sourceFiles));
     }
     return(ParseCore(markupResult, file, sourceFiles));
 }
示例#7
0
        private static MarkupResult ParseCore(MarkupResult markupResult, string file, ImmutableDictionary <string, FileAndType> sourceFiles)
        {
            var doc = new HtmlDocument();

            doc.LoadHtml(markupResult.Html);
            var result = markupResult.Clone();

            var node = doc.DocumentNode.SelectSingleNode("//yamlheader");

            if (node != null)
            {
                using (var sr = new StringReader(StringHelper.HtmlDecode(node.InnerHtml)))
                {
                    result.YamlHeader = YamlUtility.Deserialize <Dictionary <string, object> >(sr).ToImmutableDictionary();
                }
                node.Remove();
            }

            result.FileLinkSources = GetFileLinkSource(file, doc, sourceFiles);
            result.LinkToFiles     = result.FileLinkSources.Keys.ToImmutableArray();

            result.UidLinkSources = GetUidLinkSources(doc);
            result.LinkToUids     = result.UidLinkSources.Keys.ToImmutableHashSet();

            if (result.Dependency.Length > 0)
            {
                result.Dependency =
                    (from d in result.Dependency
                     select
                         ((RelativePath)file + (RelativePath)d)
                     .GetPathFromWorkingFolder()
                     .ToString()
                    ).ToImmutableArray();
            }
            using (var sw = new StringWriter())
            {
                doc.Save(sw);
                result.Html = sw.ToString();
            }
            return(result);
        }
示例#8
0
            public MarkupResult Markup(string src, string path)
            {
                var dependency = new HashSet <string>();
                var json       = _builder.CreateDfmEngine(new DfmJsonTokenTreeRender()).Markup(src, path, dependency);

                if (json.Length != 0 && json.EndsWith(","))
                {
                    json = json.Remove(json.Length - 1);
                }
                var result = new MarkupResult
                {
                    // TODO: rename
                    Html = $"{{\"name\":\"0>0>markdown\",\"children\":[{json}]}}",
                };

                if (dependency.Count > 0)
                {
                    result.Dependency = dependency.ToImmutableArray();
                }
                return(result);
            }
示例#9
0
 public static MarkupResult Parse(MarkupResult markupResult, FileAndType ft, ImmutableDictionary <string, FileAndType> sourceFiles)
 {
     return(Parse(markupResult, ft.File, sourceFiles));
 }
示例#10
0
 public MarkupResult Parse(MarkupResult markupResult, FileAndType ft)
 {
     return(MarkupUtility.Parse(markupResult, ft.File, SourceFiles));
 }
示例#11
0
        private MarkupResult ParseCore(MarkupResult markupResult, FileAndType ft)
        {
            var doc = new HtmlDocument();

            doc.LoadHtml(markupResult.Html);
            var result = markupResult.Clone();

            var node = doc.DocumentNode.SelectSingleNode("//yamlheader");

            if (node != null)
            {
                using (var sr = new StringReader(StringHelper.HtmlDecode(node.InnerHtml)))
                {
                    result.YamlHeader = YamlUtility.Deserialize <Dictionary <string, object> >(sr).ToImmutableDictionary();
                }
                node.Remove();
            }
            var linkToFiles     = new HashSet <string>();
            var fileLinkSources = new Dictionary <string, List <LinkSourceInfo> >();

            foreach (var pair in (from n in doc.DocumentNode.Descendants()
                                  where !string.Equals(n.Name, "xref", StringComparison.OrdinalIgnoreCase)
                                  from attr in n.Attributes
                                  where string.Equals(attr.Name, "src", StringComparison.OrdinalIgnoreCase) ||
                                  string.Equals(attr.Name, "href", StringComparison.OrdinalIgnoreCase)
                                  where !string.IsNullOrWhiteSpace(attr.Value)
                                  select new { Node = n, Attr = attr }).ToList())
            {
                string linkFile;
                string anchor = null;
                var    link   = pair.Attr;
                if (PathUtility.IsRelativePath(link.Value))
                {
                    var index = link.Value.IndexOf('#');
                    if (index == -1)
                    {
                        linkFile = link.Value;
                    }
                    else if (index == 0)
                    {
                        continue;
                    }
                    else
                    {
                        linkFile = link.Value.Remove(index);
                        anchor   = link.Value.Substring(index);
                    }
                    var path = (RelativePath)ft.File + (RelativePath)linkFile;
                    var file = path.GetPathFromWorkingFolder();
                    if (SourceFiles.ContainsKey(file))
                    {
                        link.Value = file;
                        if (!string.IsNullOrEmpty(anchor) &&
                            string.Equals(link.Name, "href", StringComparison.OrdinalIgnoreCase))
                        {
                            pair.Node.SetAttributeValue("anchor", anchor);
                        }
                    }
                    linkToFiles.Add(HttpUtility.UrlDecode(file));

                    List <LinkSourceInfo> sources;
                    if (!fileLinkSources.TryGetValue(file, out sources))
                    {
                        sources = new List <LinkSourceInfo>();
                        fileLinkSources[file] = sources;
                    }
                    sources.Add(new LinkSourceInfo
                    {
                        Target     = file,
                        SourceFile = pair.Node.GetAttributeValue("sourceFile", null),
                        LineNumber = pair.Node.GetAttributeValue("sourceStartLineNumber", 0),
                    });
                }
            }
            result.LinkToFiles     = linkToFiles.ToImmutableArray();
            result.FileLinkSources = fileLinkSources.ToImmutableDictionary(pair => pair.Key, pair => pair.Value.ToImmutableList());

            result.UidLinkSources = (from n in doc.DocumentNode.Descendants()
                                     where string.Equals(n.Name, "xref", StringComparison.OrdinalIgnoreCase)
                                     from attr in n.Attributes
                                     where string.Equals(attr.Name, "href", StringComparison.OrdinalIgnoreCase) || string.Equals(attr.Name, "uid", StringComparison.OrdinalIgnoreCase)
                                     where !string.IsNullOrWhiteSpace(attr.Value)
                                     select new LinkSourceInfo
            {
                Target = attr.Value,
                SourceFile = n.GetAttributeValue("sourceFile", null),
                LineNumber = n.GetAttributeValue("sourceLineNumber", 0),
            } into lsi
                                     group lsi by lsi.Target into g
                                     select new KeyValuePair <string, ImmutableList <LinkSourceInfo> >(g.Key, g.ToImmutableList())).ToImmutableDictionary();
            result.LinkToUids = result.UidLinkSources.Keys.ToImmutableHashSet();

            if (result.Dependency.Length > 0)
            {
                result.Dependency =
                    (from d in result.Dependency
                     select
                         ((RelativePath)ft.File + (RelativePath)d)
                     .GetPathFromWorkingFolder()
                     .ToString()
                    ).ToImmutableArray();
            }
            using (var sw = new StringWriter())
            {
                doc.Save(sw);
                result.Html = sw.ToString();
            }
            return(result);
        }
示例#12
0
        public MarkupResult ParseHtml(string html, FileAndType ft)
        {
            var doc = new HtmlDocument();

            doc.LoadHtml(html);
            var result = new MarkupResult();

            var node = doc.DocumentNode.SelectSingleNode("//yamlheader");

            if (node != null)
            {
                using (var sr = new StringReader(StringHelper.HtmlDecode(node.InnerHtml)))
                {
                    result.YamlHeader = YamlUtility.Deserialize <Dictionary <string, object> >(sr).ToImmutableDictionary();
                }
                node.Remove();
            }
            var linkToFiles = new HashSet <string>();

            foreach (var pair in (from n in doc.DocumentNode.Descendants()
                                  where !string.Equals(n.Name, "xref", StringComparison.OrdinalIgnoreCase)
                                  from attr in n.Attributes
                                  where string.Equals(attr.Name, "src", StringComparison.OrdinalIgnoreCase) ||
                                  string.Equals(attr.Name, "href", StringComparison.OrdinalIgnoreCase)
                                  where !string.IsNullOrWhiteSpace(attr.Value)
                                  select new { Node = n, Attr = attr }).ToList())
            {
                string linkFile;
                string anchor = null;
                var    link   = pair.Attr;
                if (PathUtility.IsRelativePath(link.Value))
                {
                    var index = link.Value.IndexOf('#');
                    if (index == -1)
                    {
                        linkFile = link.Value;
                    }
                    else if (index == 0)
                    {
                        continue;
                    }
                    else
                    {
                        linkFile = link.Value.Remove(index);
                        anchor   = link.Value.Substring(index);
                    }
                    var path = (RelativePath)ft.File + (RelativePath)linkFile;
                    var file = path.GetPathFromWorkingFolder();
                    if (SourceFiles.ContainsKey(file))
                    {
                        link.Value = file;
                        if (!string.IsNullOrEmpty(anchor) &&
                            string.Equals(link.Name, "href", StringComparison.OrdinalIgnoreCase))
                        {
                            pair.Node.SetAttributeValue("anchor", anchor);
                        }
                    }
                    linkToFiles.Add(HttpUtility.UrlDecode(file));
                }
            }
            result.LinkToFiles = linkToFiles.ToImmutableArray();
            result.LinkToUids  = (from n in doc.DocumentNode.Descendants()
                                  where string.Equals(n.Name, "xref", StringComparison.OrdinalIgnoreCase)
                                  from attr in n.Attributes
                                  where string.Equals(attr.Name, "href", StringComparison.OrdinalIgnoreCase) || string.Equals(attr.Name, "uid", StringComparison.OrdinalIgnoreCase)
                                  where !string.IsNullOrWhiteSpace(attr.Value)
                                  select attr.Value).ToImmutableHashSet();
            using (var sw = new StringWriter())
            {
                doc.Save(sw);
                result.Html = sw.ToString();
            }
            return(result);
        }
示例#13
0
        public MarkupResult MarkupCore(string markdown, FileAndType ft)
        {
            var html = DocfxFlavoredMarked.Markup(markdown, Path.Combine(ft.BaseDir, ft.File));
            var doc  = new HtmlDocument();

            doc.LoadHtml(html);
            var result = new MarkupResult();

            var node = doc.DocumentNode.SelectSingleNode("//yamlheader");

            if (node != null)
            {
                using (var sr = new StringReader(StringHelper.HtmlDecode(node.InnerHtml)))
                {
                    result.YamlHeader = YamlUtility.Deserialize <Dictionary <string, object> >(sr).ToImmutableDictionary();
                }
                node.Remove();
            }
            var linkToFiles = new HashSet <string>();

            foreach (var link in from n in doc.DocumentNode.Descendants()
                     where !string.Equals(n.Name, "xref", StringComparison.OrdinalIgnoreCase)
                     from attr in n.Attributes
                     where string.Equals(attr.Name, "src", StringComparison.OrdinalIgnoreCase) ||
                     string.Equals(attr.Name, "href", StringComparison.OrdinalIgnoreCase)
                     where !string.IsNullOrWhiteSpace(attr.Value)
                     select attr)
            {
                string linkFile;
                string anchor = null;
                if (PathUtility.IsRelativePath(link.Value))
                {
                    var index = link.Value.IndexOf('#');
                    if (index == -1)
                    {
                        linkFile = link.Value;
                    }
                    else if (index == 0)
                    {
                        continue;
                    }
                    else
                    {
                        linkFile = link.Value.Remove(index);
                        anchor   = link.Value.Substring(index);
                    }
                    var path = (RelativePath)ft.File + (RelativePath)linkFile;
                    if (path.ParentDirectoryCount > 0)
                    {
                        Logger.LogError($"Cannot refer path: \"{path}\" out of project.", file: ft.File);
                        throw new DocumentException($"Cannot refer path \"{path}\" out of project in file \"{ft.File}\".");
                    }
                    var file = path.GetPathFromWorkingFolder();
                    link.Value = file + anchor;
                    linkToFiles.Add(HttpUtility.UrlDecode(file));
                }
            }
            result.LinkToFiles = linkToFiles.ToImmutableArray();
            result.LinkToUids  = (from n in doc.DocumentNode.Descendants()
                                  where string.Equals(n.Name, "xref", StringComparison.OrdinalIgnoreCase)
                                  from attr in n.Attributes
                                  where string.Equals(attr.Name, "href", StringComparison.OrdinalIgnoreCase)
                                  where !string.IsNullOrWhiteSpace(attr.Value)
                                  select attr.Value).ToImmutableHashSet();
            using (var sw = new StringWriter())
            {
                doc.Save(sw);
                result.Html = sw.ToString();
            }
            return(result);
        }