Dont make urls part of styling, instead have a dedicated UrlFunc API

Since urls can potentially change a lot, caching them makes no sense
This commit is contained in:
Kovid Goyal
2022-08-28 10:12:35 +05:30
parent be22f49012
commit 4a4500d56b
3 changed files with 26 additions and 7 deletions

View File

@@ -28,3 +28,24 @@ func (self *Context) SprintFunc(spec string) func(args ...interface{}) string {
return b.String()
}
}
func (self *Context) UrlFunc(spec string) func(string, string) string {
p := prefix_for_spec(spec)
s := suffix_for_spec(spec)
return func(url string, text string) string {
if !self.AllowEscapeCodes {
return text
}
uc := url_code{url: url}
up, us := uc.prefix(), uc.suffix()
b := strings.Builder{}
b.Grow(len(p) + len(up) + len(text) + len(s) + len(us))
b.WriteString(p)
b.WriteString(up)
b.WriteString(text)
b.WriteString(us)
b.WriteString(s)
return b.String()
}
}

View File

@@ -298,7 +298,6 @@ func (self *sgr_code) update() {
func parse_spec(spec string) []escape_code {
ans := make([]escape_code, 0, 1)
sgr := sgr_code{}
url := url_code{}
sparts, _ := shlex.Split(spec)
for _, p := range sparts {
parts := strings.SplitN(p, "=", 2)
@@ -326,17 +325,12 @@ func parse_spec(spec string) []escape_code {
sgr.underline.from_string(val)
case "ucol", "underline_color", "uc":
sgr.uc.from_string(val)
case "url":
url.url = val
}
}
sgr.update()
if !sgr.is_empty() {
ans = append(ans, &sgr)
}
if !url.is_empty() {
ans = append(ans, &url)
}
return ans
}

View File

@@ -44,5 +44,9 @@ func TestANSIStyleSprint(t *testing.T) {
test("uc=123", "\x1b[58:5:123m", "\x1b[59m")
test("uc=1", "\x1b[58:5:1m", "\x1b[59m")
test("url=123", "\x1b]8;;123\x1b\\", "\x1b]8;;\x1b\\")
actual := ctx.UrlFunc("u=curly uc=cyan")("http://moo.com", "___")
expected := "\x1b[4:3;58:5:6m\x1b]8;;http://moo.com\x1b\\___\x1b]8;;\x1b\\\x1b[4:0;59m"
if actual != expected {
t.Fatalf("Formatting URL failed expected != actual: %#v != %#v", expected, actual)
}
}