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); }
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); }