From ff209c4ae3dd85e1809a69423f8ce0965b92c2d9 Mon Sep 17 00:00:00 2001 From: sloumdrone Date: Sat, 21 Sep 2019 22:02:20 -0700 Subject: [PATCH] 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 --- client.go | 23 +++++++++++++++-------- gemini/gemini.go | 13 +++++++------ url.go | 2 +- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/client.go b/client.go index 77c14ad..642d9f4 100644 --- a/client.go +++ b/client.go @@ -280,7 +280,7 @@ func (c *client) simpleCommand(action string) { c.BookMarks.ToggleOpen() c.Draw() case "SEARCH": - c.search("") + c.search("", "", "?") case "HELP", "?": go c.Visit(helplocation) default: @@ -300,7 +300,7 @@ func (c *client) doCommand(action string, values []string) { case "CHECK", "C": c.displayConfigValue(values[0]) case "SEARCH": - c.search(strings.Join(values, " ")) + c.search(strings.Join(values, " "), "", "") case "WRITE", "W": if values[0] == "." { 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 err error - if q == "" { + if query == "" { c.ClearMessage() c.ClearMessageLine() if c.Options["theme"] == "normal" { fmt.Printf("\033[7m%*.*s\r", c.Width, c.Width, "") } - fmt.Print("?") + fmt.Print(question) entry, err = cui.GetLine() c.ClearMessageLine() if err != nil { @@ -610,11 +610,14 @@ func (c *client) search(q string) { return } } else { - entry = q + entry = query } - u, err := MakeUrl(c.Options["searchengine"]) + if url == "" { + url = c.Options["searchengine"] + } + u, err := MakeUrl(url) 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() return } @@ -811,6 +814,8 @@ func (c *client) Visit(url string) { filename = "gopherfile" } c.saveFile(u, filename) + } else if u.Mime == "7" { + c.search("", u.Full, "?") } else { content, links, err := gopher.Visit(u.Mime, u.Host, u.Port, u.Resource) if err != nil { @@ -834,6 +839,8 @@ func (c *client) Visit(url string) { return } switch capsule.Status { + case 1: + c.search("", u.Full, capsule.Content) case 2: if capsule.MimeMaj == "text" { pg := MakePage(u, capsule.Content, capsule.Links) diff --git a/gemini/gemini.go b/gemini/gemini.go index 91755f4..7b6de31 100644 --- a/gemini/gemini.go +++ b/gemini/gemini.go @@ -137,8 +137,8 @@ func Visit(host, port, resource string) (Capsule, error) { switch capsule.Status { case 1: - // handle search - return capsule, fmt.Errorf("Gemini input not yet supported") + capsule.Content = header[1] + return capsule, nil case 2: mimeAndCharset := strings.Split(header[1], ";") meta = mimeAndCharset[0] @@ -149,7 +149,10 @@ func Visit(host, port, resource string) (Capsule, error) { capsule.MimeMaj = minMajMime[0] capsule.MimeMin = minMajMime[1] 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) } else { capsule.Content = body @@ -190,10 +193,8 @@ func parseGemini(b, rootUrl string) (string, []string) { 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) - } else if len(link) > 0 && strings.Index(link, "://") < 0 { - link = fmt.Sprintf("%s/%s", rootUrl, link) } links = append(links, link) linknum := fmt.Sprintf("[%d]", len(links)) diff --git a/url.go b/url.go index 5babdc8..faedbbb 100644 --- a/url.go +++ b/url.go @@ -97,8 +97,8 @@ func MakeUrl(u string) (Url, error) { out.DownloadOnly = true } } else { - out.Mime = "" out.Resource = fmt.Sprintf("%s%s", out.Mime, out.Resource) + out.Mime = "" } if out.Scheme == "http" || out.Scheme == "https" {