static void CreateOpf(Book2 book)
        {
            string path    = "./tmp/content.opf";
            string content = tpl_content;

            content = content.Replace("___BOOK_ID___", book.id);
            content = content.Replace("___BOOK_NAME___", book.name);
            string manifest = "";
            string spine    = "";

            for (int i = 0; i < book.chapters.Length; i++)
            {
                var chapter = book.chapters[i];
                // mainifest
                string tocLine = "";
                tocLine   = string.Format("<item id=\"chapter{0}\" href=\"chapter{0}.html\" media-type=\"application/xhtml+xml\"/>\r\n", i);
                manifest += tocLine;
                // spine
                string spineLine = "";
                spineLine = string.Format("<itemref idref=\"chapter{0}\" linear=\"yes\"/>\r\n", i);
                spine    += spineLine;
            }
            content = content.Replace("___MANIFEST___", manifest);
            content = content.Replace("___SPINE___", spine);
            File.WriteAllText(path, content);
        }
        static void CreateCover(Book2 book)
        {
            string path    = "./tmp/cover.html";
            string content = tpl_cover;

            content = content.Replace("___BOOK_NAME___", book.name);
            content = content.Replace("___BOOK_AUTHOR___", book.author);
            File.WriteAllText(path, content);
        }
        static void CreateBookToc(Book2 book)
        {
            string path       = "./tmp/book-toc.html";
            string content    = tpl_book_toc;
            string tocContent = "";

            for (int i = 0; i < book.chapters.Length; i++)
            {
                var    chapter = book.chapters[i];
                string tocLine = string.Format("<dt class=\"tocl2\"><a href=\"chapter{0}.html\">{1}</a></dt>\r\n",
                                               i, chapter.title);
                tocContent += tocLine;
            }
            content = content.Replace("___CONTENT___", tocContent);
            File.WriteAllText(path, content);
        }
 public static void Book2Mobi(Book2 book, string savePath)
 {
     LoadTemplates();
     //create tmp
     if (Directory.Exists("./tmp"))
     {
         Directory.Delete("./tmp", true);
     }
     Directory.CreateDirectory("./tmp");
     CreateCover(book);
     CreateChapters(book);
     CreateStyle(book);
     CreateBookToc(book);
     CreateNaxToc(book);
     CreateOpf(book);
     gen(savePath);
 }
        public static void Book2Txt(Book2 book, string savePath)
        {
            string txt = "";

            for (int i = 0; i < book.chapters.Length; i++)
            {
                var chapterInfo = book.chapters[i];
                txt += chapterInfo.title + "\r\n";
                txt += chapterInfo.body + "\r\n";
            }

            string saveDir = Path.GetDirectoryName(savePath);

            if (!Directory.Exists(saveDir))
            {
                Directory.CreateDirectory(saveDir);
            }
            File.WriteAllText(savePath, txt);
        }
        static void CreateNaxToc(Book2 book)
        {
            string path    = "./tmp/toc.ncx";
            string content = tpl_toc;

            content = content.Replace("___BOOK_ID___", book.id);
            content = content.Replace("___BOOK_NAME___", book.name);
            string tocContent = "";

            for (int i = 0; i < book.chapters.Length; i++)
            {
                var    chapter = book.chapters[i];
                string tocLine = string.Format("<navPoint id=\"chapter{0}\" playOrder=\"{1}\">\r\n", i, i + 1);
                tocLine    += string.Format("<navLabel><text>{0}</text></navLabel>\r\n", chapter.title);
                tocLine    += string.Format("<content src=\"chapter{0}.html\"/>\r\n</navPoint>\r\n", i);
                tocContent += tocLine;
            }
            content = content.Replace("___NAV___", tocContent);
            File.WriteAllText(path, content);
        }
 static void CreateChapters(Book2 book)
 {
     for (int i = 0; i < book.chapters.Length; i++)
     {
         var    chapter = book.chapters[i];
         string path    = "./tmp/chapter" + i + ".html";
         string content = tpl_chapter;
         content = content.Replace("___CHAPTER_ID___", "Chapter " + i);
         content = content.Replace("___CHAPTER_NAME___", chapter.title);
         string chapterContent = chapter.body;
         chapterContent = chapterContent.Replace("\r", "");
         var ps = chapterContent.Split('\n');
         chapterContent = "";
         foreach (var p in ps)
         {
             string pStr = "<p class=\"a\">";
             pStr           += "  " + p;
             pStr           += "</p>";
             chapterContent += pStr;
         }
         content = content.Replace("___CONTENT___", chapterContent);
         File.WriteAllText(path, content);
     }
 }
        private void Backgroundworker_download_DoWork(object sender, DoWorkEventArgs e)
        {
            var                chapters       = mChapers;
            var                pb             = progressbar_download;
            var                label          = label_downloadinfo;
            string             savePath       = e.Argument.ToString();
            List <ChapterInfo> chaperInfoList = new List <ChapterInfo>();

            for (int i = 0; i < chapters.Length; i++)
            {
                if (backgroundworker_download.CancellationPending)
                {
                    return;
                }
                var    chapter  = chapters[i];
                float  progress = (i + 1) / (float)chapters.Length;
                string info     = string.Format("正在下载:{0} {1}/{2} {3:F2}%", chapter.title, i + 1, chapters.Length + 1,
                                                progress * 100);
                backgroundworker_download.ReportProgress(i, info);

                while (true)
                {
                    bool   downloadSucess = false;
                    string errMsg         = "";
                    for (int j = 0; j < 3; j++)
                    {
                        try {
                            var chapterInfo = LibZhuiShu.getChapter(chapter.link);
                            if (chapterInfo != null)
                            {
                                chaperInfoList.Add(chapterInfo);
                                downloadSucess = true;
                                break;
                            }
                        } catch (Exception ex) {
                            errMsg = ex.Message;
                            loglibrary.LogHelper.Error(ex);
                            loglibrary.LogHelper.Flush();
                        }
                    }
                    if (!downloadSucess)
                    {
                        var result = MessageBox.Show(errMsg, "章节 " + chapter.title + " 下载失败", MessageBoxButtons.AbortRetryIgnore);
                        if (result == DialogResult.Abort)
                        {
                            return;
                        }
                        else if (result == DialogResult.Ignore)
                        {
                            var emptyChaper = new ChapterInfo()
                            {
                                title = chapter.title,
                                body  = "本章下载失败了,失败原因:\n " + errMsg
                            };
                            chaperInfoList.Add(emptyChaper);
                            downloadSucess = true;
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }
            backgroundworker_download.ReportProgress(chapters.Length, "正在生成电子书请稍后....");
            string ext  = Path.GetExtension(savePath);
            Book2  book = new Book2()
            {
                name   = mBook.title,
                author = mBook.author,
                id     = mBook._id
            };
            var result2 = Lib2.API.Convert(chaperInfoList);

            book.chapters   = result2;
            Global.env.book = book;
            if (ext.ToLower() == ".txt")
            {
                Kindlegen.Book2Txt(book, savePath);
            }
            else if (ext.ToLower() == ".mobi")
            {
                Kindlegen.Book2Mobi(book, savePath);
            }
            MessageBox.Show("下载完成,文件保存在:" + savePath);
            if (checkBox1.Checked)
            {
                try
                {
                    KindleSender.Service.Program.Main();
                    Configuration config = new Configuration()
                    {
                        SmtpServer   = textBox4.Text,
                        SmtpPort     = 25,
                        SmtpPassword = textBox3.Text,
                        SmtpUserName = textBox5.Text,
                        KindleMail   = textBox1.Text,
                        FolderPath   = savePath.Replace(Path.GetFileName(savePath), string.Empty)
                    };
                    Global.env.config = config;
                    FileSender sen = new FileSender(config);
                    sen.Send(savePath);
                    MessageBox.Show("已完成!");
                }
                catch (Exception ee)
                {
                    loglibrary.LogHelper.Error(ee);
                    loglibrary.LogHelper.Flush();
                    MessageBox.Show("错误!\n 错误信息为:" + ee.Message);
                }
            }
        }
        static void CreateStyle(Book2 book)
        {
            string path = "./tmp/style.css";

            File.WriteAllText(path, tpl_style);
        }