mirror of
https://github.com/makeworld-the-better-one/amfora.git
synced 2024-11-22 07:23:05 +03:00
🔥 Removed favicon support - fixes #199
This commit is contained in:
parent
1d27ce43e8
commit
180d108827
@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
### Changed
|
||||||
|
- Favicon support removed (#199)
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Help text is now the same color as `regular_text` in the theme config
|
- Help text is now the same color as `regular_text` in the theme config
|
||||||
- Non-ASCII (multibyte) characters can now be used as keybindings (#198, #200)
|
- Non-ASCII (multibyte) characters can now be used as keybindings (#198, #200)
|
||||||
|
@ -141,9 +141,6 @@ Features in *italics* are in the master branch, but not in the latest release.
|
|||||||
- [x] Download pages and arbitrary data
|
- [x] Download pages and arbitrary data
|
||||||
- [x] Theming
|
- [x] Theming
|
||||||
- Check out the [user contributed themes](https://github.com/makeworld-the-better-one/amfora/tree/master/contrib/themes)!
|
- Check out the [user contributed themes](https://github.com/makeworld-the-better-one/amfora/tree/master/contrib/themes)!
|
||||||
- [x] Emoji favicons
|
|
||||||
- See `gemini://mozz.us/files/rfc_gemini_favicon.gmi` for details
|
|
||||||
- Disabled by default, enable in config
|
|
||||||
- [x] Proxying
|
- [x] Proxying
|
||||||
- Schemes like Gopher or HTTP can be proxied through a Gemini server
|
- Schemes like Gopher or HTTP can be proxied through a Gemini server
|
||||||
- [x] Client certificate support
|
- [x] Client certificate support
|
||||||
|
51
cache/favicon.go
vendored
51
cache/favicon.go
vendored
@ -1,51 +0,0 @@
|
|||||||
package cache
|
|
||||||
|
|
||||||
import (
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Functions for caching emoji favicons.
|
|
||||||
// See gemini://mozz.us/files/rfc_gemini_favicon.gmi for details.
|
|
||||||
|
|
||||||
var favicons = make(map[string]string) // domain to emoji
|
|
||||||
var favMu = sync.RWMutex{}
|
|
||||||
|
|
||||||
var KnownNoFavicon = "no"
|
|
||||||
|
|
||||||
// AddFavicon will add an emoji to the cache under that host.
|
|
||||||
// It does not verify that the string passed is actually an emoji.
|
|
||||||
// You can pass KnownNoFavicon as the emoji when a host doesn't have a valid favicon.
|
|
||||||
func AddFavicon(host, emoji string) {
|
|
||||||
favMu.Lock()
|
|
||||||
favicons[host] = emoji
|
|
||||||
favMu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ClearFavicons removes all favicons from the cache
|
|
||||||
func ClearFavicons() {
|
|
||||||
favMu.Lock()
|
|
||||||
favicons = make(map[string]string)
|
|
||||||
favMu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetFavicon returns the favicon string for the host.
|
|
||||||
// It returns an empty string if there is no favicon cached.
|
|
||||||
// It might also return KnownNoFavicon to indicate that that host does not have
|
|
||||||
// a favicon at all.
|
|
||||||
func GetFavicon(host string) string {
|
|
||||||
favMu.RLock()
|
|
||||||
defer favMu.RUnlock()
|
|
||||||
return favicons[host]
|
|
||||||
}
|
|
||||||
|
|
||||||
func NumFavicons() int {
|
|
||||||
favMu.RLock()
|
|
||||||
defer favMu.RUnlock()
|
|
||||||
return len(favicons)
|
|
||||||
}
|
|
||||||
|
|
||||||
func RemoveFavicon(host string) {
|
|
||||||
favMu.Lock()
|
|
||||||
delete(favicons, host)
|
|
||||||
favMu.Unlock()
|
|
||||||
}
|
|
@ -207,7 +207,6 @@ func Init() error {
|
|||||||
viper.SetDefault("a-general.temp_downloads", "")
|
viper.SetDefault("a-general.temp_downloads", "")
|
||||||
viper.SetDefault("a-general.page_max_size", 2097152)
|
viper.SetDefault("a-general.page_max_size", 2097152)
|
||||||
viper.SetDefault("a-general.page_max_time", 10)
|
viper.SetDefault("a-general.page_max_time", 10)
|
||||||
viper.SetDefault("a-general.emoji_favicons", false)
|
|
||||||
viper.SetDefault("a-general.scrollbar", "auto")
|
viper.SetDefault("a-general.scrollbar", "auto")
|
||||||
viper.SetDefault("keybindings.bind_reload", []string{"R", "Ctrl-R"})
|
viper.SetDefault("keybindings.bind_reload", []string{"R", "Ctrl-R"})
|
||||||
viper.SetDefault("keybindings.bind_home", "Backspace")
|
viper.SetDefault("keybindings.bind_home", "Backspace")
|
||||||
|
@ -70,9 +70,6 @@ page_max_size = 2097152 # 2 MiB
|
|||||||
# Max time it takes to load a page in seconds - after that a download window pops up
|
# Max time it takes to load a page in seconds - after that a download window pops up
|
||||||
page_max_time = 10
|
page_max_time = 10
|
||||||
|
|
||||||
# Whether to replace tab numbers with emoji favicons, which are cached.
|
|
||||||
emoji_favicons = false
|
|
||||||
|
|
||||||
# When a scrollbar appears. "never", "auto", and "always" are the only valid values.
|
# When a scrollbar appears. "never", "auto", and "always" are the only valid values.
|
||||||
# "auto" means the scrollbar only appears when the page is longer than the window.
|
# "auto" means the scrollbar only appears when the page is longer than the window.
|
||||||
scrollbar = "auto"
|
scrollbar = "auto"
|
||||||
|
@ -67,9 +67,6 @@ page_max_size = 2097152 # 2 MiB
|
|||||||
# Max time it takes to load a page in seconds - after that a download window pops up
|
# Max time it takes to load a page in seconds - after that a download window pops up
|
||||||
page_max_time = 10
|
page_max_time = 10
|
||||||
|
|
||||||
# Whether to replace tab numbers with emoji favicons, which are cached.
|
|
||||||
emoji_favicons = false
|
|
||||||
|
|
||||||
# When a scrollbar appears. "never", "auto", and "always" are the only valid values.
|
# When a scrollbar appears. "never", "auto", and "always" are the only valid values.
|
||||||
# "auto" means the scrollbar only appears when the page is longer than the window.
|
# "auto" means the scrollbar only appears when the page is longer than the window.
|
||||||
scrollbar = "auto"
|
scrollbar = "auto"
|
||||||
|
@ -78,7 +78,7 @@ func bkmkInit() {
|
|||||||
// It also accepts a bool indicating whether this page already has a bookmark.
|
// It also accepts a bool indicating whether this page already has a bookmark.
|
||||||
// It returns the bookmark name and the bookmark action:
|
// It returns the bookmark name and the bookmark action:
|
||||||
// 1, 0, -1 for add/update, cancel, and remove
|
// 1, 0, -1 for add/update, cancel, and remove
|
||||||
func openBkmkModal(name string, exists bool, favicon string) (string, int) {
|
func openBkmkModal(name string, exists bool) (string, int) {
|
||||||
// Basically a copy of Input()
|
// Basically a copy of Input()
|
||||||
|
|
||||||
// Reset buttons before input field, to make sure the input is in focus
|
// Reset buttons before input field, to make sure the input is in focus
|
||||||
@ -93,9 +93,7 @@ func openBkmkModal(name string, exists bool, favicon string) (string, int) {
|
|||||||
|
|
||||||
// Remove and re-add input field - to clear the old text
|
// Remove and re-add input field - to clear the old text
|
||||||
bkmkModal.GetForm().Clear(false)
|
bkmkModal.GetForm().Clear(false)
|
||||||
if favicon != "" && !exists {
|
|
||||||
name = favicon + " " + name
|
|
||||||
}
|
|
||||||
bkmkModalText = name
|
bkmkModalText = name
|
||||||
bkmkModal.GetForm().AddInputField("Name: ", name, 0, nil,
|
bkmkModal.GetForm().AddInputField("Name: ", name, 0, nil,
|
||||||
func(text string) {
|
func(text string) {
|
||||||
@ -152,7 +150,7 @@ func addBookmark() {
|
|||||||
}
|
}
|
||||||
name, exists := bookmarks.Get(p.URL)
|
name, exists := bookmarks.Get(p.URL)
|
||||||
// Open a bookmark modal with the current name of the bookmark, if it exists
|
// Open a bookmark modal with the current name of the bookmark, if it exists
|
||||||
newName, action := openBkmkModal(name, exists, p.Favicon)
|
newName, action := openBkmkModal(name, exists)
|
||||||
switch action {
|
switch action {
|
||||||
case 1:
|
case 1:
|
||||||
// Add/change the bookmark
|
// Add/change the bookmark
|
||||||
|
@ -545,10 +545,8 @@ func Reload() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
parsed, _ := url.Parse(tabs[curTab].page.URL)
|
|
||||||
go func(t *tab) {
|
go func(t *tab) {
|
||||||
cache.RemovePage(tabs[curTab].page.URL)
|
cache.RemovePage(tabs[curTab].page.URL)
|
||||||
cache.RemoveFavicon(parsed.Host)
|
|
||||||
handleURL(t, t.page.URL, 0) // goURL is not used bc history shouldn't be added to
|
handleURL(t, t.page.URL, 0) // goURL is not used bc history shouldn't be added to
|
||||||
if t == tabs[curTab] {
|
if t == tabs[curTab] {
|
||||||
// Display the bottomBar state that handleURL set
|
// Display the bottomBar state that handleURL set
|
||||||
|
@ -1,15 +1,12 @@
|
|||||||
package display
|
package display
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
"mime"
|
"mime"
|
||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/makeworld-the-better-one/amfora/cache"
|
"github.com/makeworld-the-better-one/amfora/cache"
|
||||||
@ -21,7 +18,6 @@ import (
|
|||||||
"github.com/makeworld-the-better-one/amfora/subscriptions"
|
"github.com/makeworld-the-better-one/amfora/subscriptions"
|
||||||
"github.com/makeworld-the-better-one/amfora/webbrowser"
|
"github.com/makeworld-the-better-one/amfora/webbrowser"
|
||||||
"github.com/makeworld-the-better-one/go-gemini"
|
"github.com/makeworld-the-better-one/go-gemini"
|
||||||
"github.com/makeworld-the-better-one/go-isemoji"
|
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -90,81 +86,6 @@ func handleOther(u string) {
|
|||||||
App.Draw()
|
App.Draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleFavicon handles getting and displaying a favicon.
|
|
||||||
func handleFavicon(t *tab, host string) {
|
|
||||||
defer func() {
|
|
||||||
// Update display if needed
|
|
||||||
if t.page.Favicon != "" && isValidTab(t) {
|
|
||||||
browser.SetTabLabel(strconv.Itoa(tabNumber(t)), makeTabLabel(t.page.Favicon))
|
|
||||||
App.Draw()
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
if !viper.GetBool("a-general.emoji_favicons") {
|
|
||||||
// Not enabled
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if t.page.Favicon != "" {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if host == "" {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fav := cache.GetFavicon(host)
|
|
||||||
if fav == cache.KnownNoFavicon {
|
|
||||||
// It's been cached that this host doesn't have a favicon
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if fav != "" {
|
|
||||||
t.page.Favicon = fav
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// No favicon cached
|
|
||||||
res, err := client.Fetch("gemini://" + host + "/favicon.txt")
|
|
||||||
if err != nil {
|
|
||||||
if res != nil {
|
|
||||||
res.Body.Close()
|
|
||||||
}
|
|
||||||
cache.AddFavicon(host, cache.KnownNoFavicon)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer res.Body.Close()
|
|
||||||
|
|
||||||
if res.Status != 20 {
|
|
||||||
cache.AddFavicon(host, cache.KnownNoFavicon)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !strings.HasPrefix(res.Meta, "text/") && res.Meta != "" {
|
|
||||||
// Not a textual page
|
|
||||||
cache.AddFavicon(host, cache.KnownNoFavicon)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// It's a regular plain response
|
|
||||||
|
|
||||||
buf := new(bytes.Buffer)
|
|
||||||
_, err = io.CopyN(buf, res.Body, 29+2+1) // 29 is the max emoji length, +2 for CRLF, +1 so that the right size will EOF
|
|
||||||
if err == nil {
|
|
||||||
// Content was too large
|
|
||||||
cache.AddFavicon(host, cache.KnownNoFavicon)
|
|
||||||
return
|
|
||||||
} else if err != io.EOF {
|
|
||||||
// Some network reading error
|
|
||||||
// No favicon is NOT known, could be a temporary error
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// EOF, which is what we want.
|
|
||||||
emoji := strings.TrimRight(buf.String(), "\r\n")
|
|
||||||
if !isemoji.IsEmoji(emoji) {
|
|
||||||
cache.AddFavicon(host, cache.KnownNoFavicon)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// Valid favicon found
|
|
||||||
t.page.Favicon = emoji
|
|
||||||
cache.AddFavicon(host, emoji)
|
|
||||||
}
|
|
||||||
|
|
||||||
// handleAbout can be called to deal with any URLs that start with
|
// handleAbout can be called to deal with any URLs that start with
|
||||||
// 'about:'. It will display errors if the URL is not recognized,
|
// 'about:'. It will display errors if the URL is not recognized,
|
||||||
// but not display anything if an 'about:' URL is not passed.
|
// but not display anything if an 'about:' URL is not passed.
|
||||||
|
@ -118,11 +118,6 @@ func setPage(t *tab, p *structs.Page) {
|
|||||||
browser.SetTabLabel(strconv.Itoa(tabNum), makeTabLabel(strconv.Itoa(tabNum+1)))
|
browser.SetTabLabel(strconv.Itoa(tabNum), makeTabLabel(strconv.Itoa(tabNum+1)))
|
||||||
App.Draw()
|
App.Draw()
|
||||||
|
|
||||||
go func() {
|
|
||||||
parsed, _ := url.Parse(p.URL)
|
|
||||||
handleFavicon(t, parsed.Host)
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Setup display
|
// Setup display
|
||||||
App.SetFocus(t.view)
|
App.SetFocus(t.view)
|
||||||
|
|
||||||
|
2
go.mod
2
go.mod
@ -8,7 +8,6 @@ require (
|
|||||||
github.com/gdamore/tcell/v2 v2.1.1-0.20210125004847-19e17097d8fe
|
github.com/gdamore/tcell/v2 v2.1.1-0.20210125004847-19e17097d8fe
|
||||||
github.com/google/go-cmp v0.5.0 // indirect
|
github.com/google/go-cmp v0.5.0 // indirect
|
||||||
github.com/makeworld-the-better-one/go-gemini v0.11.0
|
github.com/makeworld-the-better-one/go-gemini v0.11.0
|
||||||
github.com/makeworld-the-better-one/go-isemoji v1.1.0
|
|
||||||
github.com/mitchellh/go-homedir v1.1.0
|
github.com/mitchellh/go-homedir v1.1.0
|
||||||
github.com/mitchellh/mapstructure v1.3.1 // indirect
|
github.com/mitchellh/mapstructure v1.3.1 // indirect
|
||||||
github.com/mmcdole/gofeed v1.1.0
|
github.com/mmcdole/gofeed v1.1.0
|
||||||
@ -25,6 +24,7 @@ require (
|
|||||||
golang.org/x/text v0.3.5
|
golang.org/x/text v0.3.5
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
|
||||||
gopkg.in/ini.v1 v1.62.0 // indirect
|
gopkg.in/ini.v1 v1.62.0 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/mmcdole/gofeed => github.com/makeworld-the-better-one/gofeed v1.1.1-0.20201123002655-c0c6354134fe
|
replace github.com/mmcdole/gofeed => github.com/makeworld-the-better-one/gofeed v1.1.1-0.20201123002655-c0c6354134fe
|
||||||
|
2
go.sum
2
go.sum
@ -136,8 +136,6 @@ github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzR
|
|||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/makeworld-the-better-one/go-gemini v0.11.0 h1:MNGiULJFvcqls9oCy40tE897hDeKvNmEK9i5kRucgQk=
|
github.com/makeworld-the-better-one/go-gemini v0.11.0 h1:MNGiULJFvcqls9oCy40tE897hDeKvNmEK9i5kRucgQk=
|
||||||
github.com/makeworld-the-better-one/go-gemini v0.11.0/go.mod h1:F+3x+R1xeYK90jMtBq+U+8Sh64r2dHleDZ/en3YgSmg=
|
github.com/makeworld-the-better-one/go-gemini v0.11.0/go.mod h1:F+3x+R1xeYK90jMtBq+U+8Sh64r2dHleDZ/en3YgSmg=
|
||||||
github.com/makeworld-the-better-one/go-isemoji v1.1.0 h1:wZBHOKB5zAIgaU2vaWnXFDDhatebB8TySrNVxjVV84g=
|
|
||||||
github.com/makeworld-the-better-one/go-isemoji v1.1.0/go.mod h1:FBjkPl9rr0G4vlZCc+Mr+QcnOfGCTbGWYW8/1sp06I0=
|
|
||||||
github.com/makeworld-the-better-one/gofeed v1.1.1-0.20201123002655-c0c6354134fe h1:i3b9Qy5z23DcXRnrsMYcM5s9Ng5VIidM1xZd+szuTsY=
|
github.com/makeworld-the-better-one/gofeed v1.1.1-0.20201123002655-c0c6354134fe h1:i3b9Qy5z23DcXRnrsMYcM5s9Ng5VIidM1xZd+szuTsY=
|
||||||
github.com/makeworld-the-better-one/gofeed v1.1.1-0.20201123002655-c0c6354134fe/go.mod h1:QQO3maftbOu+hiVOGOZDRLymqGQCos4zxbA4j89gMrE=
|
github.com/makeworld-the-better-one/gofeed v1.1.1-0.20201123002655-c0c6354134fe/go.mod h1:QQO3maftbOu+hiVOGOZDRLymqGQCos4zxbA4j89gMrE=
|
||||||
github.com/makeworld-the-better-one/progressbar/v3 v3.3.5-0.20201220005701-b036c4d38568 h1:fod4pD+rsU73WIUxl8Kpo35LDuOx0uxzlprBKbm84vw=
|
github.com/makeworld-the-better-one/progressbar/v3 v3.3.5-0.20201220005701-b036c4d38568 h1:fod4pD+rsU73WIUxl8Kpo35LDuOx0uxzlprBKbm84vw=
|
||||||
|
@ -32,7 +32,6 @@ type Page struct {
|
|||||||
Selected string // The current text or link selected
|
Selected string // The current text or link selected
|
||||||
SelectedID string // The cview region ID for the selected text/link
|
SelectedID string // The cview region ID for the selected text/link
|
||||||
Mode PageMode
|
Mode PageMode
|
||||||
Favicon string
|
|
||||||
MadeAt time.Time // When the page was made. Zero value indicates it should stay in cache forever.
|
MadeAt time.Time // When the page was made. Zero value indicates it should stay in cache forever.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user