package book import ( "fmt" "log" "os" "os/exec" "strings" md "github.com/JohannesKaufmann/html-to-markdown" "github.com/PuerkitoBio/goquery" epub "github.com/bmaupin/go-epub" ) func Filename(name string) string { filename := name filename = strings.ReplaceAll(filename, " ", "_") filename = strings.ReplaceAll(filename, "/", "") return filename } func ToMarkdownString(c chapter) string { markdown := "" // chapter content if c.config.Include { // title markdown += fmt.Sprintf("%s\n", c.Name()) markdown += fmt.Sprintf("%s\n\n", strings.Repeat("=", len(c.Name()))) // url if c.config.PrintURL { markdown += fmt.Sprintf("_Source: %s_\n\n", c.URL()) } // convert content to markdown content, err := md.NewConverter("", true, nil).ConvertString(c.Content()) if err != nil { log.Fatal(err) } markdown += fmt.Sprintf("%s\n\n\n", content) } // subchapters content for _, sc := range c.SubChapters() { markdown += fmt.Sprintf("%s\n\n\n", ToMarkdownString(sc)) } return markdown } func ToMarkdown(c chapter, filename string) string { if len(filename) == 0 { filename = fmt.Sprintf("%s.md", Filename(c.Name())) } markdown := ToMarkdownString(c) // write to file f, err := os.Create(filename) if err != nil { log.Fatal(err) } _, err2 := f.WriteString(markdown) if err2 != nil { log.Fatal(err2) } f.Close() return filename } func ToHtmlString(c chapter) string { html := "" // chapter content if c.config.Include { // title html += fmt.Sprintf("
Source: %s
\n", c.URL()) } // content html += c.Content() } // subchapters content for _, sc := range c.SubChapters() { html += ToHtmlString(sc) } return html } func ToHtml(c chapter, filename string) string { if len(filename) == 0 { filename = fmt.Sprintf("%s.html", Filename(c.Name())) } html := fmt.Sprintf("%s", ToHtmlString(c)) // write to file f, err := os.Create(filename) if err != nil { log.Fatal(err) } _, err2 := f.WriteString(html) if err2 != nil { log.Fatal(err2) } f.Close() return filename } func ToEpub(c chapter, filename string) string { if len(filename) == 0 { filename = fmt.Sprintf("%s.epub", Filename(c.Name())) } // init ebook e := epub.NewEpub(c.Name()) e.SetAuthor(c.Author()) // append table of content if len(c.SubChapters()) > 1 { html := "Source: %s
\n", c.URL()) } // content html += content // write to epub file _, err = e.AddSection(html, c.Name(), "", "") if err != nil { log.Fatal(err) } } // subchapters content for _, sc := range c.SubChapters() { AppendToEpub(e, sc) } } func ToMobi(c chapter, filename string) string { if len(filename) == 0 { filename = fmt.Sprintf("%s.mobi", Filename(c.Name())) } else { // add .mobi extension if not specified if strings.HasSuffix(filename, ".mobi") == false { filename = fmt.Sprintf("%s.mobi", filename) } } filenameEPUB := strings.ReplaceAll(filename, ".mobi", ".epub") ToEpub(c, filenameEPUB) exec.Command("kindlegen", filenameEPUB).Run() // exec command always returns status 1 even if it succeed // if err != nil { // log.Fatal(err) // } err := os.Remove(filenameEPUB) if err != nil { log.Fatal(err) } return filename }