diff --git a/bombadillo.1 b/bombadillo.1 index ef3e479..bd5367e 100644 --- a/bombadillo.1 +++ b/bombadillo.1 @@ -232,6 +232,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 5322c08..cfd2e41 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 e13cb59..05bc7c3 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 + + + \\ //--------------------------------------------------\\ @@ -339,16 +341,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") @@ -370,6 +379,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 53918f7..7216d0c 100644 --- a/main.go +++ b/main.go @@ -30,7 +30,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 @@ -66,6 +66,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) @@ -84,7 +85,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 @@ -121,6 +122,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] }