html2chm

C# version of turning a website into a chm file. Requires that html workshop (http://msdn.microsoft.com/library/en-us/htmlhelp/html/vsconhh1start.asp) is installed. If anyone knows of a working open source chm compiler let me know.

Can be used like:
html2chm.Html2chm action = new html2chm.Html2chm();
This will run and prompt you for which website directory and which file in the directory to convert to a chm file.

Or it can be used like this:
bool eachFileAsTopic = true;
html2chm.Html2chm action = new html2chm.Html2chm(@"\\Path\to\directory\to\convert", @"mainTopic.html", eachFileAsTopic);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Diagnostics;


namespace html2chm
{

    public class Html2chm
    {
        //http://www.majorsilence.com/csharp_html2chm
        //The generated CHM file is named YourCHMFile.chm on your desktop.

        string HHC;
        // Path to hhc.exe

        // Directory path where HHP file is stored
        // and base directory of the html files to be converted
        string RepBase;

        string FicHHP;
        // Path to HHP file

        string fileListString;


        public Html2chm() : this("", "", false)
        {
        }

        public Html2chm(string convertDirectory, string mainTopic, bool filesAsTopics)
        {
            List fileList = new List();

            HHC = System.IO.Path.Combine("C:\\Program Files\\HTML Help Workshop", "hhc.exe");

            if (System.IO.File.Exists(HHC) == false)
            {
                HHC = System.IO.Path.Combine("C:\\Program Files (x86)\\HTML Help Workshop", "hhc.exe");
                if (System.IO.File.Exists(HHC) == false)
                {
                    MessageBox.Show("In order to use this script, you need HTML Help Workshop" + System.Environment.NewLine + "http://msdn.microsoft.com/library/en-us/htmlhelp/html/vsconhh1start.asp");
                    return;
                }
            }

            if (convertDirectory == string.Empty)
            {
                System.Windows.Forms.FolderBrowserDialog DirectoryBrowser = default(System.Windows.Forms.FolderBrowserDialog);
                DirectoryBrowser = new System.Windows.Forms.FolderBrowserDialog();
                DirectoryBrowser.Description = "Which directory do you want to use?";
                if ((DirectoryBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK))
                {
                    RepBase = DirectoryBrowser.SelectedPath;
                }
            }
            else
            {
                RepBase = convertDirectory;
            }


            if (RepBase == null)
            {

                MessageBox.Show("Please choose a Folder");
            }
            else
            {
                fileList.AddRange(RecursiveFileList(new DirectoryInfo(RepBase), new DirectoryInfo(RepBase)));
                string fileHHC="";
                string FicHHC = System.IO.Path.Combine(RepBase, "chm-editor-Temp-HHC.hhc");
                foreach (string s in fileList)
                {
                    this.fileListString += s + System.Environment.NewLine;

                    if (filesAsTopics)
                    {
                        string value = s.Replace(RepBase, "");

                        string textValue = ""; 

                        if (value.StartsWith("\\"))
                        {
                            value = value.Remove(0, 1);
                        }

                        textValue = System.IO.Path.GetFileName(value); 
                        textValue = textValue.Replace(System.IO.Path.GetExtension(textValue), "");

                        fileHHC += "
  • "; } } if (filesAsTopics) { System.IO.File.WriteAllText(FicHHC, fileHHC); } FicHHP = System.IO.Path.Combine(RepBase, "chm-editor-Temp" + DateTime.Now.Millisecond.ToString() + ".HHP"); string output = "[OPTIONS]" + System.Environment.NewLine; output += "Compatibility=1.1 or later" + System.Environment.NewLine; output += "Compiled file=" + System.IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "YourCHMFile.chm") + System.Environment.NewLine; string main_topic; if (mainTopic == string.Empty) { main_topic = MainTopic(); } else { main_topic = mainTopic; } if (filesAsTopics) { output += "Contents file=" + FicHHC + System.Environment.NewLine; } output += "Default topic=" + main_topic.Substring(RepBase.Length + 1, main_topic.Length - (RepBase.Length + 1)) + System.Environment.NewLine; //Strings.Mid(MainTopic(), Strings.Len(RepBase) + 2) + System.Environment.NewLine; output += "Display compile progress=No" + System.Environment.NewLine; output += "Language=0x409 English (standard)" + System.Environment.NewLine; // 0x40C - French // 0x407 - German output += "Title=(c) 2010 MajorSilence" + System.Environment.NewLine; output += System.Environment.NewLine + "[FILES]" + System.Environment.NewLine; output += this.fileListString + System.Environment.NewLine; output += System.Environment.NewLine + "[INFOTYPES]" + System.Environment.NewLine; System.IO.File.WriteAllText(FicHHP, output); System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = HHC; p.StartInfo.Arguments = FicHHP; p.StartInfo.CreateNoWindow = true; p.Start(); p.WaitForExit(); // Finally Remove try { System.IO.File.Delete(FicHHP); if (System.IO.File.Exists(FicHHC)) { System.IO.File.Delete(FicHHC); } } catch (Exception ex) { } } } // Recurse through directory and return string of files public List RecursiveFileList(DirectoryInfo source, DirectoryInfo target) { // loop through each file in current directory List fileList = new List(); foreach (FileInfo file in source.GetFiles()) { if (file.Name.ToLower().EndsWith("html") | file.Name.ToLower().EndsWith("htm") | file.Name.ToLower().EndsWith("mov") | file.Name.ToLower().EndsWith("au")) { fileList.Add(file.FullName); } } // Then loop through each directory foreach (DirectoryInfo dir in source.GetDirectories()) { fileList.AddRange(RecursiveFileList(dir, new DirectoryInfo(dir.Name))); } return fileList; } // Select the root file (Main topic) in base directory public string MainTopic() { System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog(); if (dlg.ShowDialog() == DialogResult.OK) { return dlg.FileName; } return string.Empty; } } }