mirror of
https://github.com/makeworld-the-better-one/amfora.git
synced 2024-09-11 14:55:51 +03:00
🚧 Initial work on supporting many charsets
This commit is contained in:
parent
41075c8c41
commit
0d5c38e060
1
go.mod
1
go.mod
@ -16,6 +16,7 @@ require (
|
||||
github.com/spf13/viper v1.7.0
|
||||
github.com/stretchr/testify v1.6.0
|
||||
gitlab.com/tslocum/cview v1.4.8-0.20200614211415-f477be8ba472
|
||||
golang.org/x/text v0.3.3
|
||||
gopkg.in/ini.v1 v1.57.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.0-20200603094226-e3079894b1e8 // indirect
|
||||
)
|
||||
|
2
go.sum
2
go.sum
@ -290,6 +290,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
|
@ -17,6 +17,7 @@ import (
|
||||
"github.com/makeworld-the-better-one/go-gemini"
|
||||
"github.com/spf13/viper"
|
||||
"gitlab.com/tslocum/cview"
|
||||
"golang.org/x/text/encoding/ianaindex"
|
||||
)
|
||||
|
||||
// CanDisplay returns true if the response is supported by Amfora
|
||||
@ -31,15 +32,16 @@ func CanDisplay(res *gemini.Response) bool {
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if strings.ToLower(params["charset"]) != "utf-8" && strings.ToLower(params["charset"]) != "us-ascii" && params["charset"] != "" {
|
||||
// Amfora doesn't support other charsets
|
||||
return false
|
||||
}
|
||||
if mediatype != "text/gemini" && mediatype != "text/plain" {
|
||||
// Amfora doesn't support other filetypes
|
||||
return false
|
||||
}
|
||||
return true
|
||||
// Check if there is an encoding for the charset already
|
||||
if params["charset"] == "" {
|
||||
return true // Means UTF-8
|
||||
}
|
||||
_, err = ianaindex.MIME.Encoding(params["charset"]) // Lowercasing is done inside
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// convertRegularGemini converts non-preformatted blocks of text/gemini
|
||||
@ -207,23 +209,35 @@ func MakePage(url string, res *gemini.Response) (*structs.Page, error) {
|
||||
return nil, errors.New("not valid content for a Page")
|
||||
}
|
||||
|
||||
content, err := ioutil.ReadAll(res.Body) // TODO: Don't use all memory on large pages
|
||||
rawText, err := ioutil.ReadAll(res.Body) // TODO: Don't use all memory on large pages
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
res.Body.Close()
|
||||
|
||||
mediatype, _, _ := mime.ParseMediaType(res.Meta)
|
||||
mediatype, params, _ := mime.ParseMediaType(res.Meta)
|
||||
|
||||
// Convert content first
|
||||
var utfText string
|
||||
if params["charset"] == "" || strings.ToLower(params["charset"]) == "us-ascii" {
|
||||
utfText = string(rawText)
|
||||
} else {
|
||||
encoding, _ := ianaindex.MIME.Encoding(params["charset"])
|
||||
utfText, err = encoding.NewDecoder().String(string(rawText))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if mediatype == "text/plain" {
|
||||
return &structs.Page{
|
||||
Url: url,
|
||||
Content: string(content),
|
||||
Content: utfText,
|
||||
Links: []string{}, // Plaintext has no links
|
||||
}, nil
|
||||
}
|
||||
if mediatype == "text/gemini" {
|
||||
rendered, links := RenderGemini(string(content))
|
||||
rendered, links := RenderGemini(utfText)
|
||||
return &structs.Page{
|
||||
Url: url,
|
||||
Content: rendered,
|
||||
|
Loading…
Reference in New Issue
Block a user