shiori/cmd/open.go
2018-03-05 11:32:37 +07:00

130 lines
2.9 KiB
Go

package cmd
import (
"fmt"
"os/exec"
"runtime"
"strings"
"github.com/spf13/cobra"
)
var (
openCmd = &cobra.Command{
Use: "open [indices]",
Short: "Open the saved bookmarks",
Long: "Open bookmarks in browser. " +
"Accepts space-separated list of indices (e.g. 5 6 23 4 110 45), hyphenated range (e.g. 100-200) or both (e.g. 1-3 7 9). " +
"If no arguments, ALL bookmarks will be opened.",
Run: func(cmd *cobra.Command, args []string) {
// Read flags
cacheOnly, _ := cmd.Flags().GetBool("cache")
trimSpace, _ := cmd.Flags().GetBool("trim-space")
skipConfirmation, _ := cmd.Flags().GetBool("yes")
// If no arguments, confirm to user
if len(args) == 0 && !skipConfirmation {
confirmOpen := ""
fmt.Print("Open ALL bookmarks? (y/n): ")
fmt.Scanln(&confirmOpen)
if confirmOpen != "y" {
return
}
}
if cacheOnly {
openBookmarksCache(trimSpace, args...)
} else {
openBookmarks(args...)
}
},
}
)
func init() {
openCmd.Flags().BoolP("yes", "y", false, "Skip confirmation prompt and open ALL bookmarks")
openCmd.Flags().BoolP("cache", "c", false, "Open the bookmark's cache in text-only mode")
openCmd.Flags().Bool("trim-space", false, "Trim all spaces and newlines from the bookmark's cache")
rootCmd.AddCommand(openCmd)
}
func openBookmarks(args ...string) {
// Read bookmarks from database
bookmarks, err := DB.GetBookmarks(false, args...)
if err != nil {
cError.Println(err)
return
}
if len(bookmarks) == 0 {
if len(args) > 0 {
cError.Println("No matching index found")
} else {
cError.Println("No saved bookmarks yet")
}
return
}
// Open in browser
for _, book := range bookmarks {
err = openBrowser(book.URL)
if err != nil {
cError.Printf("Failed to open %s: %v\n", book.URL, err)
}
}
}
func openBookmarksCache(trimSpace bool, args ...string) {
// Read bookmark content from database
bookmarks, err := DB.GetBookmarks(true, args...)
if err != nil {
cError.Println(err)
return
}
// Get terminal width
termWidth := getTerminalWidth()
if termWidth < 50 {
termWidth = 50
}
// Show bookmarks content
for _, book := range bookmarks {
if trimSpace {
words := strings.Fields(book.Content)
book.Content = strings.Join(words, " ")
}
cIndex.Printf("%d. ", book.ID)
cTitle.Println(book.Title)
fmt.Println()
if book.Content == "" {
cError.Println("This bookmark doesn't have any cached content")
} else {
fmt.Println(book.Content)
}
fmt.Println()
cSymbol.Println(strings.Repeat("-", termWidth))
fmt.Println()
}
}
// openBrowser tries to open the URL in a browser,
// and returns whether it succeed in doing so.
func openBrowser(url string) error {
var args []string
switch runtime.GOOS {
case "darwin":
args = []string{"open"}
case "windows":
args = []string{"cmd", "/c", "start"}
default:
args = []string{"xdg-open"}
}
cmd := exec.Command(args[0], append(args[1:], url)...)
return cmd.Run()
}