Adds status 1 support to gemini, fixes bug in url where gophertypes were getting thrown out of nongopher addresses, and fixes up relative linking in gemini maps

This commit is contained in:
sloumdrone 2019-09-21 22:02:20 -07:00
parent 2f14011a48
commit ff209c4ae3
3 changed files with 23 additions and 15 deletions

View File

@ -280,7 +280,7 @@ func (c *client) simpleCommand(action string) {
c.BookMarks.ToggleOpen() c.BookMarks.ToggleOpen()
c.Draw() c.Draw()
case "SEARCH": case "SEARCH":
c.search("") c.search("", "", "?")
case "HELP", "?": case "HELP", "?":
go c.Visit(helplocation) go c.Visit(helplocation)
default: default:
@ -300,7 +300,7 @@ func (c *client) doCommand(action string, values []string) {
case "CHECK", "C": case "CHECK", "C":
c.displayConfigValue(values[0]) c.displayConfigValue(values[0])
case "SEARCH": case "SEARCH":
c.search(strings.Join(values, " ")) c.search(strings.Join(values, " "), "", "")
case "WRITE", "W": case "WRITE", "W":
if values[0] == "." { if values[0] == "." {
values[0] = c.PageState.History[c.PageState.Position].Location.Full values[0] = c.PageState.History[c.PageState.Position].Location.Full
@ -590,16 +590,16 @@ func (c *client) doLinkCommand(action, target string) {
} }
func (c *client) search(q string) { func (c *client) search(query, url, question string) {
var entry string var entry string
var err error var err error
if q == "" { if query == "" {
c.ClearMessage() c.ClearMessage()
c.ClearMessageLine() c.ClearMessageLine()
if c.Options["theme"] == "normal" { if c.Options["theme"] == "normal" {
fmt.Printf("\033[7m%*.*s\r", c.Width, c.Width, "") fmt.Printf("\033[7m%*.*s\r", c.Width, c.Width, "")
} }
fmt.Print("?") fmt.Print(question)
entry, err = cui.GetLine() entry, err = cui.GetLine()
c.ClearMessageLine() c.ClearMessageLine()
if err != nil { if err != nil {
@ -610,11 +610,14 @@ func (c *client) search(q string) {
return return
} }
} else { } else {
entry = q entry = query
} }
u, err := MakeUrl(c.Options["searchengine"]) if url == "" {
url = c.Options["searchengine"]
}
u, err := MakeUrl(url)
if err != nil { if err != nil {
c.SetMessage("'searchengine' is not set to a valid url", true) c.SetMessage("The search url is not a valid url", true)
c.DrawMessage() c.DrawMessage()
return return
} }
@ -811,6 +814,8 @@ func (c *client) Visit(url string) {
filename = "gopherfile" filename = "gopherfile"
} }
c.saveFile(u, filename) c.saveFile(u, filename)
} else if u.Mime == "7" {
c.search("", u.Full, "?")
} else { } else {
content, links, err := gopher.Visit(u.Mime, u.Host, u.Port, u.Resource) content, links, err := gopher.Visit(u.Mime, u.Host, u.Port, u.Resource)
if err != nil { if err != nil {
@ -834,6 +839,8 @@ func (c *client) Visit(url string) {
return return
} }
switch capsule.Status { switch capsule.Status {
case 1:
c.search("", u.Full, capsule.Content)
case 2: case 2:
if capsule.MimeMaj == "text" { if capsule.MimeMaj == "text" {
pg := MakePage(u, capsule.Content, capsule.Links) pg := MakePage(u, capsule.Content, capsule.Links)

View File

@ -137,8 +137,8 @@ func Visit(host, port, resource string) (Capsule, error) {
switch capsule.Status { switch capsule.Status {
case 1: case 1:
// handle search capsule.Content = header[1]
return capsule, fmt.Errorf("Gemini input not yet supported") return capsule, nil
case 2: case 2:
mimeAndCharset := strings.Split(header[1], ";") mimeAndCharset := strings.Split(header[1], ";")
meta = mimeAndCharset[0] meta = mimeAndCharset[0]
@ -149,7 +149,10 @@ func Visit(host, port, resource string) (Capsule, error) {
capsule.MimeMaj = minMajMime[0] capsule.MimeMaj = minMajMime[0]
capsule.MimeMin = minMajMime[1] capsule.MimeMin = minMajMime[1]
if capsule.MimeMaj == "text" && capsule.MimeMin == "gemini" { if capsule.MimeMaj == "text" && capsule.MimeMin == "gemini" {
rootUrl := fmt.Sprintf("gemini://%s:%s", host, port) if len(resource) > 0 && resource[0] != '/' {
resource = fmt.Sprintf("/%s", resource)
}
rootUrl := fmt.Sprintf("gemini://%s:%s%s", host, port, resource)
capsule.Content, capsule.Links = parseGemini(body, rootUrl) capsule.Content, capsule.Links = parseGemini(body, rootUrl)
} else { } else {
capsule.Content = body capsule.Content = body
@ -190,10 +193,8 @@ func parseGemini(b, rootUrl string) (string, []string) {
decorator = strings.Trim(subLn[splitPoint:], "\t\n\r \a") decorator = strings.Trim(subLn[splitPoint:], "\t\n\r \a")
} }
if len(link) > 0 && link[0] == '/' { if strings.Index(link, "://") < 0 {
link = fmt.Sprintf("%s%s", rootUrl, link) link = fmt.Sprintf("%s%s", rootUrl, link)
} else if len(link) > 0 && strings.Index(link, "://") < 0 {
link = fmt.Sprintf("%s/%s", rootUrl, link)
} }
links = append(links, link) links = append(links, link)
linknum := fmt.Sprintf("[%d]", len(links)) linknum := fmt.Sprintf("[%d]", len(links))

2
url.go
View File

@ -97,8 +97,8 @@ func MakeUrl(u string) (Url, error) {
out.DownloadOnly = true out.DownloadOnly = true
} }
} else { } else {
out.Mime = ""
out.Resource = fmt.Sprintf("%s%s", out.Mime, out.Resource) out.Resource = fmt.Sprintf("%s%s", out.Mime, out.Resource)
out.Mime = ""
} }
if out.Scheme == "http" || out.Scheme == "https" { if out.Scheme == "http" || out.Scheme == "https" {