public static DirectoryModel GenerateDirectoryStructure(string path) { DirectoryModel directory = new DirectoryModel(); directory.Path = path; directory.Name = System.IO.Path.GetDirectoryName(path); string[] files = Directory.GetFiles(path, "*.*", SearchOption.TopDirectoryOnly) .Where(file => file.EndsWith(".htm") || file.EndsWith(".html")) .ToArray(); foreach (string file in files) { if (!file.Contains("~$")) { directory.Files.Add(file, System.IO.Path.GetFileNameWithoutExtension(file)); } } string[] subdirectories = Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly); if (subdirectories.Count() > 0) { foreach (string subdirectory in subdirectories) { if (Directory.GetFiles(directory.Path, "*", SearchOption.AllDirectories).Count() > 0) { DirectoryModel generatedDirectory = GenerateDirectoryStructure(subdirectory); if(!generatedDirectory.Path.EndsWith("_files")) directory.Subdirectories.Add(generatedDirectory); } } } return directory; }
/// <summary> /// Traverse the directory structure present in provided DirectoryModel and /// create HTML that will represent the directories and files that are found. /// </summary> /// <param name="directory">Directory containing subdirectories and articles.</param> /// <param name="listFileDoc">Object representing HTML document.</param> /// <param name="directoryDiv">Container representing div that will contain categories and articles.</param> /// <param name="isSourceDir">Bool representing whether directoryDiv, is parent directory of article directory structure.</param> static void GenerateHTML(DirectoryModel directory, HtmlDocument listFileDoc, HtmlNode directoryContainerDiv, bool isSourceDir, ref int index, string categoriesUrlText) { // Hash directory path to be used as unique identifier for // folder div's id attribute index++; string encryptedPath = EncryptStrings.EncryptToMD5String(directory.Path); // Create div that will hold folder icon and directory name HtmlNode directoryDiv = listFileDoc.CreateElement("div"); // Container for categories (subdirectories) and article links. directoryDiv.SetAttributeValue("class", "directory"); directoryDiv.SetAttributeValue("id", encryptedPath); // Check whether or not current directory, is the parent node // of article directory structure (as this is first container to be seen) string style = isSourceDir ? String.Format("z-index: {0};", index) : String.Format("z-index: -{0}; display: none", index); directoryDiv.SetAttributeValue("style", style); // div to hold category header and links to roll back to previous views HtmlNode directoryCategoryContainer = listFileDoc.CreateElement("div"); directoryCategoryContainer.SetAttributeValue("id", "category-container"); // header for category section of directory div HtmlNode directoryHeader = listFileDoc.CreateElement("h2"); directoryHeader.SetAttributeValue("class", "category-headers"); // add text node for header HtmlNode categoryHeaderText = listFileDoc.CreateTextNode("Categories"); directoryHeader.AppendChild(categoryHeaderText); directoryCategoryContainer.AppendChild(directoryHeader); // create div to hold category urls used to roll back to a //previous view HtmlNode categoryUrlDiv = listFileDoc.CreateElement("div"); categoryUrlDiv.SetAttributeValue("class", "visited-categories-container"); // add category url text HtmlNode categoryUrlText = listFileDoc.CreateTextNode(categoriesUrlText); categoryUrlDiv.AppendChild(categoryUrlText); directoryCategoryContainer.AppendChild(categoryUrlDiv); // add container for category header and links for rolling back to particular views // to the directory container div directoryDiv.AppendChild(directoryCategoryContainer); HtmlNode categoryRule = listFileDoc.CreateElement("hr"); categoryRule.SetAttributeValue("class", "header-rule"); directoryDiv.AppendChild(categoryRule); // update current url string to be used by subordinate categories string currentUrlName = Path.GetFileName(directory.Path); if (categoriesUrlText == String.Empty) { categoriesUrlText += @"<a href='#' onclick='rollBack("""")'>Home</a>"; } else { categoriesUrlText += @" > <a href='#' onclick='rollBack(""" + encryptedPath + @""")'>" + currentUrlName + "</a>"; } // Process subdirectories' contents and generate relevant // html. if (directory.Subdirectories.Count > 0) { foreach (DirectoryModel subdirectory in directory.Subdirectories) { isSourceDir = false; HtmlNode subDirectoryDiv = listFileDoc.CreateElement("div"); subDirectoryDiv.SetAttributeValue("class", "subdirectory"); subDirectoryDiv.SetAttributeValue("name", EncryptStrings.EncryptToMD5String(subdirectory.Path)); subDirectoryDiv.SetAttributeValue("onclick", "bringToFront(this)"); HtmlNode folderParagraph = listFileDoc.CreateElement("p"); folderParagraph.SetAttributeValue("class", "folder-name"); HtmlTextNode text = listFileDoc.CreateTextNode(Path.GetFileName(subdirectory.Path)); folderParagraph.AppendChild(text); subDirectoryDiv.AppendChild(folderParagraph); directoryDiv.AppendChild(subDirectoryDiv); GenerateHTML(subdirectory, listFileDoc, directoryContainerDiv, isSourceDir, ref index, categoriesUrlText); } } // Container for links to show articles. HtmlNode clearFloatDiv = listFileDoc.CreateElement("div"); clearFloatDiv.SetAttributeValue("style", "clear: both; width: 100%;"); directoryDiv.AppendChild(clearFloatDiv); HtmlNode articleHeader = listFileDoc.CreateElement("h2"); articleHeader.SetAttributeValue("class", "article-headers"); HtmlNode articleHeaderText = listFileDoc.CreateTextNode("Articles"); articleHeader.AppendChild(articleHeaderText); directoryDiv.AppendChild(articleHeader); HtmlNode articleRule = listFileDoc.CreateElement("hr"); articleRule.SetAttributeValue("class", "header-rule"); directoryDiv.AppendChild(articleRule); // Check that html files exist in directory and create representative // html links. if (directory.Files.Keys.Count > 0) { HtmlNode linkContainerNode = listFileDoc.CreateElement("ul"); linkContainerNode.SetAttributeValue("class", "article-list"); foreach (string key in directory.Files.Keys) { HtmlNode listNode = listFileDoc.CreateElement("li"); HtmlNode linkNode = listFileDoc.CreateElement("a"); HtmlTextNode textNode = listFileDoc.CreateTextNode(directory.Files[key]); linkNode.AppendChild(textNode); string file = key; linkNode.SetAttributeValue("id", EncryptStrings.EncryptToAESString(file)); linkNode.SetAttributeValue("href", "#"); linkNode.SetAttributeValue("onclick", "setContent(this.id)"); listNode.AppendChild(linkNode); linkContainerNode.AppendChild(listNode); } directoryDiv.AppendChild(linkContainerNode); } directoryContainerDiv.AppendChild(directoryDiv); }