示例#1
0
        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;
        }
示例#2
0
        /// <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);
        }