private Topic ReadTopic(XmlReader reader, DirectoryPath root) { var file = reader.GetAttribute("file"); var url = reader.GetAttribute("importurl"); if (string.IsNullOrWhiteSpace(file) && string.IsNullOrWhiteSpace(url)) { return(null); } var id = reader.GetAttribute("id"); var title = reader.GetAttribute("title"); var hidden = string.Equals("true", reader.GetAttribute("hidden"), StringComparison.OrdinalIgnoreCase); if (string.IsNullOrWhiteSpace(id)) { if (!string.IsNullOrWhiteSpace(url)) { throw new InvalidOperationException("A remote document require a local ID."); } if (!string.IsNullOrWhiteSpace(file)) { id = Path.GetFileNameWithoutExtension(file); } else if (!string.IsNullOrWhiteSpace(title)) { id = title.ToSlug(); } else { throw new InvalidOperationException("Could not generate ID from topic."); } } var body = ReadBody(root, file, url) ?? string.Empty; if (!string.IsNullOrWhiteSpace(body)) { // Read the file and separate front matter from content. var content = _contentParser.ParseString(body); if (content != null) { body = _contentProcessor.PreProcess(content.Body); body = _contentConverter.ConvertToHtml(content, body); } // Process the content. body = _contentProcessor.PostProcess(body) ?? body; } return(new Topic(id, title, body, hidden, file, url)); }