diff --git a/main.go b/main.go index 1b3685f..191a634 100644 --- a/main.go +++ b/main.go @@ -46,7 +46,7 @@ func main() { // TODO option to include response header in page flag.Parse() - defaultConfig := defaultConfigPath() + defaultConfig := gmitohtml.DefaultConfigPath() if configFile == "" { configFile = defaultConfig } @@ -58,18 +58,18 @@ func main() { } if configExists || configFile != defaultConfig { - err := readconfig(configFile) + err := gmitohtml.ReadConfig(configFile) if err != nil { log.Fatalf("failed to read configuration file at %s: %v\nSee CONFIGURATION.md for information on configuring gmitohtml", configFile, err) } - for u, label := range config.Bookmarks { + for u, label := range gmitohtml.Config.Bookmarks { gmitohtml.AddBookmark(u, label) } } } - for domain, cc := range config.Certs { + for domain, cc := range gmitohtml.Config.Certs { certData, err := ioutil.ReadFile(cc.Cert) if err != nil { log.Fatalf("failed to load client certificate for domain %s: %s", domain, err) @@ -88,9 +88,9 @@ func main() { if daemon != "" { gmitohtml.SetOnBookmarksChanged(func() { - config.Bookmarks = gmitohtml.GetBookmarks() + gmitohtml.Config.Bookmarks = gmitohtml.GetBookmarks() - err := saveConfig(configFile) + err := gmitohtml.SaveConfig(configFile) if err != nil { log.Fatal(err) } diff --git a/config.go b/pkg/gmitohtml/config.go similarity index 74% rename from config.go rename to pkg/gmitohtml/config.go index ab9104b..b4dace8 100644 --- a/config.go +++ b/pkg/gmitohtml/config.go @@ -1,4 +1,4 @@ -package main +package gmitohtml import ( "crypto/tls" @@ -8,7 +8,6 @@ import ( "os" "path" - "code.rocketnine.space/tslocum/gmitohtml/pkg/gmitohtml" "gopkg.in/yaml.v3" ) @@ -22,16 +21,21 @@ type certConfig struct { type appConfig struct { Bookmarks map[string]string + // Convert image links to images instead of normal links + ConvertImages bool + Certs map[string]*certConfig } -var config = &appConfig{ +var Config = &appConfig{ Bookmarks: make(map[string]string), + ConvertImages: false, + Certs: make(map[string]*certConfig), } -func defaultConfigPath() string { +func DefaultConfigPath() string { homedir, err := os.UserHomeDir() if err == nil && homedir != "" { return path.Join(homedir, ".config", "gmitohtml", "config.yaml") @@ -39,7 +43,7 @@ func defaultConfigPath() string { return "" } -func readconfig(configPath string) error { +func ReadConfig(configPath string) error { if configPath == "" { return errors.New("file unspecified") } @@ -54,15 +58,15 @@ func readconfig(configPath string) error { if err != nil { return err } - config = newConfig + Config = newConfig return nil } -func saveConfig(configPath string) error { - config.Bookmarks = gmitohtml.GetBookmarks() +func SaveConfig(configPath string) error { + Config.Bookmarks = GetBookmarks() - out, err := yaml.Marshal(config) + out, err := yaml.Marshal(Config) if err != nil { return fmt.Errorf("failed to marshal configuration: %s", err) } diff --git a/pkg/gmitohtml/convert.go b/pkg/gmitohtml/convert.go index 549df8e..fcaf208 100644 --- a/pkg/gmitohtml/convert.go +++ b/pkg/gmitohtml/convert.go @@ -19,6 +19,8 @@ var daemonAddress string var assetLock sync.Mutex +var imageExtensions = []string{"png", "jpg", "jpeg", "gif", "svg", "webp"} + func rewriteURL(u string, loc *url.URL) string { if daemonAddress != "" { scheme := "gemini" @@ -126,12 +128,25 @@ func Convert(page []byte, u string) []byte { linkLabel = line[splitStart:] } - link := append([]byte(``)...) - link = append(link, html.EscapeString(string(linkLabel))...) - link = append(link, []byte(``)...) - result = append(result, link...) - result = append(result, []byte("
")...) + parts := strings.Split(string(linkURL), ".") + extension := parts[len(parts)-1] + isImage := false + for _, ext := range imageExtensions { + if extension == ext { + isImage = true + } + } + + uri := html.EscapeString(rewriteURL(string(linkURL), parsedURL)) + title := html.EscapeString(string(linkLabel)) + + // If link ends with gif/png/jpg, add a image instead of a link + if isImage && Config.ConvertImages { + result = append(result, []byte("\""")...) + } else { + result = append(result, []byte("" + title + "
")...) + } + continue }