diff --git a/bombadillo.1 b/bombadillo.1 index b337a8e..c8b19a0 100644 --- a/bombadillo.1 +++ b/bombadillo.1 @@ -233,6 +233,10 @@ defaultscheme The scheme that should be used when no scheme is present in a given URL. \fIgopher\fP, \fIgemini\fP, \fIhttp\fP, and \fIhttps\fP are valid values. .TP .B +geminiblocks +Determines how to treat preformatted text blocks in text/gemini documents. \fIblock\fP will show the contents of the block, \fIalt\fP will show any available alt text for the block, \fIboth\fP will show both the content and the alt text, and \fIneither\fP will show neither. Unlike other settings, a change to this value will require a fresh page load to see the change. +.TP +.B homeurl The url that \fBbombadillo\fP navigates to when the program loads or when the \fIhome\fP or \fIh\fP LINE COMMAND is issued. This should be a valid url. If a scheme/protocol is not included, gopher will be assumed. .TP diff --git a/client.go b/client.go index d21c39e..9c13b45 100644 --- a/client.go +++ b/client.go @@ -470,6 +470,8 @@ func (c *client) doCommandAs(action string, values []string) { c.Options[values[0]] = lowerCaseOpt(values[0], val) if values[0] == "tlskey" || values[0] == "tlscertificate" { c.Certs.LoadCertificate(c.Options["tlscertificate"], c.Options["tlskey"]) + } else if values[0] == "geminiblocks" { + gemini.BlockBehavior = c.Options[values[0]] } else if values[0] == "configlocation" { c.SetMessage("Cannot set READ ONLY setting 'configlocation'", true) c.DrawMessage() diff --git a/defaults.go b/defaults.go index c4ca227..fc47a64 100644 --- a/defaults.go +++ b/defaults.go @@ -47,6 +47,7 @@ var defaultOptions = map[string]string{ "configlocation": xdgConfigPath(), "defaultscheme": "gopher", // "gopher", "gemini", "http", "https" + "geminiblocks": "block", // "block", "alt", "neither", "both" "homeurl": "gopher://bombadillo.colorfield.space:70/1/user-guide.map", "savelocation": homePath(), "searchengine": "gopher://gopher.floodgap.com:70/7/v2/vs", diff --git a/gemini/gemini.go b/gemini/gemini.go index a721152..98cf059 100644 --- a/gemini/gemini.go +++ b/gemini/gemini.go @@ -24,6 +24,8 @@ type TofuDigest struct { ClientCert tls.Certificate } +var BlockBehavior = "block" + //------------------------------------------------\\ // + + + R E C E I V E R S + + + \\ //--------------------------------------------------\\ @@ -367,16 +369,23 @@ func parseGemini(b, rootUrl, currentUrl string) (string, []string) { splitContent := strings.Split(b, "\n") links := make([]string, 0, 10) + inPreBlock := false + outputIndex := 0 for i, ln := range splitContent { splitContent[i] = strings.Trim(ln, "\r\n") - if ln == "```" { - // By continuing we create a variance between i and outputIndex - // the other branches here will write to the outputIndex rather - // than i, thus removing these lines while itterating without - // needing mroe allocations. - continue - } else if len([]rune(ln)) > 3 && ln[:2] == "=>" { + isPreBlockDeclaration := strings.HasPrefix(ln, "```") + if isPreBlockDeclaration && !inPreBlock && (BlockBehavior == "both" || BlockBehavior == "alt") { + inPreBlock = !inPreBlock + alt := strings.TrimSpace(ln) + if len(alt) > 3 { + alt = strings.TrimSpace(alt[3:]) + splitContent[outputIndex] = fmt.Sprintf("[ %s ]", alt) + outputIndex++ + } + } else if isPreBlockDeclaration { + inPreBlock = !inPreBlock + } else if len([]rune(ln)) > 3 && ln[:2] == "=>" && !inPreBlock { var link, decorator string subLn := strings.Trim(ln[2:], "\r\n\t \a") splitPoint := strings.IndexAny(subLn, " \t") @@ -398,6 +407,9 @@ func parseGemini(b, rootUrl, currentUrl string) (string, []string) { splitContent[outputIndex] = fmt.Sprintf("%-5s %s", linknum, decorator) outputIndex++ } else { + if inPreBlock && (BlockBehavior == "alt" || BlockBehavior == "neither") { + continue + } splitContent[outputIndex] = ln outputIndex++ } diff --git a/main.go b/main.go index 1266eeb..28fcf36 100644 --- a/main.go +++ b/main.go @@ -32,7 +32,7 @@ import ( "tildegit.org/sloum/bombadillo/config" "tildegit.org/sloum/bombadillo/cui" - _ "tildegit.org/sloum/bombadillo/gemini" + "tildegit.org/sloum/bombadillo/gemini" ) var version string @@ -68,6 +68,7 @@ func validateOpt(opt, val string) bool { "theme": []string{"normal", "inverse", "color"}, "defaultscheme": []string{"gopher", "gemini", "http", "https"}, "showimages": []string{"true", "false"}, + "geminiblocks": []string{"block", "neither", "alt", "both"}, } opt = strings.ToLower(opt) @@ -86,7 +87,7 @@ func validateOpt(opt, val string) bool { func lowerCaseOpt(opt, val string) string { switch opt { - case "webmode", "theme", "defaultscheme", "showimages": + case "webmode", "theme", "defaultscheme", "showimages", "geminiblocks": return strings.ToLower(val) default: return val @@ -123,6 +124,9 @@ func loadConfig() { if _, ok := bombadillo.Options[lowerkey]; ok { if validateOpt(lowerkey, v.Value) { bombadillo.Options[lowerkey] = v.Value + if lowerkey == "geminiblocks" { + gemini.BlockBehavior = v.Value + } } else { bombadillo.Options[lowerkey] = defaultOptions[lowerkey] }