package cmd import ( "fmt" "os" fp "path/filepath" "strings" "time" "github.com/go-shiori/shiori/internal/database" "github.com/spf13/cobra" ) func exportCmd() *cobra.Command { cmd := &cobra.Command{ Use: "export target-file", Short: "Export bookmarks into HTML file in Netscape Bookmark format", Args: cobra.ExactArgs(1), Run: exportHandler, } return cmd } func exportHandler(cmd *cobra.Command, args []string) { // Fetch bookmarks from database bookmarks, err := DB.GetBookmarks(database.GetBookmarksOptions{}) if err != nil { cError.Printf("Failed to get bookmarks: %v\n", err) return } if len(bookmarks) == 0 { cError.Println("No saved bookmarks yet") return } // Make sure destination directory exist dstDir := fp.Dir(args[0]) os.MkdirAll(dstDir, os.ModePerm) // Create destination file dstFile, err := os.Create(args[0]) if err != nil { cError.Printf("Failed to create destination file: %v\n", err) return } defer dstFile.Close() // Write exported bookmark to file fmt.Fprintln(dstFile, ``+ ``+ ``+ `Bookmarks`+ `

Bookmarks

`+ `
`) for _, book := range bookmarks { // Create Unix timestamp for bookmark modifiedTime, err := time.Parse("2006-01-02 15:04:05", book.Modified) if err != nil { modifiedTime = time.Now() } unixTimestamp := modifiedTime.Unix() // Create tags for bookmarks tags := []string{} for _, tag := range book.Tags { tags = append(tags, tag.Name) } strTags := strings.Join(tags, ",") // Write to file exportLine := fmt.Sprintf(`
%s`, book.URL, unixTimestamp, unixTimestamp, strTags, book.Title) fmt.Fprintln(dstFile, exportLine) } fmt.Fprintln(dstFile, "
") // Flush data to storage err = dstFile.Sync() if err != nil { cError.Printf("Failed to export the bookmarks: %v\n", err) return } fmt.Println("Export finished") }