From 60cc3135ca711ccb2e704af385019d39dc886310 Mon Sep 17 00:00:00 2001 From: "diamondburned (Forefront)" Date: Thu, 18 Jun 2020 22:30:15 -0700 Subject: [PATCH] Added extra renderers --- go.mod | 4 +- go.sum | 10 ++++ internal/ui/rich/parser/parser.go | 77 ++++++++++++++++++++++++++++++- 3 files changed, 88 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c1575b8..3eb1d10 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,14 @@ module github.com/diamondburned/cchat-gtk go 1.14 replace github.com/gotk3/gotk3 => github.com/diamondburned/gotk3 v0.0.0-20200612012846-9df87fea4f6d + replace github.com/diamondburned/cchat-mock => ../cchat-mock/ + replace github.com/diamondburned/cchat-discord => ../cchat-discord/ require ( github.com/Xuanwo/go-locale v0.2.0 - github.com/diamondburned/cchat v0.0.28 + github.com/diamondburned/cchat v0.0.31 github.com/diamondburned/cchat-discord v0.0.0-00010101000000-000000000000 github.com/diamondburned/cchat-mock v0.0.0-20200615015702-8cac8b16378d github.com/diamondburned/imgutil v0.0.0-20200611215339-650ac7cfaf64 diff --git a/go.sum b/go.sum index 4552edc..8be770b 100644 --- a/go.sum +++ b/go.sum @@ -16,6 +16,12 @@ github.com/diamondburned/cchat v0.0.26 h1:QBt4d65uzUPJz3jF8b2pJ09Jz8LeBRyG2ol47F github.com/diamondburned/cchat v0.0.26/go.mod h1:+zXktogE45A0om4fT6B/z6Ii7FXNafjxsNspI0rlhbU= github.com/diamondburned/cchat v0.0.28 h1:+1VnltW0rl8/NZTUP+x89jVhi3YTTR+e6iLprZ7HcwM= github.com/diamondburned/cchat v0.0.28/go.mod h1:+zXktogE45A0om4fT6B/z6Ii7FXNafjxsNspI0rlhbU= +github.com/diamondburned/cchat v0.0.29 h1:fEfmv2hYO7sK4wH9GAqf400XGJg6R4DBI8xvsljn5vk= +github.com/diamondburned/cchat v0.0.29/go.mod h1:+zXktogE45A0om4fT6B/z6Ii7FXNafjxsNspI0rlhbU= +github.com/diamondburned/cchat v0.0.30 h1:rMACN56vBNG8L9VzY11kA0sA/mJO42JrNdUUnINZWto= +github.com/diamondburned/cchat v0.0.30/go.mod h1:+zXktogE45A0om4fT6B/z6Ii7FXNafjxsNspI0rlhbU= +github.com/diamondburned/cchat v0.0.31 h1:yUgrh5xbGX0R55glyxYtVewIDL2eXLJ+okIEfVaVoFk= +github.com/diamondburned/cchat v0.0.31/go.mod h1:+zXktogE45A0om4fT6B/z6Ii7FXNafjxsNspI0rlhbU= github.com/diamondburned/cchat-mock v0.0.0-20200613003444-b36f8f47debe h1:OoTLxpryxB9iQyu3bjw5N9N/3Bvu6FwklJ85X9erCAY= github.com/diamondburned/cchat-mock v0.0.0-20200613003444-b36f8f47debe/go.mod h1:vitBma+rd/ah+ujQsp6lPm/AfS2KtLKEh+Owxbv5BQM= github.com/diamondburned/cchat-mock v0.0.0-20200613233949-1e7651c8dd84 h1:NSuksZ9HiLiau93qAz4yNba6Xd7ExOFc956dumONDQ0= @@ -28,10 +34,13 @@ github.com/diamondburned/imgutil v0.0.0-20200611215339-650ac7cfaf64 h1:/ykUYHuYy github.com/diamondburned/imgutil v0.0.0-20200611215339-650ac7cfaf64/go.mod h1:kBQKaukR/LyCfhED99/T4/XxUMDNEEzf1Fx6vreD3RQ= github.com/diamondburned/ningen v0.0.0-20200610212436-159f7105a2be h1:mUw8X/YzJGFSdL8y3Q/XqyzqPyIMNVSDyZGOP3JXgJA= github.com/diamondburned/ningen v0.0.0-20200610212436-159f7105a2be/go.mod h1:B2hq2B4va1MlnMmXuv9vXmyu9gscxJLmwrmcSB1Les8= +github.com/diamondburned/ningen v0.0.0-20200618230530-16d4d7fbc521 h1:hp4vdK6mARWbtU7A9UAz9zr7qe0z7ppoh9RGXymWDRE= +github.com/diamondburned/ningen v0.0.0-20200618230530-16d4d7fbc521/go.mod h1:B2hq2B4va1MlnMmXuv9vXmyu9gscxJLmwrmcSB1Les8= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-test/deep v1.0.6/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/godbus/dbus v4.1.0+incompatible h1:WqqLRTsQic3apZUK9qC5sGNfXthmPXzUZ7nQPrNITa4= @@ -75,6 +84,7 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/twmb/murmur3 v1.1.3 h1:D83U0XYKcHRYwYIpBKf3Pks91Z0Byda/9SJ8B6EMRcA= github.com/twmb/murmur3 v1.1.3/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= +github.com/yuin/goldmark v1.1.30 h1:j4d4Lw3zqZelDhBksEo3BnWg9xhXRQGJPPSL6OApZjI= github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zalando/go-keyring v0.0.0-20200121091418-667557018717 h1:3M/uUZajYn/082wzUajekePxpUAZhMTfXvI9R+26SJ0= github.com/zalando/go-keyring v0.0.0-20200121091418-667557018717/go.mod h1:RaxNwUITJaHVdQ0VC7pELPZ3tOWn13nr0gZMZEhpVU0= diff --git a/internal/ui/rich/parser/parser.go b/internal/ui/rich/parser/parser.go index f28117b..3d7a493 100644 --- a/internal/ui/rich/parser/parser.go +++ b/internal/ui/rich/parser/parser.go @@ -5,6 +5,7 @@ import ( "fmt" "html" "sort" + "strings" "github.com/diamondburned/cchat/text" ) @@ -21,6 +22,24 @@ func newAttrAppendedMap() attrAppendMap { } } +func (a *attrAppendMap) span(start, end int, attr string) { + a.add(start, ``) + a.add(end, "") +} + +func (a *attrAppendMap) pair(start, end int, open, close string) { + a.add(start, open) + a.add(end, close) +} + +func (a *attrAppendMap) addf(ind int, f string, argv ...interface{}) { + a.add(ind, fmt.Sprintf(f, argv...)) +} + +func (a *attrAppendMap) pad(ind int) { + a.add(ind, "\n") +} + func (a *attrAppendMap) add(ind int, attr string) { if _, ok := a.appended[ind]; ok { a.appended[ind] += attr @@ -43,6 +62,34 @@ func (a *attrAppendMap) finalize(strlen int) []int { return a.indices } +func markupAttr(attr text.Attribute) string { + // meme fast path + if attr == 0 { + return "" + } + + var attrs = make([]string, 0, 1) + if attr.Has(text.AttrBold) { + attrs = append(attrs, `weight="bold"`) + } + if attr.Has(text.AttrItalics) { + attrs = append(attrs, `style="italic"`) + } + if attr.Has(text.AttrUnderline) { + attrs = append(attrs, `underline="single"`) + } + if attr.Has(text.AttrStrikethrough) { + attrs = append(attrs, `strikethrough="true"`) + } + if attr.Has(text.AttrSpoiler) { + attrs = append(attrs, `foreground="#808080"`) // no fancy click here + } + if attr.Has(text.AttrMonospace) { + attrs = append(attrs, `font_family="monospace"`) + } + return strings.Join(attrs, " ") +} + func RenderMarkup(content text.Rich) string { // Fast path. if len(content.Segments) == 0 { @@ -67,9 +114,31 @@ func RenderMarkup(content text.Rich) string { start, end := segment.Bounds() switch segment := segment.(type) { + case text.Linker: + appended.addf(start, ``, html.EscapeString(segment.Link())) + appended.add(end, "") + + case text.Imager: + // Ends don't matter with images. + appended.addf(start, + `%s`, + html.EscapeString(segment.Image()), html.EscapeString(segment.ImageText()), + ) + case text.Colorer: - appended.add(start, fmt.Sprintf("", segment.Color())) - appended.add(end, "") + appended.span(start, end, fmt.Sprintf(`color="#%06X"`, segment.Color())) + + case text.Attributor: + appended.span(start, end, markupAttr(segment.Attribute())) + + case text.Codeblocker: + // Treat codeblocks the same as a monospace tag. + // TODO: add highlighting + appended.span(start, end, `font_family="monospace"`) + + case text.Quoteblocker: + // TODO: pls. + appended.span(start, end, `color="#789922"`) } } @@ -86,3 +155,7 @@ func RenderMarkup(content text.Rich) string { return buf.String() } + +func span(key, value string) string { + return "" +}