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()); }
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)); }
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); }
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); }
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)); }
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); }
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); }
public static MarkupResult Parse(MarkupResult markupResult, FileAndType ft, ImmutableDictionary <string, FileAndType> sourceFiles) { return(Parse(markupResult, ft.File, sourceFiles)); }
public MarkupResult Parse(MarkupResult markupResult, FileAndType ft) { return(MarkupUtility.Parse(markupResult, ft.File, SourceFiles)); }
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); }
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); }
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); }